目录
五,POST请求
六,爬取Ajax刷新技术的新增的网页内容
七,静态网页和动态网页的区别
八,请求SSL证书验证
九,openner的使用(设置代理及cookie处理)
1,opener的一般创建方法
2,代理proxy的使用
1,代理的分类
2,使用代理proxy的一般代码写法
3,cookie的使用
1,cookie的一般使用方法
2,cookie控制器的写法
3,生成cookie文件并保存到本地
post请求用于向服务器发送数据,这些数据被隐藏在请求报文的报文体当中,十分的安全,而不像GET方式将参数暴露在url当中。
使用Request对象对相关数据进行封装从而得到一个请求报文。将需要发送到服务器的数据赋给在Request初始化方法里面的data参数即可,data参数是一个字典。
html当中的
下面是一个post请求的例子。一旦Request对象中添加了data参数,那么就会默认使用post的方式请求。
from urllib.parse import urlencodefrom fake_useragent import UserAgent url = 'https://www.21wecan.com/rcwjs/searchlist.jsp'headers = { 'User-Agent': UserAgent().chrome,}args = { 'searchword': '人才'}req = Request(url=url, headers=headers, data=urlencode(args).encode())resp = urlopen(req)print(resp.read().decode('utf-8'))
Ajax是一门无刷新更新网页的技术,他是浏览器的一个组件,在后台通过http请求得到新的html代码插入到dom树中,从而更新网页。
有些网页使用Ajax来更新网页,爬虫爬取的时候也需要对Ajax这部分内容进行爬取。
由于Ajax使用的是xmlrequest协议,我们需要在抓包软件或者浏览器的抓包功能中人工提取Ajax所请求的网络地址。
下面的代码使用爬虫请求某网站的Ajax服务器地址,服务器返回了一个JSON文本文件,再将这个文本文件(响应报文的内容)打印。需要对这个文本文件进行格式化显示才会显得美观。
from urllib.request import Request, urlopenfrom urllib.parse import urlencodefrom fake_useragent import UserAgent headers = { 'User-Agent': UserAgent().chrome,}args = { 'pageNo': 4, 'pageSize': 50}url = 'https://www.hupu.com/home/v1/news?' + urlencode(args)print(urlencode(args), '\n', url)req = Request(url=url, headers=headers, ) # data=urlencode(args).encode()resp = urlopen(req)print(resp.read().decode('utf-8'))
静态网页:可以从url地址直接得到我们想要的数据的网页。
动态网页:使用了Ajax这种暗地里获取数据的网页,数据url不显示在浏览器网页地址框的网页。
为了获取Ajax这种隐藏请求方式和地址的技术,需要使用抓包工具抓取Ajax访问的url地址。xhr一般是Ajax请求的类型。
https是http协议的加密版,实现加密的核心就所证书,通过证书生成一系列的秘钥来实现数据在传输过程中处于加密状态,到达浏览器或者服务器之后再进行解密。
当需要爬取https开头的网址时,可能会遇到证书过期,不匹配等问题。
import sslimport urllib.request # 忽略SSL安全认证context = ssl._create_unverified_context() # 添加到context参教里response = urllib.request.urlopen(url='https://www.baidu.com/', context=context)print(response.getcode())
由于各种反爬虫技术层出不穷,各种反反爬技术也应运而生,其中一种方法就是使用代理,本质上就是隔一段时间换一个ip地址。或者租几台云电脑,在每台电脑上同时运行爬虫程序。
from urllib.request import Request, urlopen,build_opener,HTTPHandler from fake_useragent import UserAgenturl='http://httpbin.org/get'headers = { 'User-Agent': UserAgent().chrome,}req = Request(url=url, headers=headers, )opener = build_opener(HTTPHandler(debuglevel=1))# 传入不同的控制器,从而创建出不同的打开器,从而改变http请求的报文,控制器里面带有参数resp = opener.open(req)print(resp.read().decode('utf-8'))
推荐花钱使用高匿代理,被爬取的网址既不知道代理服务器的ip也不知道当前主机的ip。
from urllib.request import Request, build_opener, ProxyHandlerfrom fake_useragent import UserAgent url = 'http://httpbin.org/get'headers = { 'User-Agent': UserAgent().chrome,}req = Request(url=url, headers=headers, )# 格式如下:ProxyHandler({'type':'username:pwd@ip_addr:port'}),需要免费的ip代理在这个网址:https://www.zdaye.com/dayProxy.htmlproxy_handler = ProxyHandler({'http': '112.25.236.167:9091'})opener = build_opener(proxy_handler)resp = opener.open(req)print(resp.read().decode('utf-8'))
某些网站需要用户登录之后才能进行操作,但是我们并不需要每次打开网页都输入账号密码进行登录,而是会自动登录。这就是cookie的作用,cookie是服务器存在浏览器本地的一个加密文件,里面储存有各种敏感信息,如密码等。
响应报文头的参数SET-Cookie记录了从服务器发来的需要存在本地的cookie数据。
请求报文头参数Cookie会将本地cookie中的数据以post形式发送到服务器。
使用urllib来操作cookie,从而使我们的爬虫顺利爬到数据。
下图就是cookie请求头。
当已经访问过某网页并已经生成了cookie,下一次再访问的时候就可以直接添加cookie请求头,从而实现网页自动登录。
from urllib.request import Request, urlopen,build_opener,HTTPHandlerfrom fake_useragent import UserAgenturl='http://httpbin.org/get'#在headers中添加cookie请求头即可headers = { 'User-Agent': UserAgent().chrome, 'Cookie':'自己从浏览器抓包工具复制过来'}req = Request(url=url, headers=headers, )opener = build_opener(HTTPHandler(debuglevel=1))resp = opener.open(req)print(resp.read().decode('utf-8'))
创建一个cookie控制器之后,再访问这个网页就会主动读取上一次访问时保存在cookie中的各种信息(临时会话cookie保存在内存中而不在硬盘中)。cookie参数详解。
from urllib.request import Request, build_opener,HTTPCookieProcessorfrom fake_useragent import UserAgenturl='https://www.nvidia.cn/'headers = { 'User-Agent': UserAgent().chrome,}req = Request(url=url, headers=headers, )# 创建一个能够保存cookie的handler,传入build_opener()方法,最终返回一个打开器# HTTPCookieProcessor()方法需要一个cookie对象作为参数,然后返回一个控制器,opener = build_opener(HTTPCookieProcessor())resp = opener.open(req)print(resp.read().decode('utf-8'))
当一个网页,比如b站,cookie会保存我们的登录信息,这个cookie保存在本地的硬盘中。当我们使用爬虫而不是浏览器访问b站时,爬虫因为没有cookie而无法登录,这个时候就可以把b站保存在硬盘上的cookie文件拿来给爬虫使用,实现爬虫也能自动登录到b站。
from urllib.request import Request, build_opener, HTTPCookieProcessorfrom fake_useragent import UserAgentfrom http.cookiejar import MozillaCookieJar url = 'https://www.nvidia.cn/'headers = { 'User-Agent': UserAgent().chrome,}cookie = MozillaCookieJar() # 创建一个cookie对象,他会自动记录各种cookie信息req = Request(url=url, headers=headers, )opener = build_opener(HTTPCookieProcessor(cookiejar=cookie))resp = opener.open(req)cookie.save('cookie.txt', ignore_discard=1, ignore_expires=1) # 保存cookie对象cookie.load('cookie.txt', ignore_discard=1, ignore_expires=1) # 加载cookie文件print(resp.read().decode('utf-8'))
京公网安备 11010502049817号