爬蟲(一)

分類

根據(jù)應(yīng)用的場(chǎng)景不同可分為通用爬蟲和聚焦爬蟲

通用爬蟲

通用網(wǎng)絡(luò)爬蟲是捜索引擎抓取系統(tǒng)(Baidu艳吠、Yahoo等)的重要組成部分耀找。主要目的是將互聯(lián)網(wǎng)上的網(wǎng)頁(yè)下載到本地怜械,形成一個(gè)互聯(lián)網(wǎng)內(nèi)容的鏡像備份灾而。

通用搜索引擎(Search Engine)工作原理

第一步:抓取網(wǎng)頁(yè)
第二步:數(shù)據(jù)存儲(chǔ)
第三步:預(yù)處理
第四步:提供檢索服務(wù)饭寺,網(wǎng)站排名

通用性搜索引擎存在的局限性

1.通用搜索引擎對(duì)圖片阻课、數(shù)據(jù)庫(kù)、音頻艰匙、視頻無(wú)能為力限煞,不能很好地發(fā)現(xiàn)和獲取。
2.通用搜索引擎大多提供基于關(guān)鍵字的檢索员凝,難以支持根據(jù)語(yǔ)義信息提出的查詢署驻。

聚焦爬蟲

聚焦爬蟲是為填補(bǔ)通用爬蟲的不足而產(chǎn)生的。

補(bǔ)充

http:80/https:443
URL基本格式:scheme://host[:port#]/path/…/[?query-string][#anchor]

  • scheme:協(xié)議(例如:http, https, ftp)
  • host:服務(wù)器的IP地址或者域名
  • port#:服務(wù)器的端口(如果是走協(xié)議默認(rèn)端口,缺省端口80)
  • path:訪問資源的路徑
  • query-string:參數(shù)旺上,發(fā)送給http服務(wù)器的數(shù)據(jù)
  • anchor:錨(跳轉(zhuǎn)到網(wǎng)頁(yè)的指定錨點(diǎn)位置)
    請(qǐng)求方法:HTTP 1.1中GET, POST 和 HEAD瓶蚂、OPTIONS, PUT, DELETE,TRACE 和 CONNECT。
常用的請(qǐng)求報(bào)頭
  1. Host (主機(jī)和端口號(hào))2. Connection (鏈接類型)3. Upgrade-Insecure-Requests (升級(jí)為HTTPS請(qǐng)求)4. User-Agent (瀏覽器名稱)5. Accept (傳輸文件類型)6. Referer (頁(yè)面跳轉(zhuǎn)處)7. Accept-Encoding(文件編解碼格式)8. Accept-Language(語(yǔ)言種類)9. Accept-Charset(字符編碼)10. Cookie (Cookie)11. Content-Type (POST數(shù)據(jù)類型)
響應(yīng)狀態(tài)碼
  • 200 OK 請(qǐng)求成功
  • 302 重定向
  • 304 使用緩存資源
  • 404 無(wú)法找到訪問的資源
  • 402 服務(wù)器拒絕訪問宣吱,權(quán)限不夠
  • 500 服務(wù)器遇到不可知的問題(最有意思的~~)

Cookie 和 Session

Cookie :放在瀏覽器端的用于記住用戶信息窃这,缺點(diǎn)信息被暴漏出來(lái)了
Session:建立在Cookie之上的,放在服務(wù)器端的用于記錄用戶信息征候,缺點(diǎn)頻繁的對(duì)服務(wù)器進(jìn)行操作杭攻。

urllib2或urllib.request庫(kù)的基本使用

urllib2.urlopen

向指定的url發(fā)送請(qǐng)求,并返回服務(wù)器響應(yīng)的類文件對(duì)象,read方法讀取疤坝,返回的對(duì)象類型為字符串
response = urllib2.urlopen("http://www.baidu.com")

Request和Header

執(zhí)行更復(fù)雜的操作兆解,比如增加HTTP報(bào)頭,必須創(chuàng)建一個(gè) Request 實(shí)例來(lái)作為urlopen()的參數(shù)卒煞;而需要訪問的url地址則作為 Request 實(shí)例的參數(shù)
request = urllib2.Request(url, headers = header)
response = urllib2.urlopen(request)
補(bǔ):也可使用add_header方法添加header

