python爬蟲urllib使用和進階
上節課已經介紹了爬蟲的基本概念和基礎內容,接下來就要開始內容的爬取了。
其實爬蟲就是瀏覽器,只不過它是一個特殊的瀏覽器。爬取網頁就是通過HTTP協議訪問相應的網頁,不過通過瀏覽器訪問往往是人的行為,把這種行為變成使用程序來訪問就是爬蟲的過程。
用戶在使用瀏覽器的時候,翻閱速度是比較慢的,但是爬蟲在訪問的時候速度是很快的,它會很快的獲取到頁面上的內容,並將其變成自己網站的內容,所以對於開發者來講,對於這些搜索引擎的爬蟲是又愛又恨的。
有的網站會設置反爬蟲策略來拒絕爬蟲對網站內容的爬取要求。此時我們要爬取這種網站的話,是要對程序進行包裝的,儘量去模擬人的行為來獲取網站內容。
urllib包
urllib是Python提供的一個工具包,用來處理url和相應的一些內容的。
Python 2中提供了urllib和urllib 2。urllib提供較為底層的接口, urllib2對urllib進行了進一步封裝。
Python 3中將urllib合併到了urllib 2中, 並只提供了標準庫urllib包。我們重點使用的是Python3,但是它們的接口都是相同的,掌握了就可以在任何場景使用。
urllib還有一些子包,分別介紹下:
urllib.request模塊(用的比較多)
用於打開和讀寫url。模塊定義了在基本和摘要式身份驗證、重定向、cookies等應用中打開URL(主要是HTTP)的函數和類。
- urllib.error 包含了由urllib.request引起的異常
- urllib.parse 用於解析url
- urllib.robot parser 分析robots.txt文件
urlopen方法
格式:url open(url, data=None)
註釋:url是鏈接地址字符串, 或請求對象。
data是提交的數據, 如果data為None發起GET請求, 否則發起POST請求。見urllib.request.Request#get_method
返回http.client.HTTPResponse
類的響應對象, 這是一個類文件對象。
接下來看一段代碼:
驗證其中的“返回真正的URL”:打開http://www.bing.com 按下F12 打開其中的Network狀態欄,點擊刷新:
可以看到第一個訪問的是必應網站,這裡的301代表的意思是,首先打開必應的網站,然後通過持久的移動到中國的必應網站;
這裡的location是跳轉位置,301代表永久的跳轉,302 代表的是臨時的跳轉;
代碼運行結果:
可以發現,urlopen是可以自動跳轉的。
總結:
上例, 通過urllib.request.url open方法, 發起一個HTTP的GET請求, WEB服務器返回了網頁內容。響應的數據被封裝到類文件對象中, 可以通過read方法、readline方法、read lines方法獲取數據, status和reason屬性表示返回的狀態碼, info方法返回頭信息, 等等。
User-Agent問題
上例的代碼非常精簡, 即可以獲得網站的響應數據。url open方法只能傳遞url和data這樣的數據, 不能構造HTTP的請求。例如useragent。
源碼中構造的useragent如下:
當前顯示為:Python-urllib/3.6
有些網站是反爬蟲的,所以要把爬蟲偽裝成瀏覽器。隨便打開一個瀏覽器,複製瀏覽器的UA值,進行偽裝。
UA值獲取方法:
打開瀏覽器的設置。選擇高級,選擇自定義UserAgent字符串,隨意切換想要的UA值。
這裡演示的是使用Chrome的ua值:
通過UA值的偽裝,就可以告訴別人,“我是一個瀏覽器”,那麼UA值該如何使用呢?這裡就要用到request類:
Request類
首先它會有一個header,在這裡記錄了一些基本的信息:
還要有一個User-agent,這裡是一些版本的要求,以及對能接受的瀏覽器版本、CSS樣式等信息的描述:
有了以上兩個參數,就可以構建一個request請求了。
接下來就是對request的使用實戰演示:
運行結果為:
總結:
格式:Request(url, data=None, headers=() )
要在發起請求之前將內容填充完畢!
初始化方法, 構造一個請求對象。可添加一個header的字典。data參數決定是GET還是POST請求。add_header(key, val) 為header中增加一個鍵值對。
接下來看一個示例:
from urllib.request import Request, url open
import random#隨機函數,用來隨機UA值
#打開一個url返回一個Request請求對象
#url='https://movie.douban.com/'#注意尾部的斜槓一定要有
url='http://www.bing.com/'
ua_list=[#包含UA值的List,不停地切換地址,保證不被發現是爬蟲
”Mozilla/5.0(WindowsNT I 6.1; Win 64; x 64) Apple WebKit/537.36(KHTML, like Gecko)Chrome /57.0.2987. 133 Safari/537.36”, #chrome
”Mozilla/5.0(Windows; U; WindowsNT 6.1; zh-CN) Apple webKit/537.36(KHTML, like Gecko)Version /5.0. 1 Safari/537.36”, #safa fi
”Mozilla/5.0(WindowsNT 6.1; Win 64; x 64; rv:50. 0) Gecko/ 20100101 Firefox/50.0”, #Firefox“Mozilla/5.0(compatible; MSIE 9.0; WindowsNT 6.1; Trident/5.0) ”#IE
ua=random.choice(ua_list) #隨機一個UA值
#ua需要加到請求頭中
request=Request(url)
request.add_header('User-Agent', random.choice(ua_list) )
print(type(request) )
response=url open(request, timeout=20) #request對象或者url都可以
print(type(response) )
with response:
print(1, response.status, response.get code() , response.reason)#狀態, get code本質上就是返回
status
print(2, response.geturl() )#返回數據的url。如果重定向, 這個url和原始url不一樣
# 例如原始url是http://www.bing.com/, 返回http://cn.bing.com/
print(3, response.info() )#返回響應頭headers
print(4, response.read() )#讀取返回的內容
print(5, request.get_header('User-agent') )
print(6,'user-agent'.capitalize() )
執行結果為:
到這裡就完成了對User-agent的修改,同時也學會了request和urlopen的使用方式。
上述的簡單代碼是學習爬蟲的第一步,就算以後在開發中會用到框架,但是還是從基本內容出發的,希望同學們可以多加了解!
點擊查看配套視頻課程
獲取更多內容,請訂閱 Python學習站 官方技術圈!