Scrapy爬取大衆點評


內容:

美食品類750個商家:

  • 商家的頁面url
  • 商家的主要信息
  • 商家所有的促銷信息(1200+條)
  • 商家所有的評論信息(沒爬完,14w+條)
  • 發表這些評論的所有用戶的信息(沒爬完,5w+條)

代碼:https://github.com/preke/Spiders/tree/master/DaZhongDianPing

總結和學習的一些點:

  1. 大衆點評有反爬機制,直接運行爬蟲,會返回403 forbidden, 所以要換UA, 這裏我參考了這篇文章
    http://blog.csdn.net/haipengdai/article/details/48545231
    (親測這個中間件太厲害了,同學遇到的輸入驗證碼的問題我都沒遇到)

  2. 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
而具體這個可迭代,因爲內部實現時用迭代器,所以返回的時候,可以在返回對象上加一個’[]’

  1. 多個爬蟲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)


  1. 遇到ajax要自己定義請求發送,然後遇到302,原因還是ua的問題,我通過requests庫的request直接發get請求,發現返回的時重定向的頁面,然後把請求委託給scrapy封裝的Request,就可以獲取信息(因爲會通過中間件來換UA)。
    推薦使用postman先試一下,如果請求需要參數中有時間戳,可以自己隨便設(僅限於本例,其他的還不清楚)
  2. 後來遇到最大的問題是應對大衆點評的反爬機制,中間折騰了各種各樣的方法,不再累述,只說問題的結論:

  • 我也遇到了輸入驗證碼和403兩個問題
  • crawlera開始收費了
  • 西次網的代理ip不靠譜,或者說是首頁的ip不靠譜
  • 自己用vmware開了6個虛擬機橋接網絡,然後裝上polipo做代理
  • 自己寫代理中間件,從代理池中random.choice()的效果不如我寫一個時間片輪轉的效果好,而且橋接網絡的代理ip質量好像也不太高,有些也會被臨時禁用。(本質感覺還是代理質量不高)
  • 最後用幾個可用的ip代理做輪轉,一個連續發3個請求,然後換另一個,DOWNLOAD_DELAY 設爲0.25

總結:

  • 自己寫的程序質量不高,發送請求的地方應該可以繼續優化;
  • 有高質量的代理肯定是好事,會省很多工作,或許說是偷懶的一種方式
  • 師兄說了一個點,弄清楚程序發送請求和瀏覽器發送請求的區別,這是努力的一個點
  • 引發了一個思考,可能是懂的太少:既然可以用代理池,分佈式爬蟲的意義在哪裏?
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章