自定義Opener

通過(guò) urllib2.build_opener()方法可支持代理和cookie等http/https的高級(jí)功能痪宰。使用自定義的opener對(duì)象,調(diào)用open()方法發(fā)送請(qǐng)求畔裕。

import urllib2

# 構(gòu)建一個(gè)HTTPHandler 處理器對(duì)象,支持處理HTTP請(qǐng)求乖订,同時(shí)開啟Debug Log扮饶,debuglevel 值默認(rèn) 0
http_handler = urllib2.HTTPHandler(debuglevel=1)

# 構(gòu)建一個(gè)HTTPHSandler 處理器對(duì)象,支持處理HTTPS請(qǐng)求乍构,同時(shí)開啟Debug Log甜无,debuglevel 值默認(rèn) 0
# https_handler = urllib2.HTTPSHandler(debuglevel=1)

# 調(diào)用urllib2.build_opener()方法,創(chuàng)建支持處理HTTP請(qǐng)求的opener對(duì)象
opener = urllib2.build_opener(http_handler)

# 構(gòu)建 Request請(qǐng)求
request = urllib2.Request("http://www.baidu.com/")

# 調(diào)用自定義opener對(duì)象的open()方法哥遮,發(fā)送request請(qǐng)求
response = opener.open(request)

# 獲取服務(wù)器響應(yīng)內(nèi)容
print response.read()
ProxyHandler處理器(代理設(shè)置)

常見的爬蟲和反爬手段岂丘,通過(guò)使用切換代理IP的方法,來(lái)應(yīng)對(duì)網(wǎng)站針對(duì)同一IP在某一時(shí)段訪問量過(guò)多而導(dǎo)致IP被封的情況眠饮。

import urllib2
import random

proxy_list = [
    {"http" : "x.x.x.x:80"},
    {"http" : "x.x.x.x:80"},
    {"http" : "x.x.x.x:80"},
    {"http" : "x.x.x.x:80"},
    {"http" : "x.x.x.x:80"},
]

# 隨機(jī)選擇一個(gè)代理
proxy = random.choice(proxy_list)
# 使用選擇的代理構(gòu)建代理處理器對(duì)象
httpproxy_handler = urllib2.ProxyHandler(proxy)

opener = urllib2.build_opener(httpproxy_handler)

request = urllib2.Request("http://www.baidu.com/")
response = opener.open(request)
print response.read()
ProxyBasicAuthHandler(代理授權(quán)驗(yàn)證)

用于處理代理授權(quán)的身份驗(yàn)證奥帘,HTTPPasswordMgrWithDefaultRealm():來(lái)保存私密代理的用戶密碼,ProxyBasicAuthHandler():來(lái)處理代理的身份驗(yàn)證仪召。

import urllib2
import urllib

# 私密代理授權(quán)的賬戶
user = "mr_mao_hacker"
# 私密代理授權(quán)的密碼
passwd = "sffqry9r"
# 私密代理 IP
proxyserver = "61.158.163.130:16816"

# 1. 構(gòu)建一個(gè)密碼管理對(duì)象寨蹋,用來(lái)保存需要處理的用戶名和密碼
passwdmgr = urllib2.HTTPPasswordMgrWithDefaultRealm()

# 2. 添加賬戶信息,第一個(gè)參數(shù)realm是與遠(yuǎn)程服務(wù)器相關(guān)的域信息扔茅,一般沒人管它都是寫None已旧,后面三個(gè)參數(shù)分別是 代理服務(wù)器、用戶名召娜、密碼
passwdmgr.add_password(None, proxyserver, user, passwd)

# 3. 構(gòu)建一個(gè)代理基礎(chǔ)用戶名/密碼驗(yàn)證的ProxyBasicAuthHandler處理器對(duì)象运褪,參數(shù)是創(chuàng)建的密碼管理對(duì)象
#   注意,這里不再使用普通ProxyHandler類了
proxyauth_handler = urllib2.ProxyBasicAuthHandler(passwdmgr)

