在上一篇中,我們是通過urllib.request.urlopen直接訪問的網頁地址,但在實際應用中,我們更多地使用urllib.request.Request對象,因為其可以封裝headers和data。
一、Request類的參數
class Request:
def __init__(self, url, data=None, headers={},
origin_req_host=None, unverifiable=False,
method=None):
注意:
url:訪問的URL地址;
data:像URL地址發送的數據,無則為GET,有則為POST;
headers:請求頭,類型為字典;
origin_req_host:日常不用,忽略;
unverifiable:日常不用,忽略;
method:默認GET,可設為POST;
二、構造Request對象
import urllib.request as ur
# 構造一個Request對象
request = ur.Request('https://edu.csdn.net/')
response = ur.urlopen(request).read()
print(response)
三、嘗試data打包
以“英雄聯盟百度貼吧”為例。
1、分析URL地址:

然而,當我們將網址復制到py文件中,網址卻變成了“亂碼”?
url = 'https://tieba.baidu.com/f?kw=%E8%8B%B1%E9%9B%84%E8%81%94%E7%9B%9F&ie=utf-8&pn=0'
原來是當GET請求中有漢字時,傳遞時會對其進行URL編碼。
(其實對於任何文字都會進行編碼,只是英文和數字編碼前后一致而已。)
2、URL編碼和解碼:
import urllib.parse as up
data = {
'kw': '英雄聯盟',
'ie': 'utf-8',
'pn': '0'
}
# 編碼
data_url = up.urlencode(
data
)
print(data_url)
# 解碼
ret = up.unquote(data_url)
print(ret)
輸出如下:

3、利用編碼進行百度貼吧的訪問:
import urllib.request as ur
# 應使用的是URL編碼之后的data_url
request = ur.Request('https://tieba.baidu.com/f?'+data_url)
response = ur.urlopen(request).read()
with open('baidu.html', 'wb') as f:
f.write(response)
輸出如下:

4、進行抽離和完善:
import urllib.parse as up
import urllib.request as ur
# 只需更改kw即可,還可更改pn
kw = '美劇'
data = {
'kw': kw,
'ie': 'utf-8',
'pn': '0'
}
# 編碼
data_url = up.urlencode(
data
)
print(data_url)
# 解碼
ret = up.unquote(data_url)
print(ret)
# 應使用的是URL編碼之后的data_url
request = ur.Request('https://tieba.baidu.com/f?'+data_url)
response = ur.urlopen(request).read()
with open('%s.html' % kw, 'wb') as f:
f.write(response)
為我心愛的女孩~~
