Scrapy将download_delay应用于selenium

时间:2014-12-11 15:13:00

标签: python selenium scrapy

我正在使用Selenium的scrapy,这里是蜘蛛纲要

class MySpider(spider.Spider):

    name = "myname"
    start_urls = ["example.com"]

    def __init__(self, *args, *kwargs):
         self.driver = webdriver.PhantomJS()
         super(MySpider, self).__init__(*args, **kwargs)

    def parse(self, response):
        # ignore response, work with selenium instead
        source = self.driver.get(response.url).page_source
        sel = Selector(text=source)
        # now use xpath/css selectors on sel and yield item
        ...

问题是我在抓取不同数量的页面后得到111连接错误(有时是100,有时是200)所以我实现了download_delay和autothrottling,这非常酷。

但是selenium并没有与中间件交谈,而且我并没有真正使用中间件返回的响应。所以我将不得不实现自己的download_delay。

不幸的是,我对扭曲,并发编程等知之甚少,所以在调用time.sleep(secs)合理之前,我不确定是否等同于self.driver.get(阻塞码?)。

使用selenium scrapy解析响应时,如何实现下载延迟?

1 个答案:

答案 0 :(得分:0)

Selenium支持ExplicitImplicit等待。如果您认为等待一定的时间足以加载您的页面,请使用:

self.driver.implicitly_wait(secs)

但如果您想等待特殊事件(例如等待加载特定元素),您可以执行以下操作:

try:
    def find(self.driver):
        dropdown = self.driver.find_element_by_xpath('//a')
        if dropdown:
            return dropdown
        else:
            return False
    element = WebDriverWait(self.driver, secs).until(find)
except:
    self.driver.quit()

显式等待可以帮助您实施DOWNLOAD_DELAY。您只需要等待页面上最后加载的元素。