利用urlopen方法可以发起最基本的请求,但urlopen的几个简单参数并不足以构建一个完整的请求。如果需要往请求中加入Headers等信息,就得利用更强大的 Request 类来构建请求了。
import urllib.request
request = urllib.request.Request('https://python.org') # 构造 Request 对象
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))
通过参数构造 Request 类, Request 类构造方法
class urllib.request.Request(url, data=None, headers={},
origin_req_host=None, unverifiable=False, method=None)
-
第一个参数ur1用于请求URL,这是必传参数,其他的都是可选参数。
-
第二个参数data如果要传数据,必须传bytes类型的。如果数据是字典,可以先用urllib.parse模块里的urlencode方法进行编码
-
第三个参数headers是一个字典,这就是请求头,我们在构造请求时,既可以通过 headers参数直接构造此项,也可以通过调用请求实例的 add header 方法添加。添加请求头最常见的方法就是通过修改 User-Apent 来伪装浏览器。默认的 User-Agent 是Python-urlib,我们可以通过修改这个值来伪装浏览器例如要伪装火狐浏览器就可以把User-Agent设置为:
Mozi1la/5.0(X11; U; Linux 686) Gecko/20071127 Firefox/2.0.0.11
-
第四个参数originreq host指的是请求方的host名称或者IP地址。
-
第五个参数unverifiable 表示请求是否是无法验证的,默认取值是 False,意思是用户没有足够的权限来接收这个请求的结果。例如,请求一个HTML 文档中的图片,但是没有自动抓取图像的权限,这时unverifiable的值就是True。
-
第六个参数method是一个字符串,用来指示请求使用的方法,例如GETPOST和PUT等
通过传入参数构造 Request 类
from urllib import request, parse
url = 'https://www.httpbin.org/post'
headers = {
'User-Agent':'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT',
'Host':'www.httpbin.org'
}
dict = {'name':'germey'}
data = bytes(parse.urlencode(dict), encoding='utf-8')
req = request.Request(url,data=data,headers=headers,method='POST')
response = request.urlopen(req)
print(response.read().decode('utf-8'))
运行结果如下:
通过 add_header 方法添加 headers 的方法如下:
req = request.Request(url=url,data=data,method='POST')
req.add_header('User-Agent','Mozilla/4.0 (Compatible; MSIE 5.5; Windows NT)')
后续公众号会发布系列教程,更多内容请关注公众号:程序猿学习日记