爬蟲簡(jiǎn)介
什么是爬蟲?
是一種按照一定的規(guī)則箫柳,自動(dòng)地抓取互聯(lián)網(wǎng)信息的程序或者腳本手形。
所謂網(wǎng)頁(yè)抓取,就是把URL地址中指定的網(wǎng)絡(luò)資源從網(wǎng)絡(luò)流中讀取出來(lái)悯恍,保存到本地库糠。 在
Python中有很多庫(kù)可以用來(lái)抓取網(wǎng)頁(yè)
分類
通用爬蟲(General Purpose Web Crawler)、 聚焦爬蟲(Focused Web Crawler)、增量
式爬蟲(Incremental Web Crawler)瞬欧、深層爬蟲(Deep Web Crawler)
通用網(wǎng)絡(luò)爬蟲
捜索引擎抓取系統(tǒng)(Baidu贷屎、Google、Yahoo 等)的重要組成部分艘虎。主要目的是將互聯(lián)
網(wǎng)上的網(wǎng)頁(yè)下載到本地唉侄,形成一個(gè)互聯(lián)網(wǎng)內(nèi)容的鏡像備份。
聚焦爬蟲
是"面向特定主題需求"的一種網(wǎng)絡(luò)爬蟲程序野建,它與通用搜索引擎爬蟲的區(qū)別在于: 聚焦
爬蟲在實(shí)施網(wǎng)頁(yè)抓取時(shí)會(huì)對(duì)內(nèi)容進(jìn)行處理篩選属划,盡量保證只抓取與需求相關(guān)的網(wǎng)頁(yè)信息。
增量式抓取
是指在具有一定量規(guī)模的網(wǎng)絡(luò)頁(yè)面集合的基礎(chǔ)上候生,采用更新數(shù)據(jù)的方式選取已有集合中的過(guò)
時(shí)網(wǎng)頁(yè)進(jìn)行抓取同眯,以保證所抓取到的數(shù)據(jù)與真實(shí)網(wǎng)絡(luò)數(shù)據(jù)足夠接近。進(jìn)行增量式抓取的前提
是唯鸭,系統(tǒng)已經(jīng)抓取了足夠數(shù)量的網(wǎng)絡(luò)頁(yè)面须蜗,并具有這些頁(yè)面被抓取的時(shí)間信息。
深度爬蟲
針對(duì)起始url地址進(jìn)行數(shù)據(jù)采集肿孵,在響應(yīng)數(shù)據(jù)中進(jìn)行數(shù)據(jù)篩選得到需要進(jìn)行數(shù)據(jù)采集的下一
波url地址唠粥,并將url地址添加到數(shù)據(jù)采集隊(duì)列中進(jìn)行二次爬取..以此類推疏魏,一致到所有頁(yè)面
的數(shù)據(jù)全部采集完成即可完成深度數(shù)據(jù)采集停做,這里的深度指的就是url地址的檢索深度。
爬蟲步驟
網(wǎng)頁(yè)抓取大莫,數(shù)據(jù)提取蛉腌,數(shù)據(jù)存儲(chǔ)
HTTP協(xié)議
HTTP,HyperText Transfer Protocol只厘,是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議烙丛。
是一個(gè)基于TCP/IP通信協(xié)議來(lái)傳遞數(shù)據(jù),一個(gè)屬于應(yīng)用層的協(xié)議
瀏覽器作為HTTP客戶端通過(guò)URL向HTTP服務(wù)端即WEB服務(wù)器發(fā)送所有請(qǐng)求羔味。Web服
務(wù)器根據(jù)接收到的請(qǐng)求后河咽,向客戶端發(fā)送響應(yīng)信息。
HTTPS(Hypertext Transfer Protocol over Secure Socket Layer)HTTP的安全版赋元,在
HTTP下加入SSL層忘蟹。
SSL(Secure Sockets Layer 安全套接層)主要用于Web的安全傳輸協(xié)議,在傳輸層對(duì)網(wǎng)
絡(luò)連接進(jìn)行加密搁凸,保障在Internet上數(shù)據(jù)傳輸?shù)陌踩?/p>
? HTTP 的端口號(hào)為 80媚值,
? HTTPS 的端口號(hào)為 443
urlib的使用
在Python3.x中,我們可以使用urlib這個(gè)組件抓取網(wǎng)頁(yè)护糖,urllib是一個(gè)URL處理包褥芒,這個(gè)
包中集合了一些處理URL的模塊
1.urllib.request模塊是用來(lái)打開和讀取URLs的;
2.urllib.error模塊包含一些有urllib.request產(chǎn)生的錯(cuò)誤嫡良,可以使用try進(jìn)行捕捉處理锰扶;
3.urllib.parse模塊包含了一些解析URLs的方法献酗;
4.urllib.robotparser模塊用來(lái)解析robots.txt文本文件.它提供了一個(gè)單獨(dú)的RobotFileP
arser類,通過(guò)該類提供的can_fetch()方法測(cè)試爬蟲是否可以下載一個(gè)頁(yè)面少辣。
urllib.request.urlopen()
這個(gè)接口函數(shù)就可以很輕松的打開一個(gè)網(wǎng)站凌摄,讀取并打印信息。
from urllib import request
if __name__ == "__main__":
? ? response = request.urlopen("http://fanyi.baidu.com")
? ? html = response.read()
print(html)
說(shuō)明
request.urlopen()打開和讀取URLs信息漓帅,返回對(duì)象response
可以調(diào)用read()锨亏,進(jìn)行讀取。
print()忙干,將讀到的信息打印出來(lái)器予。
其實(shí)這就是瀏覽器接收到的信息,只不過(guò)我們?cè)谑褂脼g覽器的時(shí)候捐迫,瀏覽器已經(jīng)將這些信息
轉(zhuǎn)化成了界面信息供我們?yōu)g覽乾翔。
網(wǎng)頁(yè)編碼
雖然我們已經(jīng)成功獲取了信息,但是顯然他們都是二進(jìn)制的亂碼
可以通過(guò)簡(jiǎn)單的decode()命令將網(wǎng)頁(yè)的信息進(jìn)行解碼
from urllib import request
if __name__ == "__main__":
? ? response = request.urlopen("http://fanyi.baidu.com/")
? ? html = response.read()
? ? html = html.decode("utf-8")
print(html)
自動(dòng)獲取網(wǎng)頁(yè)編碼
chardet
第三方庫(kù)施戴,用來(lái)判斷編碼的模塊
使用chardet.detect()方法反浓,判斷網(wǎng)頁(yè)的編碼方式
安裝方法:
pip install chardet
代碼:
from urllib import request
import chardet
if __name__ == "__main__":
? ? response = request.urlopen("http://fanyi.baidu.com/")
? ? html = response.read()
? ? charset = chardet.detect(html)
? ? print(charset)
Request對(duì)象
反爬蟲機(jī)制:
1、 封殺爬蟲程序
2赞哗、 封殺指定IP
3雷则、 封殺非人操作的程序
如果需要執(zhí)行更復(fù)雜的操作,比如增加 HTTP 報(bào)頭肪笋,必須創(chuàng)建一個(gè) Request 實(shí)例來(lái)作為
urlopen()的參數(shù)月劈;而需要訪問(wèn)的 url 地址則作為 Request 實(shí)例的參數(shù)。
from urllib import request
if __name__ == "__main__":? ? ?
req = request.Request("http://fanyi.baidu.com/")? ??
?response = request.urlopen(req)
html = response.read() html = html.decode("utf-8") print(html)
User Agent
瀏覽器就是互聯(lián)網(wǎng)世界上公認(rèn)被允許的身份藤乙,如果我們希望我們的爬蟲程序更像一個(gè)真
實(shí)用戶猜揪,那我們第一步,就是需要偽裝成一個(gè)被公認(rèn)的瀏覽器坛梁。用不同的瀏覽器在發(fā)送
請(qǐng)求的時(shí)候而姐,會(huì)有不同的 User-Agent 頭。中文名為用戶代理划咐,簡(jiǎn)稱UA
User Agent存放于Headers中
服務(wù)器就是通過(guò)查看Headers中的User Agent來(lái)判斷是誰(shuí)在訪問(wèn)拴念。
urllib中默認(rèn)的User Agent,會(huì)有Python的字樣尖殃,如果服務(wù)器檢查User Agent丈莺,可以拒
絕Python程序訪問(wèn)網(wǎng)站。
常見瀏覽器User-Agent:
https://blog.csdn.net/Kwoky/article/details/80381246
設(shè)置User Agent
方法 1:在創(chuàng)建 Request 對(duì)象的時(shí)候送丰,填入 headers 參數(shù)(包含 User Agent 信息)缔俄,這個(gè)
Headers參數(shù)要求為字典;
方法2:在創(chuàng)建Request對(duì)象的時(shí)候不添加headers參數(shù),在創(chuàng)建完成之后俐载,使用add_h
eader()的方法蟹略,添加headers。
代理分類
代理可以分為三種遏佣,即高度匿名代理挖炬、普通匿名代理和透明代理。
高度匿名代理 隱藏客戶的真實(shí)IP状婶,但是不改變客戶機(jī)的請(qǐng)求意敛,就像有個(gè)真正的客戶瀏覽器
在訪問(wèn)服務(wù)器。
普通匿名代理 能隱藏客戶機(jī)的真實(shí) IP膛虫,會(huì)改變客戶的請(qǐng)求信息草姻,服務(wù)器端不知道你的 ip
地址但有可能認(rèn)為我們使用了代理。
透明代理 不但改變了我們的請(qǐng)求信息稍刀,還會(huì)傳送真實(shí)的IP地址撩独。
爬蟲程序運(yùn)行速度是很快,在網(wǎng)站爬取數(shù)據(jù)時(shí),一個(gè)固定IP的訪問(wèn)頻率就會(huì)很高账月,這不符合
人為操作的標(biāo)準(zhǔn)综膀。所以一些網(wǎng)站會(huì)設(shè)置一個(gè)IP訪問(wèn)頻率的閾值,如果一個(gè)IP訪問(wèn)頻率超過(guò)
這個(gè)閾值局齿,說(shuō)明這個(gè)不是人在訪問(wèn)剧劝,而是一個(gè)爬蟲程序。
解決辦法一:設(shè)置延時(shí)
解決辦法二:使用 IP 代理项炼〉F剑可以設(shè)置一些代理服務(wù)器示绊,每隔一段時(shí)間換一個(gè)代理锭部,就算 IP
被禁止,依然可以換個(gè)IP繼續(xù)爬取面褐。
免費(fèi)短期代理網(wǎng)站舉例:
西刺免費(fèi)代理IP? http://www.xicidaili.com/
快代理免費(fèi)代理? http://www.kuaidaili.com/free/inha/
聚合數(shù)據(jù) https://www.juhe.cn/docs/api/id/62
代理IP選取
西刺網(wǎng)站為例拌禾,選出信號(hào)好的IP
使用代理的步驟:
(1)調(diào)用urlib.request.ProxyHandler(),構(gòu)建處理器對(duì)象展哭,proxies參數(shù)為一個(gè)字典湃窍。
? (2)創(chuàng)建Opener對(duì)象
(3)安裝Opener
使用 install_opener 方法之后,會(huì)將程序默認(rèn)的 urlopen 方法替換掉匪傍。也就是說(shuō)您市,如果使
用install_opener之后,在該文件中役衡,再次調(diào)用urlopen會(huì)使用自己創(chuàng)建好的opener茵休。
代碼:
if __name__ == "__main__":? ??
?#訪問(wèn)網(wǎng)址? ?
?#url = 'http://www.baidu.com/'?
url='http://ip.27399.com/’? ??
?#這是代理 IP? ? proxy = {'http':'113.92.156.185:808'}? ??
#創(chuàng)建 ProxyHandler? ??
?proxy_support = request.ProxyHandler(proxy)? ??
?#創(chuàng)建 Opener? ??
?opener = request.build_opener(proxy_support)? ?
?#添加 User Angent? ??
?opener.addheaders = [('User-Agent','Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36')]