黑帽SEO

黑帽SEO優化:爬取搜索引擎之眾里尋他尋你千百度

自從Google退出中國市場,百度就成了國內搜索引擎巨頭,所謂樹大招風,一直以來百度成為國內眾多黑客攻擊的對象。又因為其本身作為一款搜索引擎,擁有很多的網絡資源,因此借助百度來獲取海量數據,成為了一種便捷有效的信息收集途徑。

雖然百度在爬蟲算法上沒有google那么優秀,但對中文搜索的支持并不會很差(小小吐槽一番百度),然而在通過百度爬取數據時,我們往往會遇到百度自身的反爬蟲措施,如何解決這些反爬蟲措施,將會是本文的重點。

關于反爬蟲的技術,網上有很多資源,方法不外乎(代理、識別驗證碼、分布式架構、模擬瀏覽器、ADSL切換ip等),這些不是本文的重點,本文只針對爬取百度搜索引擎時遇到的反爬蟲措施,以及一些解決方案。

為甚么要爬取百度
百度沒有提供APi
百度擁有豐富的資源可供查詢
百度反爬蟲沒有那么變態

百度反爬蟲措施
一般來說,單線程的爬蟲時間間隔設置為>2s,短時間內應當不會被屏蔽,當然長時間爬取還是不行;如果使多線程無時間間隔爬取,那么大概30分鐘肯定就會屏蔽了。

我曾嘗試過添加headers,甚至使用phantomjs模擬瀏覽器等方式,均以失敗告終。我想百度作為一家搜索引擎公司,爬蟲技術本就是其核心技術之一,因此跟它玩反爬蟲技術應當是以卵擊石(類似模擬瀏覽器,修改headers等方法應該無效)。

然而我們可以換個思路,百度也不是不允許爬蟲訪問,只是限制了爬取頻率。而對于訪問的headers等信息并沒有做明顯的限制。那么也就是說,百度的反爬蟲實際上是控制單ip訪問的頻率,那么我們就可以通過分布式架構或者切換ip等方式去解決。

被屏蔽現象
在探討如何解決被屏蔽問題前,我們先來研究下被百度屏蔽時的現象。一般來說,當百度檢測到某ip訪問流量特別大時,會先進行源碼提示,如果還沒停止訪問,那么就會直接屏蔽訪問。

