2016-10-26 24 views
0

我有問題selenium和scrapy對象之間進行通信。如何編寫用於硒和Scrapy的定製下載器中間件?

我使用硒登錄到某個網站,一旦我得到了這個響應,我想使用scrape的工作人員來解析和處理。請有人幫我編寫中間件,以便每個請求都應該通過selenium web驅動程序,並且響應應該傳遞給scrapy。

謝謝!

回答

3

這是非常簡單的,創建一箇中間件來的webdriver和使用process_request攔截請求,丟棄它並使用URL它必須將它傳遞給你的硒的webdriver:

from scrapy.http import HtmlResponse 
from selenium import webdriver 


class DownloaderMiddleware(object): 
    def __init__(self): 
     self.driver = webdriver.Chrome() # your chosen driver 

    def process_request(self, request, spider): 
     # only process tagged request or delete this if you want all 
     if not request.meta.get('selenium'): 
      return 
     self.driver.get(request.url) 
     body = self.driver.page_source 
     response = HtmlResponse(url=self.driver.current_url, body=body) 
     return response 

這樣做的缺點是你必須擺脫蜘蛛中的併發,因爲硒webdrive一次只能處理一個url。有關詳情,請參閱settings documentation page

+0

嗨Granitosaurus,謝謝你的迴應。 我想知道我需要對seetting.py做些什麼改變,我應該給這個中間件什麼名字,以及我應該把它保存在我的項目中。 謝謝。 – world

+0

@world你可以看到如何激活一個自定義的中間件[這裏](https://doc.scrapy.org/en/latest/topics/downloader-middleware.html#activating-a-downloader-middleware) – Granitosaurus

+0

它是不真誠的說它是直截了當的,因爲當你繞過整個Downloader時,你不僅僅以併發性的方式打破了這種局面。節流,cookies,頭文件,代理等等都不會被正確設置,Selenium會使用它的默認值進行提取。而且,響應對象不會正確設置它的屬性,例如'status'和'headers'。 – Rejected