python2中常用的包是
urllib2,而在python3中常用的是urllib.request,兩者在常用的功能是等價的,這里以python3為例
1 網(wǎng)頁原理介紹
1.1 什么是爬蟲
爬蟲,即網(wǎng)絡(luò)爬蟲,大家可以理解為在網(wǎng)絡(luò)上爬行的一直蜘蛛,互聯(lián)網(wǎng)就比作一張大網(wǎng),而爬蟲便是在這張網(wǎng)上爬來爬去的蜘蛛咯,如果它遇到資源,那么它就會抓取下來。想抓取什么?這個由你來控制它咯。
比如它在抓取一個網(wǎng)頁,在這個網(wǎng)中他發(fā)現(xiàn)了一條道路,其實就是指向網(wǎng)頁的超鏈接,那么它就可以爬到另一張網(wǎng)上來獲取數(shù)據(jù)。這樣,整個連在一起的大網(wǎng)對這之蜘蛛來說觸手可及,分分鐘爬下來不是事兒。
1.2 瀏覽網(wǎng)頁的過程
在用戶瀏覽網(wǎng)頁的過程中,我們可能會看到許多好看的圖片,比如http://image.baidu.com/,我們會看到幾張的圖片以及百度搜索框,這個過程其實就是用戶輸入網(wǎng)址之后,經(jīng)過DNS服務(wù)器,找到服務(wù)器主機,向服務(wù)器發(fā)出一個請求,服務(wù)器經(jīng)過解析之后,發(fā)送給用戶的瀏覽器 HTML、JS、CSS 等文件,瀏覽器解析出來,用戶便可以看到形形色色的圖片了。
因此,用戶看到的網(wǎng)頁實質(zhì)是由 HTML 代碼構(gòu)成的,爬蟲爬來的便是這些內(nèi)容,通過分析和過濾這些 HTML 代碼,實現(xiàn)對圖片、文字等資源的獲取。
1.3 URL的含義
URL,即統(tǒng)一資源定位符,也就是我們說的網(wǎng)址,統(tǒng)一資源定位符是對可以從互聯(lián)網(wǎng)上得到的資源的位置和訪問方法的一種簡潔的表示,是互聯(lián)網(wǎng)上標準資源的地址?;ヂ?lián)網(wǎng)上的每個文件都有一個唯一的URL,它包含的信息指出文件的位置以及瀏覽器應(yīng)該怎么處理它。
URL的格式由三部分組成:
①第一部分是協(xié)議(或稱為服務(wù)方式)。
②第二部分是存有該資源的主機IP地址(有時也包括端口號)。
③第三部分是主機資源的具體地址,如目錄和文件名等。
爬蟲爬取數(shù)據(jù)時必須要有一個目標的URL才可以獲取數(shù)據(jù),因此,它是爬蟲獲取數(shù)據(jù)的基本依據(jù),準確理解它的含義對爬蟲學(xué)習(xí)有很大幫助。
1.4 HTTP請求流程
1.4.1 建立連接
建立連接后,客戶機發(fā)送一個請求給服務(wù)器,請求方式的格式為:統(tǒng)一資源標識符(URL)、協(xié)議版本號,后邊是MIME信息包括請求修飾符、客戶機信息和可能的內(nèi)容。
服務(wù)器接到請求后,給予相應(yīng)的響應(yīng)信息,其格式為一個狀態(tài)行,包括信息的協(xié)議版本號、一個成功或錯誤的代碼,后邊是MIME信息包括服務(wù)器信息、實體信息和可能的內(nèi)容。
客戶端接收服務(wù)器所返回的信息通過瀏覽器顯示在用戶的顯示屏上,然后客戶機與服務(wù)器斷開連接。
1.4.2 請求報頭
請求報頭允許客戶端向服務(wù)器端傳遞請求的附加信息以及客戶端自身的信息。
常用報頭:
1. Accept
Accept請求報頭域用于指定客戶端接受哪些類型的信息。
eg :Accept:image/gif,表明客戶端希望接受GIF圖象格式的資源;
Accept:text/html,表明客戶端希望接受html文本。
2. Accept-Charset
Accept-Charset請求報頭域用于指定客戶端接受的字符集。
eg :Accept-Charset:iso-8859-1,gb2312.如果在請求消息中沒有設(shè)置這個域,缺省是任何字符集都可以接受。
3. Accept-Encoding
Accept-Encoding請求報頭域類似于Accept,但是它是用于指定可接受的內(nèi)容編碼。
eg :Accept-Encoding:gzip.deflate.如果請求消息中沒有設(shè)置這個域服務(wù)器假定客戶端對各種內(nèi)容編碼都可以接受。
4. Accept-Language
Accept-Language請求報頭域類似于Accept,但是它是用于指定一種自然語言。
eg :Accept-Language:zh-cn.如果請求消息中沒有設(shè)置這個報頭域,服務(wù)器假定客戶端對各種語言都可以接受。Authorization
5. Host
Host請求報頭域主要用于指定被請求資源的Internet主機和端口號。
eg :http://www.guet.edu.cn/index.html
Host:www.guet.edu.cn 此處使用缺省端口號80
6. User-Agent
User-Agent請求報頭域允許客戶端將它的操作系統(tǒng)、瀏覽器和其它屬性告訴服務(wù)器。不過,這個報頭域不是必需的。
相應(yīng)報頭:
響應(yīng)報頭允許服務(wù)器傳遞不能放在狀態(tài)行中的附加響應(yīng)信息,以及關(guān)于服務(wù)器的信息和對Request-URI所標識的資源進行下一步訪問的信息。
1. Location
Location響應(yīng)報頭域用于重定向接受者到一個新的位置。Location響應(yīng)報頭域常用在更換域名的時候。
2.Server
Server響應(yīng)報頭域包含了服務(wù)器用來處理請求的軟件信息。
3.WWW-Authenticate
WWW-Authenticate響應(yīng)報頭域必須被包含在401(未授權(quán)的)響應(yīng)消息中,客戶端收到401響應(yīng)消息時候,并發(fā)送Authorization報頭域請求服務(wù)器對其進行驗證時,服務(wù)端響應(yīng)報頭就包含該報頭域。
eg :WWW-Authenticate:Basic realm=Basic Auth Test! //可以看出服務(wù)器對請求資源采用的是基本驗證機制。
2 爬蟲
2.1 簡單的例子
import urllib.request
url= "http://www.baidu.com"
data = urllib.request.urlopen(url).read()
data = data.decode('utf-8')#data是bytes格式,需要轉(zhuǎn)化成unicode格式
print(data)
接下來我們來分解整個過程,首先上面的獲取過程分為兩步:
1、發(fā)送GET請求
req = urllib.request.Request(url)
# 模擬瀏覽器
req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1')
2、獲取返回的數(shù)據(jù),同時也可以POST數(shù)據(jù)
data=urllib.request.urlopen(req).read()
# 這個過程也可以POST登陸信息
login_data=urllib.parse.urlencode({'username':email,'password':password,'entry':'mweibo'})
urllib.request.urlopen(req,data=login_data.encode('utf-8'))