源碼提示網絡異常
網頁源碼:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>百度--您的訪問出錯了</title>
<style>
body{text-align:center;margin-top:3px}
#wrap{width:650px;text-align:left;margin:auto}
#logo{float:left;margin:0 3px 0 0}
#logo img{border:0}
#title{float:left;width:510px}
#intitle{margin:20px 0 0 0;background-color:#e5ecf9;width:100%;font-weight:bold;
font-size:14px;padding:3px 0 4px 10px}
#content{clear:left;padding-top:60px;line-height:200%}
#vf{margin-top:10px}
#vf img{float:left;border:1px solid #000}
#kw{font:16px Verdana;height:1.78em;padding-top:2px}
#vf form{float:left;margin:12px 0 0 5px;padding:0}
#ft{text-align:center}
#ft,#ft a{color:#666;font-size:14px}
</style>
</head>
<body>
<div id="wrap">
<div id="logo"><a href="http://www.baidu.com"><img alt="到百度首頁" title="到百
度首頁" src="http://www.baidu.com/img/logo-yy.gif" width="137" height="46"></a>
<
/div>
<div id="title"><div id="intitle">您的訪問出錯了</div></div>
<div id="content">很抱歉,您的電腦或所在的“”“”的訪問,此刻我們無法響應
您的請求。 <br>請輸入以下驗證碼,即可恢復使用。</div>
<div id="vf">
<img src="http://verify.baidu.com/cgi-bin/genimg?6D8B74BFF43F7AE5457E1E8DA8C6335
5C8F00514C99AC6AD0182FCD695A4FED003A2592509E05792FF7A137E4184B4D9D9F5366F" width="120" height="40">
<form action="http://verify.baidu.com/verify">
<input type="hidden" name="url" value="http://www.baidu.com/s?wd=.gov.cn&pn=0&vi
f=1">
<input type="hidden" name="vcode" value="6D8B74BFF43F7AE5457E1E8DA8C63355C8F0051
4C99AC6AD0182FCD695A4FED003A2592509E05792FF7A137E4184B4D9D9F5366F">
<input type="hidden" name="id" value="1488861310">
<input type="hidden" name="di" value="ad617386491a359a">
<input type="text" size="6" maxlength="10" name="verifycode" id="kw">
<input type="submit" value="提交">
</form>
</div>
<div style="clear:left;height:90px"></div>
<div id="ft">&copy;2014 Baidu <a href="http://www.baidu.com/duty/index.html">免
責聲明</a></div>
</div>
<script>
(function(){
var rfr = window.document.location.href,
p = encodeURIComponent(rfr),
img = new Image(),
imgzd = new Image(),
re = /\/vcode\?http:\/\/(\S+)\.baidu/ig,r="";
img.src = "http://nsclick.baidu.com/v.gif?pid=201&pj=vcode&path="+p+"&t="+ne
w Date().getTime();
r = re.exec(rfr);
if(r&&r[1]){imgzd.src = "http://"+r[1]+".baidu.com/v.gif?fr=vcode&url="+p+"&
t="+new Date().getTime();}
})();
</script>
</body>
</html>

直接屏蔽Ip地址
此種情況訪問會報錯。

常規解決方案
基于百度反爬蟲的特點,我們可以通過分布式部署爬蟲服務器,來采集資源,當然個人覺得ADSL服務器效果會更佳。但是分布式部署,尤其是ADSL服務器部署,成本會變得非常高,而且需要維護。那么有沒有只用一臺服務器就可以解決被屏蔽的問題呢?

答案是肯定,那就是單機+多線程+ip代理,這種方式比較實惠,但比較考驗ip代理的穩定性。經個人測試,感覺國內絕大部分代理(收費、免費、動態等)都不是很穩定,因此這是一種折中的方式,那么有沒有更好的方式呢?


另類解決方案
作為一家搜索引擎公司,百度的爬蟲一定是分布式部署;又因為百度在國內的占有率很高,因此其提供搜索服務的服務器也應當是分布式部署的,也就是說全國各地部署了很多百度的服務器。   那么當我們打開瀏覽器,訪問百度時,提供搜索服務的服務器往往是離我們最近的那臺,因此可以想見屏蔽我們的也就是那臺服務器。大膽想象一下,如果我們能自由切換去訪問不同地區的百度服務器,那么是否可以繞過被單一服務器屏蔽的問題呢?

當然這一解決方案的前提是:
1、我們必須擁有大量的百度服務器的ip地址
2、百度允許用ip地址訪問(實在不行就更改host)
可喜的是,以上2點都不難辦到。網上有百度服務器的資源可以獲取,當然也可以通過在不同地區的服務器ping百度獲取ip;至于直接通過ip地址訪問百度,這默認便是可行的(不知道百度為何這樣設置)

百度的大招
c通過以上幾種方式,應該可以繞過百度的反爬蟲機制,但是百度也不是吃素的,它也有自己獨特的反爬蟲殺招,或許稱之為”搜索限制”或者是”資源保護”措施更合適一點。

搜索結果數設上限
通過百度搜索引擎搜索關鍵詞,計算出來的結果數設有上限。

此數量最高顯示上限是1億,其實遠遠不止,因此數據是不真實的。

搜索頁面數設上限
再看搜索的結果頁面數:

最多只顯示76頁,而這只是所有結果中的冰山一角。

cookies影響搜索結果
在幾次爬取過程中,我無意發現在headers中加不加cookies會影響最終的搜索結果(主要影響搜索結果的多少)。
以上幾點嚴格意義上來說,并不算反爬蟲技術,只是一種保護自身資源的方式,其意不言而喻

Baidu_link問題
通過獲取百度搜索結果源碼,以及通過正則匹配,我們能夠得到一些搜索結果鏈接,然后這些鏈接并不是網站原鏈接,有以下2種形式:

http://www.baidu.com/link?url=1qIAIIh_2N7LUQpI0AARembLK2en4QpGjaRqKZ3BxYtzoZYevC5jA2jq6XMwgEKF&wd=&eqid=9581fbec0007eae00000000458200ad4
http://www.baidu.com/link?url=1qIAIIh_2N7LUQpI0AARembLK2en4QpGjaRqKZ3BxYtzoZYevC5jA2jq6XMwgEKF
 

我暫且稱它為”百度鏈接”,其基本就是以上2種形式。第一種是通過點擊右鍵復制鏈接地址獲取到的,通常帶有eqid參數,用來表示referer;第二種是通過頁面源代碼獲取到的,這種是不帶wd與eqid參數的。而eqid參數的值在每次刷新頁面后,都會改變,這可能是百度限制黑帽SEO所設置的一個參數。   那么我們比較兩者之差異,當我們分別取訪問這2條連接時,返回的數據包是不一樣的。

帶eqid參數
第一種帶eqid參數的會返回200,在body里面會有網站真實的鏈接,可以通過正則匹配:
res_baidu=r"window\.location\.replace\(\"([^\"]*)\"\)"

不帶eqid參數

第二種不帶參數的會返回一個302跳轉,并且在header會有location字段,可以通過requests模塊(head模式)去訪問獲取。

解析baidu_link模塊
#! -*- coding:utf-8 -*-'''@解析baidu_link'''__author__="nMask"__Blog__="http://thief.one"__Date__="20170301"
import requests
import reres_baidu=r"window\.location\.replace\(\"([^\"]*)\"\)"
class anbaidulink:headers={'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6',
'Referer':'http://www.baidu.com/link?url='}
def __init__(self):
pass
def run(self,url,one_proxy=""):
'''入口函數,接受baidu_link以及代理地址,默認為"",代理地址要是http://xx.xx.xx.xx:xx格式'''
if "&eqid=" in url:url=self.have_eqid(url,one_proxy)
else:url=self.noeqid(url,one_proxy)
return url
def noeqid(self,url,one_proxy):'''針對baidu_link中沒有eqid參數'''
try:
h=requests.head(url,proxies={'http':one_proxy},headers=anbaidulink.headers,timeout=5).headers #
except Exception,e:
print e
else:url=h["location"]
return url
def have_eqid(self,url,one_proxy):
'''針對baidu_link中存在eqid參數'''
try:body=requests.get(url,proxies={'http':one_proxy},headers=anbaidulink.headers,timeout=5).content #
except Exception,e:print e
else:p=re.compile(res_baidu)
url=p.findall(body)
if len(url)>0:
url=url[0]
return url
if __name__=="__main__":cur=anbaidulink()
url=cur.run(url='https://www.baidu.com/link?url=1qIAIIh_2N7LUQpI0AARembLK2en4QpGjaRqKZ3BxYtzoZYevC5jA2jq6XMwgEKF&wd=&eqid=9581fbec0007eae00000000458200ad4',one_proxy="")
#url=cur.run(url='http://www.baidu.com/link?url=1qIAIIh_2N7LUQpI0AARembLK2en4QpGjaRqKZ3BxYtzoZYevC5jA2jq6XMwgEKF',one_proxy="")
print url

申明:本文只是列舉了我在爬取百度資源時遇到的問題,不代表百度本身所有的反爬蟲技術,本文提供的解決方案具有時效性,具體還需自己動手實驗,如有更好的解決方案可私信交流哦!

更多黑帽SEO優化知識請關注黑帽客(www.thcare.live),一個專注黑帽SEO優化技術研究與學習教程分享的網站!

本文由黑帽客聚合網絡整理轉載發布,轉載請注明來源,謝謝!

本文鏈接:http://www.thcare.live/seo/70.html
贊 ()

急速赛车官网