人生苦短,我用 Python
引言
上一篇我们聊了 urlopen 的基本使用姿势,但这几个简单的参数并不足以构建一个完整的请求。对于复杂的请求,例如需要添加请求头就显得无能为力,这时我们可以选择使用 Request 。
Request
官方文档:https://docs.python.org/zh-cn/3.7/library/urllib.request.html
首先来看一下 Request 的使用语法:
class urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
- url:请求的地址链接,只有这个是必传参数,其余都是可选参数。
- data:如果这个参数需要传递,则必须传bytes(字节流)类型的。
- headers:请求头信息,它是一个字典,可以在构造请求的时候通过 headers 之间构造,也可以调用 add_header() 添加。
- origin_req_host:发起请求一方的 host 名称或者也可以是 ip 地址。
- unverifiable:指的是这个请求是否是无法验证的,默认是 False 。意思就是说用户没有足够权限来选择接收这个请求的结果。例如我们请求一个HTML文档中的图片,但是我们没有自动抓取图像的权限,这时 unverifiable 的值就是 True 。
- method:请求方法,如 GET 、 POST 、 PUT 、 DELETE 等等。
还是先来看一个简单的示例,使用 Request 爬取博客网站:
import urllib.request
request = urllib.request.Request('https://www.geekdigging.com/')
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))
可以看到,这里还是使用 urlopen() 来发起请求,只是参数不再是之前的 URL 、 Data 、 timeout 等等信息,而是变成了 Request
类型的对象。
我们来构建一个稍微复杂一点的请求。
import urllib.request, urllib.parse
import json
url = 'https://httpbin.org/post'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
'Content-Type': 'application/json;encoding=utf-8',
'Host': 'geekdigging.com'
}
data = {
'name':