网络爬虫(urllib超详细使用指南)
urllib
- urllib簡介
- 發送請求與獲得響應
- urlopen 函數
- 發送HTTP POST 請求
- 設置請求頭
- 設置中文名請求頭
- 使用代理
- 異常處理
- URL Error
- HTTPEror
urllib簡介
說明:urlib是Python內置的HTTP請求的庫
urlib分為四個模塊:
request:請求模塊,用于發送模擬請求。
error:異常處理模塊,幫助解決錯誤。
parse:工具模塊,提供url處理方法。
robotparser:用于識別網站的robots.txt文件,根據robots.txt來判斷該網站是否可爬。
發送請求與獲得響應
urlopen 函數
urilib最基本的一個應用就是向服務端發送HTTP請求,然后接收服務端返回的響應數據。這個功能通過 其中的request模塊中的urlopen 函數就可以搞定。例如,下面的代碼向百度發送HTTPGET請求,然后輸出服務端的響應結果。
import urllib.requestresponse = urllib.request.urlopen('https://baidu.com') # 將服務器響應數據用 utf-8 進行解碼 print(response.read().decode('utf-8'))urlopen 函數 返回的是HTTPResponse類型的對象,其主要有的方法與屬性為:
方法:
- read() :輸出 HTML 代碼
- getheader() :輸出指定響應頭信息
- getheaders():輸出所有響應頭信息
屬性: - msg :響應信息
- version :HTTP 版本
- status :響應碼
- debuglevel
- closed
設置請求超時
可以通過urlopen 函數的timeout命名參數進行設置,單位為秒。如上面例子,可以寫為
發送HTTP POST 請求
需要使用 data 命名參數,該參數是 bytes類型,需要用bytes類將字符串形式的數據轉換為bytes類型。
示例:
import urllib.request #將表單數據轉換為bytes類型,用 utf-8 編碼 data = bytes(urllib.parse.urlencode({'name':'Bill','age':30}),encoding = 'utf-8') #提交 HTTP POST 請求 response = urllib.request.urlopen('https://httpbin.org/post',data = data) # 將服務器響應數據用 utf-8 進行解碼 print(response.read().decode('utf-8'))設置請求頭
如果用爬蟲向服務端發送HTIP請求,通常需要模擬瀏覽器的HTTP請求,也就是讓服務端誤認為客戶端是瀏覽器,而不是爬蟲,這樣就會讓服務器的某些反爬蟲技術失效。
但模擬瀏覽器發送HTTP請求需要設置名為 User?Agent 的HTTP請求頭,除了這個請求頭外,還可以設置其他的請求頭,而我們以前使用 urlopen 函數發送 HTTP 請求,請求頭都使用默認值。
urlopen函數本身并沒有設置HTTP請求頭的命名參數,要想設置HTTP請求頭,需要為urlopen函數傳入Request 對象。
可以通過Request類構造方法的headers命名參數設置HTTP請求頭。
示例:
from urllib import request,parse#定義請求的URL url = 'https://httpbin.org/post' #定義HTTP請求頭,who 為自定義請求頭 headers = { 'User-Agent' = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 ,Safari/537.36', 'Host' : 'httpbin.org/post', 'who' : 'Python' } #將表單數據轉換為bytes類型,用 utf-8 編碼 data = bytes(urllib.parse.urlencode({'name':'Bill','age':30}),encoding = 'utf-8')#創建 Request 對象 req = request.Request(url = url,data = data,headers = headers) #提交 HTTP POST 請求 response = urllib.request.urlopen(req) # 將服務器響應數據用 utf-8 進行解碼 print(response.read().decode('utf-8'))設置中文名請求頭
不能直接設置為中文。一般采用base64編碼。
base64編碼需要使用base64模塊中的 b64encode 函數,解碼使用 b64decode函數,代碼如下:
importbase64 #對中文進行編碼 base64Value = base64.b64encode(bytes('Python 從萊鳥到高手 ',encoding='utf?8') print(str(base64Va1ue,'utf?8') 對中文進行解碼,并按 utf?8 編碼格式將解碼后的結果轉換為字符串 print(str(base64.b64decode(base64Va1ue,'utf?8')b64encode函數編碼后返回的是bytes類型,需要使用str函數將其轉換為字符串類型。 b64decode函數解碼時需要指定bytes類型的值,b64decode函數的返回值也是 bytes 類型,所以也需要str函數將該函數的返回值轉換為字符串.
如上面的例子,可以將請求頭寫成:
headers = { 'User-Agent' = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36', 'Host' : 'httpbin.org/post', 'MyChinese1' :base64.b64encode(bytes('這是中文請求頭',encoding ='utf-8')), 'who' : 'Python' }也可以用 url編碼格式
;chinese' : urlencode({'name':'李寧'})不過只能是字典格式
使用代理
最常見的反爬技術之一就是通過客戶端的IP鑒別是否為爬蟲。如果同一個IP在短時間內大量訪問服務器的不同頁面,那么極有可能是爬蟲,如果服務端認為客戶端是爬蟲,很有可能將客戶端所使用的IP臨時或永久禁用,這樣爬蟲就再也無法訪問服務器的任何資源了,當然,如果使用的是ADSI或光纖寬帶,重新撥一下號或重啟一下,一般會更換1P。但爬蟲的任務是從服務器抓取成千上萬的資源,光換幾個IP是沒用的,這就要求爬蟲在抓取服務器資源時,需要不斷更換IP,而且是大量的,數以萬計的IP。更換IP的方式有很多,最常用,最簡單的方式就是使用代理服務器。
盡管一個代理服務器一般只有一個固定的IP,但我們可以不斷更換代理服務器,這樣就會使用大量的IP訪問服務器,對于服務器而言,就會認為是成千上萬不同客戶端發送的請求。這樣就可以成功欺騙服務器。
使用 ProxyHarndler類可以設置HTTP和HTTPS代理,但在設置代理之前,首先要有代理服務器。代理服務器可以自己搭建,也可以使用第三方的服務器。
第三方免費代理:
網址一
網址二
實例代碼:
from urllib.error import URLError from urllib.request import ProxyHandler,build_opener # 創建 ProxyHandler 對象,指定代理 proxy_handler = ProxyHandler({'http':'http://182.84.144.45:3256','https': 'https://182.84.144.45:3256',} )opener = build_opener(proxy_handler)try:response = opener.open('https://www.jd.com')print(response.read().decode('utf-8')) except URLError as e:print(e.reason)異常處理
URL Error
URL Error屬于unllib庫的error模塊,該類從OSEror類繼承,是error模塊中的異?;?#xff0c;由request模塊產生的異常都可以通過URLError來捕捉。
URLError類有一個reason屬性,可以通過這個屬性獲得錯誤的原因。
使用方法:
try : 代碼 except error.URLError as e:print(r.reason)HTTPEror
HTTPEror是URLError的子類,專門用于處理HTTP請求錯誤,比如400、404錯誤。該類有3個屬性。
- (1) code:返回HTTP狀態碼,如404、400等表示服務端資源不存在,500表示服務器內部錯誤。
- (2) reason:用于返回錯誤原因。
- (3) headers:返回請求頭。
HTTPError也并不是什么錯誤都能捕捉,例如time out異常無法用HTTPEror 捕獲,必須使用URLErort捕獲。由于HTTPEror是URLEror的子類,所以通常的做法是在try. except語句中先捕獲HTTPEror異常,如果拋出的不HTTPEror異常,再用URLErou進行捕捉。所以URL Error起到了兜底的作用。
總結
以上是生活随笔為你收集整理的网络爬虫(urllib超详细使用指南)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用urllib3 抓取博客列表
- 下一篇: 网络库urillib3