我试图抓一个使用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()
请帮助。
答案 0 :(得分:0)
Selenium与scrapy及其response
对象没有任何关联,在您的代码中我没有看到您更改response
对象。
你必须独立合作。
答案 1 :(得分:0)
一起使用selenium
和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()