# 4. 通過(guò) build_opener()方法使用這些代理Handler對(duì)象,創(chuàng)建自定義opener對(duì)象秸讹,參數(shù)包括構(gòu)建的 proxy_handler 和 proxyauth_handler
opener = urllib2.build_opener(proxyauth_handler)

# 5. 構(gòu)造Request 請(qǐng)求
request = urllib2.Request("http://www.baidu.com/")

# 6. 使用自定義opener發(fā)送請(qǐng)求
response = opener.open(request)

# 7. 打印響應(yīng)內(nèi)容
print response.read()
HTTPBasicAuthHandler處理器(Web客戶端授權(quán)驗(yàn)證)
# 1. 構(gòu)建一個(gè)密碼管理對(duì)象胁后,用來(lái)保存需要處理的用戶名和密碼
passwdmgr = urllib2.HTTPPasswordMgrWithDefaultRealm()

# 2. 添加賬戶信息,第一個(gè)參數(shù)realm是與遠(yuǎn)程服務(wù)器相關(guān)的域信息嗦枢,一般沒人管它都是寫None攀芯,后面三個(gè)參數(shù)分別是 Web服務(wù)器、用戶名文虏、密碼
passwdmgr.add_password(None, webserver, user, passwd)

# 3. 構(gòu)建一個(gè)HTTP基礎(chǔ)用戶名/密碼驗(yàn)證的HTTPBasicAuthHandler處理器對(duì)象侣诺,參數(shù)是創(chuàng)建的密碼管理對(duì)象
httpauth_handler = urllib2.HTTPBasicAuthHandler(passwdmgr)

# 4. 通過(guò) build_opener()方法使用這些代理Handler對(duì)象,創(chuàng)建自定義opener對(duì)象氧秘,參數(shù)包括構(gòu)建的 proxy_handler
opener = urllib2.build_opener(httpauth_handler)

# 5. 可以選擇通過(guò)install_opener()方法定義opener為全局opener
urllib2.install_opener(opener)

# 6. 構(gòu)建 Request對(duì)象
request = urllib2.Request("http://192.168.199.107")

# 7. 定義opener為全局opener后年鸳,可直接使用urlopen()發(fā)送請(qǐng)求
response = urllib2.urlopen(request)

# 8. 打印響應(yīng)內(nèi)容
print response.read()
異常錯(cuò)誤處理

父類URLError和子類HTTPError

import urllib2

requset = urllib2.Request('http://www.reibang.com/u/711615e5008a')

try:
    urllib2.urlopen(requset)

except urllib2.HTTPError, err:
    print err.code

except urllib2.URLError, err:
    print err

else:
    print "Good Job"
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市丸相,隨后出現(xiàn)的幾起案子搔确,更是在濱河造成了極大的恐慌,老刑警劉巖灭忠,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膳算,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡弛作,警方通過(guò)查閱死者的電腦和手機(jī)涕蜂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)映琳,“玉大人机隙,你說(shuō)我怎么就攤上這事∪鳎” “怎么了有鹿?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)谎脯。 經(jīng)常有香客問我葱跋,道長(zhǎng),這世上最難降的妖魔是什么穿肄? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任年局,我火速辦了婚禮,結(jié)果婚禮上咸产,老公的妹妹穿的比我還像新娘矢否。我一直安慰自己,他們只是感情好脑溢,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布僵朗。 她就那樣靜靜地躺著赖欣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪验庙。 梳的紋絲不亂的頭發(fā)上顶吮,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音粪薛,去河邊找鬼悴了。 笑死,一個(gè)胖子當(dāng)著我的面吹牛违寿,可吹牛的內(nèi)容都是我干的湃交。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼藤巢,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼搞莺!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起掂咒,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤才沧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后绍刮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體温圆,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年录淡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了捌木。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嫉戚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出澈圈,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布擒悬,位于F島的核電站榕茧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏诽偷。R本人自食惡果不足惜坤学,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望报慕。 院中可真熱鬧深浮,春花似錦、人聲如沸眠冈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至布卡,卻和暖如春雨让,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背忿等。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工栖忠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人贸街。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓庵寞,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親匾浪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子皇帮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容