在selenium浏览器点击后刷新scrapy响应

时间:2015-11-29 10:50:23

标签: python-2.7 selenium web-scraping web-crawler scrapy

我试图抓一个使用Ajax加载不同页面的网站 虽然我的selenium浏览器正在浏览所有页面,但scrapy响应仍然是相同的,它最终会刮取相同的响应(没有页面时间)。

建议的解决方案:
我在一些答案中读到了使用
hxs = HtmlXPathSelector(self.driver.page_source)
您可以更改页面源,然后刮擦。但是它没有用,在添加这个之后浏览器也停止了导航。

 def parse(self, response):
    self.driver.get(response.url)
    pages = (int)(response.xpath('//p[@class="pageingP"]/a/text()')[-2].extract())
    for i in range(pages):
        next = self.driver.find_element_by_xpath('//a[text()="Next"]')
        print response.xpath('//div[@id="searchResultDiv"]/h3/text()').extract()[0]
        try:
            next.click()
            time.sleep(3)
            #hxs = HtmlXPathSelector(self.driver.page_source)
            for sel in response.xpath("//tr/td/a"):
               item = WarnerbrosItem()
               item['url'] = response.urljoin(sel.xpath('@href').extract()[0])
               request = scrapy.Request(item['url'],callback=self.parse_job_contents,meta={'item': item}, dont_filter=True)
               yield request
        except:
            break
    self.driver.close()

请帮助。

2 个答案:

答案 0 :(得分:0)

Selenium与scrapy及其response对象没有任何关联,在您的代码中我没有看到您更改response对象。

你必须独立合作。

答案 1 :(得分:0)

一起使用seleniumscrapy时,在使用硒后执行点击我已经阅读了使用

的页面进行scrapy
resp = TextResponse(url=self.driver.current_url, body=self.driver.page_source, encoding='utf-8')

那将是你的HtmlXPathSelector选择线所走的位置。从那一点到例程结束的所有scrapy代码都需要引用resp(点击后呈现的页面)而不是response(在点击之前呈现的页面)。

time.sleep(3)可能会给您带来问题,因为它不能保证页面实际已加载,这只是一个无条件的等待。使用像

这样的东西可能更好
WebDriverWait(self.driver, 30).until(test page has changed)

等待您等待的页面通过特定测试,例如查找预期的页码或制造商的部件号。

我不确定在通过parse()的每次传递结束时关闭驱动程序的影响是什么。当蜘蛛关闭时,我在我的蜘蛛中使用了以下片段来关闭驱动程序。

def __init__(self, filename=None):
    # wire us up to selenium
    self.driver = webdriver.Firefox()
    dispatcher.connect(self.spider_closed, signals.spider_closed)

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