豆瓣是如何屏蔽爬蟲的?

本人做項目要用到豆瓣書籍資料,就寫了一個簡單的爬蟲,但是剛爬了幾百本書的信息就被屏蔽了:

HTTP error fetching URL. Status=403, URL=http://book.douban.com/tag/J.K.羅琳?type=Tstart=171

沒辦法,只能等上N個小時後再開始,奇怪的是,被屏蔽後爬蟲不能爬取,但是同樣的鏈接我在瀏覽器里去還是可以訪問,真心不知道豆瓣這是怎麼做得?
我使用的是Jsoup,爬取的代碼是:

Document bookDoc = Jsoup.connect(bookUrl).userAgent(
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.17 (KHTML, like Gecko)
Chrome/24.0.1312.56 Safari/537.17").timeout(maxTimeout).get();

難道豆瓣還根據cookie等信息屏蔽爬蟲?這是我最關心的問題,謝謝~


人家都提供API了你就不要爬了,對網站不友好自己又要費勁解析。

獲取圖書信息

GET https://api.douban.com/v2/book/:id

返回圖書信息,返回status=200
對於授權用戶,返回數據中會帶有該用戶對該圖書的收藏信息:

{
… (圖書信息的其他部分)
"current_user_collection": {
"status":"read",
"rating": {
"max":5,
"value":"5",
"min":0
},
"updated":"2012-11-2012:08:04",
"user_id":"33388491",
"book_id":"6548683",
"id":605519800
}
}

比如三體一書的鏈接為http://book.douban.com/subject/2567698/

鏈接最後的就是id,2567698,直接訪問https://api.douban.com/v2/book/2567698就可以得到《三體》一書的信息,json格式的。
詳見book_v2和快速入門


我原來爬豆瓣相冊圖片的時候,如果不設置時間間隔,很快就被封了,後來每隔幾百毫秒爬一張圖片,沒被封過。另外我爬的數據量小,那個相冊才350張照片。


做爬蟲 不設時間差就是耍流氓不戴套啊 - -


不太清楚豆瓣防屏蔽的具體機制
我之前抓豆瓣的數據也一直被403,後來把程序放到SAE就萬事大吉了。。。

好吧,打個小廣告 豆瓣各種熱帖 豆瓣直播帖 豆瓣直播熱帖 實時脫水版


根據我的測試,我認為主要是根據用戶ip和cookie進行反爬蟲的。
當某個ip訪問太頻繁之後,會判斷相應的cookie,如果cookie表示是同一個用戶,那麼這個用戶就無法訪問了;如果是同一個ip的另一個用戶的cookie的話,就可以訪問;如果是同一個ip下且沒有cookie的話,也是無法訪問的。


這個好幾種方案可以解決,加代理,清session然後換cookie,換headers ,豆瓣好像屏蔽策略一直在換,做為技術練手還是挺好的測試網站的。
另外,急找數據可以萬能的淘寶啊,店鋪:數據大爆炸,硬廣!!


爬太快了,另外偽裝好你的爬蟲,偽裝成ie比較好


專業爬蟲wulf給出了排查的方面。
不知道題主使用fiddler沒有?
用fiddler查看請求連接的request、response。最好將爬蟲的header和fiddler攔截里的header設置成一樣。
不過題主的爬蟲已經爬了很多篇了,看樣子爬蟲是沒問題。
只能試試修改一些參數,再去爬,如果成功了,看看裡面的規律。


雖然沒有實際試過,但一般情況應該就是豆瓣對訪問的瀏覽器進行了判斷,例如識別出是手機瀏覽器就自動跳轉到網站wap版地址,所以按理應該在程序里模擬一下瀏覽器訪問相應地址應該就可以了,PHP里用curl_setopt設置一下CURLOPT_USERAGENT


豆瓣還算友好吧,設置個時間間隔,別太快,換個agent,我爬了好多書也沒被封。


我是寫了一個數組放代理的ip,for循環直到可以爬到內容


剛看了下API也有限制,以下是豆瓣API文檔的原文:不需要授權公開api可以使用http,參數裡面如果不包含apikey的話,限制單ip每小時150次,帶的話每小時500次。


我不停地換UA……爬到現在沒有太大問題……只是會有個別頁面給我404 但是瀏覽器打開正常


用代理, 總是用一個ip頻繁訪問會出這個問題


其實也就是幾種來解決這個問題,大部分網站都會設置惡意抓取信息
1.設置請求頭信息,定期更換頭信息
2.使用代理IP,打一槍換個地方這樣
3.設置時間間隔,就當做是正常訪問一樣,別太快,抓取一次休息一段時間


豆瓣的沒抓過,不過你可以嘗試更換IP地址後再請求,還有就是你的爬蟲發送的請求,是否和你瀏覽器發送的請求一致?
比如你爬蟲的頭信息中是否帶上了referer?
有些網站是根據這個做驗證的。
比如ELONG就是這麼搞的,不帶referer,你什麼都別想請求到。
還有你爬蟲發出的請求中的各個參數是否都正確?
編碼格式是否符合網站要求?


經過我查看他的源代碼,發現他的反爬代碼是這樣的
window._ga_init = function() {
var ga = document.createElement("script");
ga.src = ("https:" == document.location.protocol ? "https://ssl" : "http://www") + ".google-analytics.com/ga.js";
ga.setAttribute("async", "true");
document.documentElement.firstChild.appendChild(ga);
};
if (window.addEventListener) {
window.addEventListener("load", _ga_init, false);
} else {
window.attachEvent("onload", _ga_init);
}
這個是不能下載到本地解析的,因為他必須網址的開頭為 "https://ssl" : "http://www",在本地打開為file:///開頭,他進代碼判斷後立馬load一個錯誤頁面。


我用pyhon做的爬蟲也是這個樣子 不知道怎麼做到的
但可以肯定的是 與cookies無關


這裡有現成寫好的豆瓣爬蟲,可以直接使用
豆瓣採集(按小組)爬蟲


推薦閱讀:

python爬蟲中文編碼的問題?
一份優秀的網路爬蟲工程師簡歷是怎麼樣的?
Python 爬蟲進階?
對於一些加密的動態網頁的數據採集,除了通過phantomjs還有沒有別的通用的方法?
如何避免「用隱形鏈接」的反爬蟲技術?

TAG:爬蟲計算機網路 | 豆瓣 |