Python 爬蟲入門

python2中常用的包是urllib2,而在python3中常用的是urllib.request,兩者在常用的功能是等價(jià)的,這里以python3為例

1 網(wǎng)頁(yè)原理介紹

1.1 什么是爬蟲

爬蟲,即網(wǎng)絡(luò)爬蟲,大家可以理解為在網(wǎng)絡(luò)上爬行的一直蜘蛛,互聯(lián)網(wǎng)就比作一張大網(wǎng),而爬蟲便是在這張網(wǎng)上爬來爬去的蜘蛛咯,如果它遇到資源,那么它就會(huì)抓取下來。想抓取什么?這個(gè)由你來控制它咯。

比如它在抓取一個(gè)網(wǎng)頁(yè),在這個(gè)網(wǎng)中他發(fā)現(xiàn)了一條道路,其實(shí)就是指向網(wǎng)頁(yè)的超鏈接,那么它就可以爬到另一張網(wǎng)上來獲取數(shù)據(jù)。這樣,整個(gè)連在一起的大網(wǎng)對(duì)這之蜘蛛來說觸手可及,分分鐘爬下來不是事兒。

1.2 瀏覽網(wǎng)頁(yè)的過程

在用戶瀏覽網(wǎng)頁(yè)的過程中,我們可能會(huì)看到許多好看的圖片,比如http://image.baidu.com/,我們會(huì)看到幾張的圖片以及百度搜索框,這個(gè)過程其實(shí)就是用戶輸入網(wǎng)址之后,經(jīng)過DNS服務(wù)器,找到服務(wù)器主機(jī),向服務(wù)器發(fā)出一個(gè)請(qǐng)求,服務(wù)器經(jīng)過解析之后,發(fā)送給用戶的瀏覽器 HTML、JS、CSS 等文件,瀏覽器解析出來,用戶便可以看到形形色色的圖片了。

因此,用戶看到的網(wǎng)頁(yè)實(shí)質(zhì)是由 HTML 代碼構(gòu)成的,爬蟲爬來的便是這些內(nèi)容,通過分析和過濾這些 HTML 代碼,實(shí)現(xiàn)對(duì)圖片、文字等資源的獲取。

1.3 URL的含義

URL,即統(tǒng)一資源定位符,也就是我們說的網(wǎng)址,統(tǒng)一資源定位符是對(duì)可以從互聯(lián)網(wǎng)上得到的資源的位置和訪問方法的一種簡(jiǎn)潔的表示,是互聯(lián)網(wǎng)上標(biāo)準(zhǔn)資源的地址。互聯(lián)網(wǎng)上的每個(gè)文件都有一個(gè)唯一的URL,它包含的信息指出文件的位置以及瀏覽器應(yīng)該怎么處理它。

URL的格式由三部分組成:

①第一部分是協(xié)議(或稱為服務(wù)方式)。

②第二部分是存有該資源的主機(jī)IP地址(有時(shí)也包括端口號(hào))。

③第三部分是主機(jī)資源的具體地址,如目錄和文件名等。

爬蟲爬取數(shù)據(jù)時(shí)必須要有一個(gè)目標(biāo)的URL才可以獲取數(shù)據(jù),因此,它是爬蟲獲取數(shù)據(jù)的基本依據(jù),準(zhǔn)確理解它的含義對(duì)爬蟲學(xué)習(xí)有很大幫助。

1.4 HTTP請(qǐng)求流程

1.4.1 建立連接

建立連接后,客戶機(jī)發(fā)送一個(gè)請(qǐng)求給服務(wù)器,請(qǐng)求方式的格式為:統(tǒng)一資源標(biāo)識(shí)符(URL)、協(xié)議版本號(hào),后邊是MIME信息包括請(qǐng)求修飾符、客戶機(jī)信息和可能的內(nèi)容。
服務(wù)器接到請(qǐng)求后,給予相應(yīng)的響應(yīng)信息,其格式為一個(gè)狀態(tài)行,包括信息的協(xié)議版本號(hào)、一個(gè)成功或錯(cuò)誤的代碼,后邊是MIME信息包括服務(wù)器信息、實(shí)體信息和可能的內(nèi)容。
客戶端接收服務(wù)器所返回的信息通過瀏覽器顯示在用戶的顯示屏上,然后客戶機(jī)與服務(wù)器斷開連接。

1.4.2 請(qǐng)求報(bào)頭

請(qǐng)求報(bào)頭允許客戶端向服務(wù)器端傳遞請(qǐng)求的附加信息以及客戶端自身的信息。

