Python 爬蟲函數庫 Urllib、Requests

最後更新於 2021 年 6 月 4 日

Urllib

  Urllib是Python附帶的標準函數庫,無須安裝,可直接import。通常用於爬蟲開發、API資料取得和測試。在Python2 分為Urllib和Urllib2,Urllib2 可接收一個Request物件,並以此來設定一個URL的Headers,但Urllib只接收一個URL,表示不能偽裝使用者代理字串等。

Urllib模組可以提供進行Urlencode的方法,該方法用於GET查詢字串的產生,Urllib2不具有這樣的功能。這也是Urllib和Urllib2經常在一起使用的原因。

Python3中,Urllib模組是一個收集幾個模組來使用URL的軟體套件,就是將Urllib和Urllib2 合併在一起使用,並命名為Urllib。

大致具備以下功能:

  • urllib.request:用於開啟和讀取URL。
  • urllib.error:包含提出的例外urllib.request。
  • urllib.parse:用於解析URL。
  • urllib.robotparser:用於解析robots.txt檔案。

發送請求

urllib.request.urlopen的語法如下:

urllib.request.urlopen(url , data = None , [timeout, ]* , cafile = None , capath = None , cadefault = False , context = None)

Urllib是用於存取URL的唯一方法。

參數解釋

url:需要造訪的網站的URL位址。格式必須完整,如:https://www.google.com/為完整的URL,若url為google.com/,則程式執行時間會提示無法識別URL的錯誤。

data:預設值為 None ,Urllib判斷參數data是否為None進一步區分請求方式,若data為None則代表請求方式為GET,反之則為POST。參數data以字典形式儲存資料,並將參數data的字典類型轉換成位元組類型才能完成POST請求。

timeout:逾時設定,指定阻塞操作(請求時間)的逾時,如果未指定則使用全域預設逾時設定。

cafile、capath、cadefault:使用參數指定一組HTTPS請求的可信CA憑證。cafile應指向包含一組CA憑證的單一檔案;capath應指向憑證檔案的目錄;cadefault通常使用預設值即可。

context:描述各種SSL選項的實例。

實際使用中,最常使用的參數有url、data、timeout

當對網站發送請求時,網站會回傳對應的回應內容。urlopen物件提供取得網站回應內容的方法函數,分別為:

read()、readline()、readlines()、fileno()、close():對HTTPResponse類類型資料操作。

實例

下面的實例用於實現Urllib模組對網站發送請求並將回應內容寫入文字檔:

import urllib.request
response = urllib.request.urlopen('https://www.youtube.com/results?search_query=%E5%96%BB%E8%A8%80',None,2)
html = response.read().decode('utf-8')
f = open('html.txt','w',encoding='utf-8')
f.write(html)
f.close()

此段程式碼首先匯入urllib.request模組,然後透過urlopen造訪一個URL,請求方式是GET;最後的參數用於設定逾時,設定為2秒,若超過2秒網站還沒傳回回應資料就會提示請求失敗的錯誤訊息。

當獲得伺服器的回應後透過response.read()取得其回應內容。read()方式回傳的是一個bytes類型的資料,需要透過decode()來轉換成str類型。最後將資料寫入文字檔中,encoding用於設定文字文件的編碼格式,資料編碼必須與文字檔編碼一致,否則會出現亂碼。

20200504112152 Python 爬蟲函數庫 Urllib、Requests

一個完整的HTTP請求必須要有請求標頭資訊,而urllib.request.Request的作用是設定HTTP的請求標頭資訊。使用urllib.request.Request將剛剛的例子設定請求標頭:

import urllib.request
url = 'https://www.youtube.com/results?search_query=%E5%96%BB%E8%A8%80'
headers = {
  'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36',
  'Referer' : 'https://www.youtube.com/',
  'Connection' : 'keep-alive'
}
req = urllib.request.Request(url,headers=headers)
html = urllib.request.urlopen(req).read().decode('utf-8')
f = open('html.txt','w',encoding='utf-8')
f.write(html)
f.close()

