1. 程式人生 > >爬蟲學習-urllib.request資訊傳送

爬蟲學習-urllib.request資訊傳送

爬蟲資訊傳送是一個比較複雜的過程,接下來就簡單學習一下資訊傳送的幾個簡單例項,接下來我們主要使用的是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的物件進行儲存輸出,這裡就不在舉例了。