urllib.request 使用:
一般用于发送请求和接收响应
- urlopen 方法
#url为必填参数,后两个可不填
urllib.request.urlopen(url,data,timeout)
urlopen方法返回一个HTTPResponse对象
- request对象
实际上,我们可以给urllib.request.urlopen()
传入一个request对象
为什么需要request对象传入参数?! 此方法与上文显示的有什么区别?
urllib.request.urlopen()
此方法无法指定请求头部,而有时必须指定请求头部以避免被浏览器识别为爬虫。
request对象如下:
url
:指定目标网站的URL
data
:发送POST数据时提交的榜单,默认为None
headers
:发送请求时附加的头部,默认为{}
origin_req_host
:请求方的host名称或者IP地址,默认为None
unverfiable
:请求方的请求无法验证,默认为False
method
:指定请求方法,默认为None
#初始化一个request对象
url='http://www.baidu.com'
#指定头部信息,可以通过chorme自带的进行查看
headers = {
'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36'
}
req=urllib.request.Request(url=url,headers=headers,method='GET')
获取Cookie
import urllib,request
#为了有效地管理session,采取的包
import http.cookiejar
#创建名为 cookie的 http.cookiejar.CookieJar 对象
cookie=http.cookiejar.CookieJar()
#以 CookieJar对象为参数,创建 urllib.request.HTTPCookieProcessor对象,
#该对象负责调用 CookieJar 来管理 cookie。
cookie_hander=urllib.request.HTTPCookieProcessor(cookie)
#调用 urllib.request.build_opener()函数创建 OpenerDirector对象。
opener=urllib.request.build_opener(cookie_hander)
#使用 OpenerDirector 对象来发送请求
response=opener.open('www.baidu.con')
for item in cookie
print(item.name + '=' + item.value)
- http.cookiejar 这个包
urlopen可以发送GET,POST请求,大多数情况下urlopen就可以完成任务。但使用urllib.request访问被保护的界面时,需要维护浏览器与服务器之间的session,需要借助cookie管理器来完成。
HTTP 是一种“请求-响应”式协议:客户端向服务器发送请求,服务器向客户揣生成响应数据。这就涉及一个问题,服务器如何辨别两次请求的客户端是同一个客户端呢?答案是 session id。当客户端第一次向服务器发送请求时,服务器会为该客户端分配一个 session id 作为其标识,服务器在生成响应数据时,也会把该 session id 作为响应数据发送给客户端。当客户端第二次向服务器发送请求时,如果客户端把自己的 session id 也发送给服务器,且服务器端的 session id 还未过期,服务器就知道该客户端与前一次发送请求的客户端是同一个。
如果直接urlopen发送未管理session,那么服务器无法识别是否为一个客户端发出的。为有效管理Cookie,引入http.cookiejar包
此外,程序还需要使用 OpenerDirector 对象来发送请求。为了使用 urllib.request 模块通过 cookie 来管理 session,可按如下步骤进行操作:
- 创建 http.cookiejar.CookieJar 对象或其子类的对象。
- 以 CookieJar 对象为参数,创建 urllib.request.HTTPCookieProcessor 对象,该对象负责调用 CookieJar 来管理 cookie。
- 以 HTTPCookieProcessor 对象为参数,调用 urllib.request.build_opener() 函数创建 OpenerDirector 对象。
- 使用 OpenerDirector 对象来发送请求,该对象将会通过 HTTPCookieProcessor 调用 CookieJar 来管理 cookie