常用報(bào)頭:
1. Accept
Accept請(qǐng)求報(bào)頭域用于指定客戶端接受哪些類型的信息。
eg :Accept:image/gif,表明客戶端希望接受GIF圖象格式的資源;
Accept:text/html,表明客戶端希望接受html文本。
2. Accept-Charset
Accept-Charset請(qǐng)求報(bào)頭域用于指定客戶端接受的字符集。
eg :Accept-Charset:iso-8859-1,gb2312.如果在請(qǐng)求消息中沒有設(shè)置這個(gè)域,缺省是任何字符集都可以接受。
3. Accept-Encoding
Accept-Encoding請(qǐng)求報(bào)頭域類似于Accept,但是它是用于指定可接受的內(nèi)容編碼。
eg :Accept-Encoding:gzip.deflate.如果請(qǐng)求消息中沒有設(shè)置這個(gè)域服務(wù)器假定客戶端對(duì)各種內(nèi)容編碼都可以接受。
4. Accept-Language
Accept-Language請(qǐng)求報(bào)頭域類似于Accept,但是它是用于指定一種自然語(yǔ)言。
eg :Accept-Language:zh-cn.如果請(qǐng)求消息中沒有設(shè)置這個(gè)報(bào)頭域,服務(wù)器假定客戶端對(duì)各種語(yǔ)言都可以接受。Authorization
5. Host
Host請(qǐng)求報(bào)頭域主要用于指定被請(qǐng)求資源的Internet主機(jī)和端口號(hào)。
eg :http://www.guet.edu.cn/index.html
Host:www.guet.edu.cn 此處使用缺省端口號(hào)80
6. User-Agent
User-Agent請(qǐng)求報(bào)頭域允許客戶端將它的操作系統(tǒng)、瀏覽器和其它屬性告訴服務(wù)器。不過,這個(gè)報(bào)頭域不是必需的。

相應(yīng)報(bào)頭:

響應(yīng)報(bào)頭允許服務(wù)器傳遞不能放在狀態(tài)行中的附加響應(yīng)信息,以及關(guān)于服務(wù)器的信息和對(duì)Request-URI所標(biāo)識(shí)的資源進(jìn)行下一步訪問的信息。

1. Location
Location響應(yīng)報(bào)頭域用于重定向接受者到一個(gè)新的位置。Location響應(yīng)報(bào)頭域常用在更換域名的時(shí)候。
2.Server
Server響應(yīng)報(bào)頭域包含了服務(wù)器用來處理請(qǐng)求的軟件信息。
3.WWW-Authenticate
WWW-Authenticate響應(yīng)報(bào)頭域必須被包含在401(未授權(quán)的)響應(yīng)消息中,客戶端收到401響應(yīng)消息時(shí)候,并發(fā)送Authorization報(bào)頭域請(qǐng)求服務(wù)器對(duì)其進(jìn)行驗(yàn)證時(shí),服務(wù)端響應(yīng)報(bào)頭就包含該報(bào)頭域。
eg :WWW-Authenticate:Basic realm=Basic Auth Test! //可以看出服務(wù)器對(duì)請(qǐng)求資源采用的是基本驗(yàn)證機(jī)制。

一個(gè)比較好的例子

2 爬蟲

2.1 簡(jiǎn)單的例子

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)

接下來我們來分解整個(gè)過程,首先上面的獲取過程分為兩步:
1、發(fā)送GET請(qǐng)求

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ù),同時(shí)也可以POST數(shù)據(jù)

data=urllib.request.urlopen(req).read()
# 這個(gè)過程也可以POST登陸信息
login_data=urllib.parse.urlencode({'username':email,'password':password,'entry':'mweibo'})
urllib.request.urlopen(req,data=login_data.encode('utf-8'))

2.2 高級(jí)方法

cookie使用

進(jìn)階

selenium 萬能爬蟲

selenium

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 基礎(chǔ)知識(shí) HTTP協(xié)議 我們?yōu)g覽網(wǎng)頁(yè)的瀏覽器和手機(jī)應(yīng)用客戶端與服務(wù)器通信幾乎都是基于HTTP協(xié)議,而爬蟲可以看作是...
    腩啵兔子閱讀 1,700評(píng)論 0 17
  • Author :Jeffrey由于原文找不到,特意找了一個(gè)轉(zhuǎn)載的: 轉(zhuǎn)載地址 引言 HTTP是一個(gè)屬于應(yīng)用層的面向...
    夜殤丶夜逝閱讀 922評(píng)論 1 10
  • 轉(zhuǎn)自:http://blog.csdn.net/gueter/archive/2007/03/08/1524447...
    喜歡吃栗子閱讀 542評(píng)論 0 1
  • 2008-11-03 09:11 by Hundre,848587閱讀,35評(píng)論,收藏,編輯 轉(zhuǎn)自:http://...
    牛1688閱讀 839評(píng)論 0 11
  • 一 NSThread的基本使用1)NSThread創(chuàng)建的四種方式第一種 創(chuàng)建方式alloc initwith .....
    小小Q吖閱讀 244評(píng)論 0 0

友情鏈接更多精彩內(nèi)容