什么是爬蟲抢埋?
網(wǎng)絡(luò)時(shí)代弹灭,有一種網(wǎng)絡(luò)程序,俗稱網(wǎng)絡(luò)機(jī)器人揪垄。它可以按照一定的規(guī)則代替人們自動(dòng)地在互聯(lián)網(wǎng)中進(jìn)行數(shù)據(jù)信息的采集與整理穷吮,這就是所謂的【爬蟲】。
什么是反爬蟲饥努?
反爬蟲就是和爬蟲抗衡捡鱼。減少被爬取的次數(shù)。其實(shí)就是網(wǎng)站為了維護(hù)自己的核心安全而采取的抑制爬蟲的手段和措施酷愧。
說得簡(jiǎn)單一點(diǎn)驾诈,反步兵就是機(jī)關(guān)槍、反坦克就是火箭炮溶浴。反爬蟲那就是殺蟲劑嘍乍迄!
反爬蟲的手段其實(shí)有很多,今天就給大家分享幾個(gè)我在爬蟲過程中遇到的爬蟲和解決方法士败,希望對(duì)大家能有所幫助闯两!
header
這是關(guān)于反爬最常遇到的也是最為容易解決的一個(gè)問題,先上圖
當(dāng)我們沒有加入header的時(shí)候谅将,服務(wù)器響應(yīng)給我們的是一個(gè)200的正常的return code漾狼。但是就是沒有獲取到后臺(tái)傳過來的數(shù)據(jù)。為什么我們用瀏覽器看的時(shí)候能獲取到數(shù)據(jù)戏自,用爬蟲爬數(shù)據(jù)的時(shí)候就獲取不到呢邦投?
那是因?yàn)槲覀儧]有在獲取的header里面加入cookie、refer和user-agent擅笔。但是這些參數(shù)的具體含義是什么呢志衣,為什么有了它就可以獲取到數(shù)據(jù)呢?
cookie - 側(cè)重于用戶的類型猛们,這里具體指的就是登錄的用戶呢還是游客
refer - 指的是用戶從哪個(gè)頁(yè)面發(fā)出網(wǎng)絡(luò)的訪問和數(shù)據(jù)的請(qǐng)求
user-agent 指的是訪問后臺(tái)服務(wù)器的是哪一個(gè)瀏覽器
所以在模擬請(qǐng)求的時(shí)候念脯,先在headers中加入 User-Agent,如果還不可以請(qǐng)求再嘗試加入 Referer,還無法訪問弯淘,最后再加入 Cookie绿店。
所以建議大家在開局就加入以上參數(shù)。這樣就可以成功的獲取到數(shù)據(jù)了庐橙。
ip
什么是ip反爬呢假勿?
我們平時(shí)在訪問頁(yè)面的時(shí)候,后臺(tái)會(huì)對(duì)我們的行為進(jìn)行統(tǒng)計(jì)态鳖。單位時(shí)間內(nèi)如果同一ip訪問的次數(shù)超過網(wǎng)站設(shè)定的閾值就會(huì)對(duì)我們的ip進(jìn)行不同程度的封禁转培。導(dǎo)致無法繼續(xù)我們的爬蟲操作
那么問題要怎么解決呢?
1. 降低單位時(shí)間的訪問次數(shù)浆竭。也就是給他設(shè)置一定的訪問時(shí)滯浸须。在每次執(zhí) 行完一個(gè)爬蟲操作之后讓爬蟲的線程sleep三秒五秒甚至于8-10秒。
2. 使用代理ip訪問
如何獲取代理ip呢邦泄?
大家可以注冊(cè)西刺代理賬號(hào)删窒,購(gòu)買專業(yè)版代理。
網(wǎng)址:https://www.xicidaili.com/nt/
經(jīng)常爬蟲的伙伴應(yīng)該對(duì)西刺代理并不陌生顺囊,可以免費(fèi)或花錢購(gòu)買可用的IP地址肌索,但是怎么說呢,花錢的ip穩(wěn)定特碳,免費(fèi)的ip經(jīng)常會(huì)掉線诚亚,大家視情況而定嘍
代理ip的設(shè)置方法:
Ajax動(dòng)態(tài)頁(yè)面加載
什么是Ajax動(dòng)態(tài)頁(yè)面加載呢?
傳統(tǒng)的網(wǎng)頁(yè)(不使用 AJAX)如果需要更新內(nèi)容测萎,必須重載整個(gè)頁(yè)面亡电。
AJAX 是一種在無需重新加載整個(gè)網(wǎng)頁(yè)的情況下,能夠更新部分網(wǎng)頁(yè)的技術(shù)硅瞧。意味著可以在不重新加載整個(gè)網(wǎng)頁(yè)的情況下份乒,對(duì)網(wǎng)頁(yè)的某部分進(jìn)行更新。
但是通過Ajax異步加載的網(wǎng)頁(yè)內(nèi)容在網(wǎng)頁(yè)源碼中是沒有的腕唧,網(wǎng)頁(yè)返回的response中是解析不到我們想要的內(nèi)容的或辖。
那么如何判定是動(dòng)態(tài)網(wǎng)頁(yè)呢
是否在url不變的情況下或者是為刷新的情況下,能夠加載頁(yè)面信息
網(wǎng)頁(yè)的源代碼與網(wǎng)頁(yè)結(jié)構(gòu)不同
動(dòng)態(tài)網(wǎng)頁(yè)的爬取方法:
分析頁(yè)面請(qǐng)求枣接,找到真實(shí)的url
使用Selenium模擬瀏覽器行為
咱們以新浪微博為例
當(dāng)我們想爬取該網(wǎng)頁(yè)內(nèi)的新聞颂暇,發(fā)現(xiàn)它的網(wǎng)頁(yè)url一直不變,但是下拉網(wǎng)頁(yè)的時(shí)候會(huì)一直加載但惶,那么我們?cè)撛趺崔k呢耳鸯?
.
F12打開控制臺(tái)湿蛔,選擇XHR異步加載數(shù)據(jù)包,找到頁(yè)面動(dòng)作抓取網(wǎng)絡(luò)數(shù)據(jù)包
通過XHR-->Header-->General-->Request URL县爬,獲取json文件URL地址
通過XHR-->Header-->Query String Parameters(查詢參數(shù))
Ajax有其特殊的請(qǐng)求類型阳啥,它叫做xhr,如上圖所示财喳,我們點(diǎn)開這個(gè)xhr對(duì)應(yīng)的get開頭的請(qǐng)求察迟,可以查看這個(gè)請(qǐng)求的詳細(xì)信息?。
在右側(cè)可以觀察到RequestHeaders耳高、URL和ResponseHeaders等信息扎瓶。RequestHeaders中有一個(gè)信息為X-Requested-With:XMLHttpRequest,這個(gè)標(biāo)注的就是Ajax請(qǐng)求
我們?cè)邳c(diǎn)擊到Preview中可以觀察到返回的是個(gè)人昵稱泌枪、簡(jiǎn)介概荷、頭像等」す耄可以再去到response界面乍赫,觀察一下真實(shí)的返回?cái)?shù)據(jù)
接下來,我們?cè)偃タ匆幌碌谝粋€(gè)請(qǐng)求陆蟆,觀察一下它的response
所以最原始的鏈接就是https://m.weibo.cn/u/2830678474
過濾請(qǐng)求?
接下來我們來篩選出所有的Ajax請(qǐng)求雷厂,只需點(diǎn)擊XHR,然后不斷的滑動(dòng)頁(yè)面叠殷,這樣我們就可以捕獲到所有的Ajax請(qǐng)求了
隨意點(diǎn)開一個(gè)條目改鲫,都可以清楚地看到其 Request URL、Request Headers林束、Response Headers像棘、Response Body 等內(nèi)容,此時(shí)想要模擬請(qǐng)求和提取就非常簡(jiǎn)單了壶冒。
還有一些其他的反扒措施例如?:
登錄才顯示數(shù)據(jù)才可以爬取
限制網(wǎng)頁(yè)返回?cái)?shù)據(jù)條數(shù)
驗(yàn)證碼登錄爬取
APP數(shù)據(jù)爬取
這些在后續(xù)也會(huì)和大家一起分享缕题,希望今天的內(nèi)容能夠?yàn)榇蠹矣袔椭4蠹胰绻麑?duì)Python感興趣的話就來微信公眾號(hào) '神秘程序員007' 和小編一起學(xué)習(xí)吧胖腾!