天天看點

python3爬蟲攻略(2):urllib.request(2)

上一次我們講了urllib.request子產品的最簡單用法,接下來我們要學習它另外的幾個方法,使用Request和送出POST資料。

一:使用Request

urllib.request.

Request

(url, data=None, headers={}, method=None)

使用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)

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)
           

運作結果

python3爬蟲攻略(2):urllib.request(2)

放到http://www.json.cn中解析,得到以下結果

python3爬蟲攻略(2):urllib.request(2)

是不是看到翻譯結果啦!拿破侖->Napoleon