分類
根據(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)頭
- 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"