內容:
美食品類750個商家:
- 商家的頁面url
- 商家的主要信息
- 商家所有的促銷信息(1200+條)
- 商家所有的評論信息(沒爬完,14w+條)
- 發表這些評論的所有用戶的信息(沒爬完,5w+條)
代碼:https://github.com/preke/Spiders/tree/master/DaZhongDianPing
總結和學習的一些點:
大衆點評有反爬機制,直接運行爬蟲,會返回403 forbidden, 所以要換UA, 這裏我參考了這篇文章
http://blog.csdn.net/haipengdai/article/details/48545231
(親測這個中間件太厲害了,同學遇到的輸入驗證碼的問題我都沒遇到)scrapy高度集成,設置完
start_urls
之後,start_request()
根據start_urls
的url生成Request
對象,然後訪問網頁返回一個可迭代的Response
對象,直接默認回調parse()
;parse()
返回的可迭代的Request
對象,直接默認回調start_request()
。
注: 這裏的Request對象和Response對象是scarpy裏定義的:
from scrapy.http import Request
from scrapy.http import Response
具體說明:http://scrapy-chs.readthedocs.io/zh_CN/stable/topics/request-response.html#module-scrapy.http
而具體這個可迭代,因爲內部實現時用迭代器,所以返回的時候,可以在返回對象上加一個’[]’
- 多個爬蟲pipline的問題,這樣解決:
def process_item(self, item, spider):
if spider.name == 'url':
do url things...
elif spider.name == 'shop':
sdo url things...
elif spider.name == 'promotion':
do url things...
elif spider.name == 'comment':
str1 = type(item)
if str(str1) == "<class 'Xiuxian.items.CommentItem'>":
print 'ok'
else:
self.saveOrUpdate(self.user_collection, item)
- 遇到ajax要自己定義請求發送,然後遇到302,原因還是ua的問題,我通過
requests
庫的request
直接發get請求,發現返回的時重定向的頁面,然後把請求委託給scrapy封裝的Request
,就可以獲取信息(因爲會通過中間件來換UA)。
推薦使用postman
先試一下,如果請求需要參數中有時間戳,可以自己隨便設(僅限於本例,其他的還不清楚) - 後來遇到最大的問題是應對大衆點評的反爬機制,中間折騰了各種各樣的方法,不再累述,只說問題的結論:
- 我也遇到了輸入驗證碼和403兩個問題
crawlera
開始收費了- 西次網的代理ip不靠譜,或者說是首頁的ip不靠譜
- 自己用vmware開了6個虛擬機橋接網絡,然後裝上
polipo
做代理- 自己寫代理中間件,從代理池中
random.choice()
的效果不如我寫一個時間片輪轉的效果好,而且橋接網絡的代理ip質量好像也不太高,有些也會被臨時禁用。(本質感覺還是代理質量不高)- 最後用幾個可用的ip代理做輪轉,一個連續發3個請求,然後換另一個,
DOWNLOAD_DELAY
設爲0.25
總結:
- 自己寫的程序質量不高,發送請求的地方應該可以繼續優化;
- 有高質量的代理肯定是好事,會省很多工作,或許說是偷懶的一種方式
- 師兄說了一個點,弄清楚程序發送請求和瀏覽器發送請求的區別,這是努力的一個點
- 引發了一個思考,可能是懂的太少:既然可以用代理池,分佈式爬蟲的意義在哪裏?