• python爬虫(2)


    目录

    五,POST请求

    六,爬取Ajax刷新技术的新增的网页内容

    七,静态网页和动态网页的区别

    八,请求SSL证书验证

    九,openner的使用(设置代理及cookie处理)

    1,opener的一般创建方法

    2,代理proxy的使用

    1,代理的分类

    2,使用代理proxy的一般代码写法

    3,cookie的使用

    1,cookie的一般使用方法

    2,cookie控制器的写法

    3,生成cookie文件并保存到本地


    五,POST请求

            post请求用于向服务器发送数据,这些数据被隐藏在请求报文的报文体当中,十分的安全,而不像GET方式将参数暴露在url当中。

            使用Request对象对相关数据进行封装从而得到一个请求报文。将需要发送到服务器的数据赋给在Request初始化方法里面的data参数即可,data参数是一个字典。

            html当中的

    标签存在一个action的参数,他的值一般是是一个服务器脚本的地址,当提交表单时,所有数据就会发送的到服务器并被这个脚本进行处理。这种向服务器提交数据的请求方式一般是post。

            下面是一个post请求的例子。一旦Request对象中添加了data参数,那么就会默认使用post的方式请求。

    1. from urllib.parse import urlencode
    2. from fake_useragent import UserAgent
    3. url = 'https://www.21wecan.com/rcwjs/searchlist.jsp'
    4. headers = {
    5. 'User-Agent': UserAgent().chrome,
    6. }
    7. args = {
    8. 'searchword': '人才'
    9. }
    10. req = Request(url=url, headers=headers, data=urlencode(args).encode())
    11. resp = urlopen(req)
    12. print(resp.read().decode('utf-8'))

    六,爬取Ajax刷新技术的新增的网页内容

            Ajax是一门无刷新更新网页的技术,他是浏览器的一个组件,在后台通过http请求得到新的html代码插入到dom树中,从而更新网页。

            有些网页使用Ajax来更新网页,爬虫爬取的时候也需要对Ajax这部分内容进行爬取。

            由于Ajax使用的是xmlrequest协议,我们需要在抓包软件或者浏览器的抓包功能中人工提取Ajax所请求的网络地址。

            下面的代码使用爬虫请求某网站的Ajax服务器地址,服务器返回了一个JSON文本文件,再将这个文本文件(响应报文的内容)打印。需要对这个文本文件进行格式化显示才会显得美观。

    1. from urllib.request import Request, urlopen
    2. from urllib.parse import urlencode
    3. from fake_useragent import UserAgent
    4. headers = {
    5. 'User-Agent': UserAgent().chrome,
    6. }
    7. args = {
    8. 'pageNo': 4,
    9. 'pageSize': 50
    10. }
    11. url = 'https://www.hupu.com/home/v1/news?' + urlencode(args)
    12. print(urlencode(args), '\n', url)
    13. req = Request(url=url, headers=headers, ) # data=urlencode(args).encode()
    14. resp = urlopen(req)
    15. print(resp.read().decode('utf-8'))

    七,静态网页和动态网页的区别

            静态网页:可以从url地址直接得到我们想要的数据的网页。

            动态网页:使用了Ajax这种暗地里获取数据的网页,数据url不显示在浏览器网页地址框的网页。

            为了获取Ajax这种隐藏请求方式和地址的技术,需要使用抓包工具抓取Ajax访问的url地址。xhr一般是Ajax请求的类型。

    八,请求SSL证书验证

            https是http协议的加密版,实现加密的核心就所证书,通过证书生成一系列的秘钥来实现数据在传输过程中处于加密状态,到达浏览器或者服务器之后再进行解密。

            当需要爬取https开头的网址时,可能会遇到证书过期,不匹配等问题。 

    1. import ssl
    2. import urllib.request
    3. # 忽略SSL安全认证
    4. context = ssl._create_unverified_context() # 添加到context参教里
    5. response = urllib.request.urlopen(url='https://www.baidu.com/', context=context)
    6. print(response.getcode())

    九,openner的使用(设置代理及cookie处理)

            由于各种反爬虫技术层出不穷,各种反反爬技术也应运而生,其中一种方法就是使用代理,本质上就是隔一段时间换一个ip地址。或者租几台云电脑,在每台电脑上同时运行爬虫程序。

    1,opener的一般创建方法

    1. from urllib.request import Request, urlopen,build_opener,HTTPHandler
    2. from fake_useragent import UserAgent
    3. url='http://httpbin.org/get'
    4. headers = {
    5. 'User-Agent': UserAgent().chrome,
    6. }
    7. req = Request(url=url, headers=headers, )
    8. opener = build_opener(HTTPHandler(debuglevel=1))
    9. # 传入不同的控制器,从而创建出不同的打开器,从而改变http请求的报文,控制器里面带有参数
    10. resp = opener.open(req)
    11. print(resp.read().decode('utf-8'))

    2,代理proxy的使用

    1,代理的分类

            推荐花钱使用高匿代理,被爬取的网址既不知道代理服务器的ip也不知道当前主机的ip。

    2,使用代理proxy的一般代码写法

    1. from urllib.request import Request, build_opener, ProxyHandler
    2. from fake_useragent import UserAgent
    3. url = 'http://httpbin.org/get'
    4. headers = {
    5. 'User-Agent': UserAgent().chrome,
    6. }
    7. req = Request(url=url, headers=headers, )
    8. # 格式如下:ProxyHandler({'type':'username:pwd@ip_addr:port'}),需要免费的ip代理在这个网址:https://www.zdaye.com/dayProxy.html
    9. proxy_handler = ProxyHandler({'http': '112.25.236.167:9091'})
    10. opener = build_opener(proxy_handler)
    11. resp = opener.open(req)
    12. print(resp.read().decode('utf-8'))

    3,cookie的使用

            某些网站需要用户登录之后才能进行操作,但是我们并不需要每次打开网页都输入账号密码进行登录,而是会自动登录。这就是cookie的作用,cookie是服务器存在浏览器本地的一个加密文件,里面储存有各种敏感信息,如密码等。

            响应报文头的参数SET-Cookie记录了从服务器发来的需要存在本地的cookie数据。

            请求报文头参数Cookie会将本地cookie中的数据以post形式发送到服务器。

            使用urllib来操作cookie,从而使我们的爬虫顺利爬到数据。

            下图就是cookie请求头。

    1,cookie的一般使用方法

            当已经访问过某网页并已经生成了cookie,下一次再访问的时候就可以直接添加cookie请求头,从而实现网页自动登录。

    1. from urllib.request import Request, urlopen,build_opener,HTTPHandler
    2. from fake_useragent import UserAgent
    3. url='http://httpbin.org/get'
    4. #在headers中添加cookie请求头即可
    5. headers = {
    6. 'User-Agent': UserAgent().chrome,
    7. 'Cookie':'自己从浏览器抓包工具复制过来'
    8. }
    9. req = Request(url=url, headers=headers, )
    10. opener = build_opener(HTTPHandler(debuglevel=1))
    11. resp = opener.open(req)
    12. print(resp.read().decode('utf-8'))

    2,cookie控制器的写法

            创建一个cookie控制器之后,再访问这个网页就会主动读取上一次访问时保存在cookie中的各种信息(临时会话cookie保存在内存中而不在硬盘中)。cookie参数详解

    1. from urllib.request import Request, build_opener,HTTPCookieProcessor
    2. from fake_useragent import UserAgent
    3. url='https://www.nvidia.cn/'
    4. headers = {
    5. 'User-Agent': UserAgent().chrome,
    6. }
    7. req = Request(url=url, headers=headers, )
    8. # 创建一个能够保存cookie的handler,传入build_opener()方法,最终返回一个打开器
    9. # HTTPCookieProcessor()方法需要一个cookie对象作为参数,然后返回一个控制器,
    10. opener = build_opener(HTTPCookieProcessor())
    11. resp = opener.open(req)
    12. print(resp.read().decode('utf-8'))

    3,生成cookie文件并保存到本地

            当一个网页,比如b站,cookie会保存我们的登录信息,这个cookie保存在本地的硬盘中。当我们使用爬虫而不是浏览器访问b站时,爬虫因为没有cookie而无法登录,这个时候就可以把b站保存在硬盘上的cookie文件拿来给爬虫使用,实现爬虫也能自动登录到b站。

    1. from urllib.request import Request, build_opener, HTTPCookieProcessor
    2. from fake_useragent import UserAgent
    3. from http.cookiejar import MozillaCookieJar
    4. url = 'https://www.nvidia.cn/'
    5. headers = {
    6. 'User-Agent': UserAgent().chrome,
    7. }
    8. cookie = MozillaCookieJar() # 创建一个cookie对象,他会自动记录各种cookie信息
    9. req = Request(url=url, headers=headers, )
    10. opener = build_opener(HTTPCookieProcessor(cookiejar=cookie))
    11. resp = opener.open(req)
    12. cookie.save('cookie.txt', ignore_discard=1, ignore_expires=1) # 保存cookie对象
    13. cookie.load('cookie.txt', ignore_discard=1, ignore_expires=1) # 加载cookie文件
    14. print(resp.read().decode('utf-8'))
  • 相关阅读:
    思腾云计算
    Java基础(三)
    力扣 095. 最长公共子序列(C语言+动态规划)
    学习 C++ 到底有什么好处?
    大兴机场引入明道云,打造敏态应用开发平台
    vite 入门到精通
    vulnhub靶机DC8
    构建汛期智慧水利新生态:EasyCVR视频汇聚监控综合管理方案解析
    matlab simulink响应谱计算
    Linux常用命令
  • 原文地址:https://blog.csdn.net/weixin_44992737/article/details/125997290