【问题标题】:Scrapy Selenium unable to make Request() callbackScrapy Selenium 无法进行 Request() 回调
【发布时间】:2016-01-23 18:49:31
【问题描述】:

如果所有内容都在同一个函数parse() 中,Scrapy 和 Selenium 会很好,但是因为我需要在解析函数中添加更多代码,所以我想将抓取部分拆分为分离函数 parse_data() 并使用 Request() 但回调根本不起作用。

class MySpider(Spider):
    name = "myspider"
    start_urls = ["http://example.com/Data.aspx",]

    def __init__(self, *args, **kwargs):
        super(MySpider, self).__init__(*args, **kwargs)
        self.driver = webdriver.Firefox()
        dispatcher.connect(self.spider_closed, signals.spider_closed)

    def spider_closed(self, spider):
        self.driver.close()

    def parse(self, response):
        item = MyItem()
        self.driver.get(response.url)
        sel = Selector(response)

        buttons = len(self.driver.find_elements_by_xpath("//input[@class='buttonRowDetails']"))

        for x in range(buttons): 
            time.sleep(5)
            button = self.driver.find_elements_by_xpath("//input[@class='buttonRowDetails']")[x]
            button.click()
            time.sleep(5)

            response = TextResponse(url=self.driver.current_url, body=self.driver.page_source, encoding='utf-8')
            print '\n\n\nHELLO FROM PARSE'

            yield Request(response.url, meta={'item': item}, callback=self.parse_data)

    def parse_data(self, response):

        item = response.meta['item']
        print '\n\nHELLO FROM PARSE_DATA'

【问题讨论】:

    标签: selenium web-scraping scrapy


    【解决方案1】:

    猜测您的请求已被过滤,因为它转到相同的 URL(默认情况下打开了重复请求过滤中间件)。

    使用dont_filter 参数关闭过滤:

    yield Request(response.url, 
                  meta={'item': item}, 
                  callback=self.parse_data, 
                  dont_filter=True)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-07
      • 2013-09-21
      • 1970-01-01
      • 2015-02-24
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      相关资源
      最近更新 更多