爬蟲學習-urllib.request資訊傳送
阿新 • • 發佈:2018-11-17
爬蟲資訊傳送是一個比較複雜的過程,接下來就簡單學習一下資訊傳送的幾個簡單例項,接下來我們主要使用的是urlopen API:
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
url請求網址,
timeout 響應超時時間
1. 基礎的資訊傳送與獲取
#匯入包 import urllib.request #開啟一個網址,並將返回資訊放置到response中 response = urllib.request.urlopen('http://www.baidu.com') #幾個重要資訊的返回列印測試,其中status是狀態,read()是返回體,但是需要解碼才可以。 print(response.reason) print(response.status) print(response.getheaders()) print(response.getheader('Content-Type')) print(response.read().decode('utf-8'))
2. 使用Request來構建複雜資訊傳送,API描述如下:
class urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
url 是請求的網址,
data 可空 可以用urllib.parse
模組裡的urlencode()
編碼 ,
headers 可以直接構造一個字典型別傳入,也可以使用add_header()方法新增。
origin_req_host是請求方的ip或者host名稱
method請求使用的方法 GET、POST等
第一個是之前寫過的一個使用urlopen方法不能加header方法只能加data的一個例子
#匯入需要的包 import urllib.request as req import urllib.parse as pa import json as js #要訪問的網址 url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule' #data資訊字典 content = input('請輸入要翻譯的內容:') data_dict = {} data_dict['i'] = content data_dict['keyfrom'] = 'fanyi.web' data_dict['doctype'] = 'json' #data資訊需要encode之後才可以 data = pa.urlencode(data_dict).encode('utf-8') #開啟網址,urlopen方法是不能傳輸headers的,它沒有這個引數,只有data欄位 response = req.urlopen(url,data= data) #獲取資訊 html = response.read().decode('utf-8') #用json轉換收到的內容 tar = js.loads(html) #列印輸出 print('翻譯後的結果為:%s' %tar['translateResult'][0][0]['tgt'])
下面這個例子就使用Request加入了頭資訊
#匯入需要的包
import urllib.request as req
import urllib.parse as pa
import json as js
#要訪問的網址
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
#頭資訊字典
headers = {}
headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'
#data資訊字典
content = input('請輸入要翻譯的內容:')
data_dict = {}
data_dict['i'] = content
data_dict['keyfrom'] = 'fanyi.web'
data_dict['doctype'] = 'json'
#data資訊需要encode之後才可以
data = pa.urlencode(data_dict).encode('utf-8')
#這個API的引數就有headers了
re = req.Request(url=url, data=data, headers=headers, method='POST')
#開啟網址
response = req.urlopen(re)
#獲取資訊
html = response.read().decode('utf-8')
#用json轉換收到的內容
tar = js.loads(html)
#列印輸出
print('翻譯後的結果為:%s' %tar['translateResult'][0][0]['tgt'])
3.cookie的獲取
cookie的獲取使用的是CookieJar物件來獲取,在之前需要先構建一個HTTPCookieProcessor的handler物件,例項如下:
import http.cookiejar as cook
import urllib.request as req
#首先生成一個cookie物件
cookie = cook.CookieJar()
#接下來構建一個HTTPCookieProcessor的handler
handler = req.HTTPCookieProcessor(cookie)
#最後構建一個opener
opener = req.build_opener(handler)
#使用opener開啟網址
response = opener.open('http://www.baidu.com')
#迴圈輸出相關cookie
for item in cookie:
print(item.name + "=" + item.value)
如果要把cookie的值進行輸出的話可以使用MozillaCookieJar或者LWPCookieJar的物件進行儲存輸出,這裡就不在舉例了。