上一次我們講了urllib.request子產品的最簡單用法,接下來我們要學習它另外的幾個方法,使用Request和送出POST資料。
一:使用Request
urllib.request.
Request
(url, data=None, headers={}, method=None)
urllib.request.
Request
使用request()來包裝請求,再通過urlopen()擷取頁面。
# -*- coding:utf-8 -*-
from urllib import request,parse
url="http://www.umei.cc/meinvtupian/xingganmeinv/"
headers={ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"}
req = request.Request(url, headers=headers)
html= request.urlopen(req).read().decode("utf-8")
print(html)
添加headers頭請求是為了讓網站認為我們是浏覽器發送請求而不是urllib請求
當然也可以将headers頭請求寫完全一點比如:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)'
'Referer': 'http://www.lagou.com/zhaopin/Python/?labelWords=label',
'Connection': 'keep-alive'
}
- User-Agent :這個頭部可以攜帶如下幾條資訊:浏覽器名和版本号、作業系統名和版本号、預設語言
- Referer:可以用來防止盜鍊,有一些網站圖檔顯示來源http://***.com,就是檢查Referer來鑒定的
- Connection:表示連接配接狀态,記錄Session的狀态。
二:POST
urllib.request.
urlopen
(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
urllib.request.
urlopen
urlopen()的data參數預設為None,當data參數不為空的時候,urlopen()送出方式為Post。
送出post資料的時候需要将data資料進行urlencode()處理,轉化為URL編碼
這裡需要使用道urllib.parse.urlencode()方法
# -*- coding:utf-8 -*-
from urllib import parse
data={
"from":"zh",
"to":"en",
"query":"拿破侖",
"transtype":"realtime",
"simple_means_flag":3
}
data = parse.urlencode(data).encode('utf-8')
處理後的url編碼為:
from=zh&to=en&query=%E6%8B%BF%E7%A0%B4%E4%BB%91&transtype=realtime&simple_means_flag=3
Post的資料必須是bytes或者iterable of bytes,不能是str,是以需要進行encode()編碼
這裡展示一個小案例,發送表單資料給百度翻譯,然後會得到一個json對象!
# -*- coding:utf-8 -*-
from urllib import request,parse
url="http://fanyi.baidu.com/v2transapi"
headers={ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"}
data={
"from":"zh",
"to":"en",
"query":"拿破侖",
"transtype":"realtime",
"simple_means_flag":3
}
data = parse.urlencode(data).encode('utf-8')
req = request.Request(url, headers=headers, data=data)
html = request.urlopen(req).read().decode("utf-8")
print(html)
運作結果

放到http://www.json.cn中解析,得到以下結果
是不是看到翻譯結果啦!拿破侖->Napoleon