目录
五,POST请求
post请求用于向服务器发送数据,这些数据被隐藏在请求报文的报文体当中,十分的安全,而不像GET方式将参数暴露在url当中。
使用Request对象对相关数据进行封装从而得到一个请求报文。将需要发送到服务器的数据赋给在Request初始化方法里面的data参数即可,data参数是一个字典。
html当中的<form>标签存在一个action的参数,他的值一般是是一个服务器脚本的地址,当提交表单时,所有数据就会发送的到服务器并被这个脚本进行处理。这种向服务器提交数据的请求方式一般是post。
下面是一个post请求的例子。一旦Request对象中添加了data参数,那么就会默认使用post的方式请求。
from urllib.parse import urlencode
from 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刷新技术的新增的网页内容
Ajax是一门无刷新更新网页的技术,他是浏览器的一个组件,在后台通过http请求得到新的html代码插入到dom树中,从而更新网页。
有些网页使用Ajax来更新网页,爬虫爬取的时候也需要对Ajax这部分内容进行爬取。
由于Ajax使用的是xmlrequest协议,我们需要在抓包软件或者浏览器的抓包功能中人工提取Ajax所请求的网络地址。
下面的代码使用爬虫请求某网站的Ajax服务器地址,服务器返回了一个JSON文本文件,再将这个文本文件(响应报文的内容)打印。需要对这个文本文件进行格式化显示才会显得美观。
from urllib.request import Request, urlopen
from urllib.parse import urlencode
from 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请求的类型。
八,请求SSL证书验证
https是http协议的加密版,实现加密的核心就所证书,通过证书生成一系列的秘钥来实现数据在传输过程中处于加密状态,到达浏览器或者服务器之后再进行解密。
当需要爬取https开头的网址时,可能会遇到证书过期,不匹配等问题。
import ssl
import urllib.request
# 忽略SSL安全认证
context = ssl._create_unverified_context() # 添加到context参教里
response = urllib.request.urlopen(url='https://www.baidu.com/', context=context)
print(response.getcode())
九,openner的使用(设置代理及cookie处理)
由于各种反爬虫技术层出不穷,各种反反爬技术也应运而生,其中一种方法就是使用代理,本质上就是隔一段时间换一个ip地址。或者租几台云电脑,在每台电脑上同时运行爬虫程序。
1,opener的一般创建方法
from urllib.request import Request, urlopen,build_opener,HTTPHandler
from fake_useragent import UserAgent
url='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'))
2,代理proxy的使用
1,代理的分类
推荐花钱使用高匿代理,被爬取的网址既不知道代理服务器的ip也不知道当前主机的ip。
2,使用代理proxy的一般代码写法
from urllib.request import Request, build_opener, ProxyHandler
from 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.html
proxy_handler = ProxyHandler({'http': '112.25.236.167:9091'})
opener = build_opener(proxy_handler)
resp = opener.open(req)
print(resp.read().decode('utf-8'))
3,cookie的使用
某些网站需要用户登录之后才能进行操作,但是我们并不需要每次打开网页都输入账号密码进行登录,而是会自动登录。这就是cookie的作用,cookie是服务器存在浏览器本地的一个加密文件,里面储存有各种敏感信息,如密码等。
响应报文头的参数SET-Cookie记录了从服务器发来的需要存在本地的cookie数据。
请求报文头参数Cookie会将本地cookie中的数据以post形式发送到服务器。
使用urllib来操作cookie,从而使我们的爬虫顺利爬到数据。
下图就是cookie请求头。
1,cookie的一般使用方法
当已经访问过某网页并已经生成了cookie,下一次再访问的时候就可以直接添加cookie请求头,从而实现网页自动登录。
from urllib.request import Request, urlopen,build_opener,HTTPHandler
from fake_useragent import UserAgent
url='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'))
2,cookie控制器的写法
创建一个cookie控制器之后,再访问这个网页就会主动读取上一次访问时保存在cookie中的各种信息(临时会话cookie保存在内存中而不在硬盘中)。cookie参数详解。
from urllib.request import Request, build_opener,HTTPCookieProcessor
from fake_useragent import UserAgent
url='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'))
3,生成cookie文件并保存到本地
当一个网页,比如b站,cookie会保存我们的登录信息,这个cookie保存在本地的硬盘中。当我们使用爬虫而不是浏览器访问b站时,爬虫因为没有cookie而无法登录,这个时候就可以把b站保存在硬盘上的cookie文件拿来给爬虫使用,实现爬虫也能自动登录到b站。
from urllib.request import Request, build_opener, HTTPCookieProcessor
from fake_useragent import UserAgent
from 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'))