User-Agent怎麼取得?

按F12開啟「開發人員工具」-「Network」-「docs」,然後刷新頁面會出現一個檔案,點開檔案選擇「Headers」最下方就會出現 user-agent

20200504112921 Python 爬蟲函數庫 Urllib、Requests

Urllib發送POST請求的方法如下:

import urllib.request
import urllib.parse
url = 'https://www.youtube.com/'
data = {
  'value' : 'true',
}
data = urllib.parse.urlencode(data).encode('utf-8')
req = urllib.request.urlopen(url, data=data)

上段程式碼中,urllib.parse.urlencode(data)將資料轉換成位元組的資料類型,而encode(‘utf-8’) 設定位元組的編碼格式。除此之外,Urllib還提供quote()和unquote()對URL編碼處理,之後再提。

Requests

  Requests是Python的很實用的HTPP使用者端函數庫,完全滿足如今網路爬蟲的需求。與Urllib比較,Requests不僅具備Urllib的全部功能;在開發使用上語法簡單容易、完全符合Python優雅、簡潔的特性;在相容性上完全相容Python2 與 Python3,具有較強的適用性。

Requests可透過pip安裝:

# windows
pip install requests
# Linux
sudo pip install requests

除了透過pip安裝外,也可以下載whl檔案安裝,方法如下:

造訪 https://www.lfd.uci.edu/~gohlke/pythonlibs/ ,按Ctrl+F搜尋「requests」,下載「requests‑2.23.0‑py2.py3‑none‑any.whl」。

20200504114028 Python 爬蟲函數庫 Urllib、Requests

下載好後解壓縮放進Python的安裝目錄 Lib\site-packages (C:\Users\使用者名稱\AppData\Local\Programs\Python\Python38\Lib\site-packages)中即可。

20200504114041 Python 爬蟲函數庫 Urllib、Requests

除了解壓whl,還可以使用pip安裝whl檔案。例如把下載的檔案丟到某處,開啟CMD將路徑切換到該位置,輸入安裝指令:

pip install requests‑2.23.0‑py2.py3‑none‑any.whl

完成Requests安裝後,在終端輸入:

E:\>Python
>>> import requests
>>> requests.__version__
'2.23.0'

檢視Requests版本資訊,檢測是否安裝成功。

請求方式

HTTP的常用請求是GET和POST,Requests對此區分兩種不同的請求方式。

GET請求有兩種形式,分別是沒有參數與有參數,以Youtube為例:

# 沒有參數
https://www.youtube.com/
# 帶有參數 search_query
https://www.youtube.com/results?search_query=python

一般URL末尾有帶 ? 就代表該URL是有帶請求參數的,GET參數說明如下:

  • search_query是參數名稱,參數名稱由網站規定。
  • python是參數值,由使用者自行設定。
  • 如果一個URL有多個參數,參數之間用”&”連接。

Requests實現GET請求,對於帶有參數的URL有兩種請求方式:

import requests
# 第一種方式
r = requests.get('https://www.youtube.com/results?search_query=python')
# 第二種方式
url = 'https://www.youtube.com/results'
params = {'search_query':'python'}
# 左邊params在GET請求中表示設定參數
r= requests.get(url,params=params)
# 輸出產生的URL
print(r.url)

Requests實現POST請求須設定請求參數data,資料格式可以為字典、元組、清單和JSON格式。

# 字典
data = {'key1' : 'value1' , 'key2' : 'value2'}
# 元組或列表
(('key1','value1'),('key2':'value2'))
# JSON
import json
data = {'key1':'value1' , 'key2':'value2'}
# 將字典轉為JSON
data = json.dumps(data)
# 發送POST請求
r = requests.post("https://www.youtube.com/",data = data)
print(r.text)

另外Requests還提供了 r.status_code、r.raw、r.content、r.text、r.headers、r.json()、r.raise_for_status()、r.url、r.cookies、r.encoding,10種方式取得回應內容。

0 0 評分數
Article Rating
訂閱
通知
guest

0 Comments
在線反饋
查看所有評論