Javascript Selenium Click()不适用于scrapy spider

Javascript Selenium Click()不适用于scrapy spider,javascript,selenium-webdriver,click,web-crawler,scrapy,Javascript,Selenium Webdriver,Click,Web Crawler,Scrapy,我正在尝试使用一个scrapy spider从列表页面中刮取产品页面的链接。该页面显示前10台机器,并有一个“显示所有机器”按钮,该按钮调用一些javascript。javascript相当复杂(也就是说,我不能只看函数和按钮指向的url)。我试图使用SeleniumWebDriver来模拟点击按钮,但由于某些原因,它不起作用。当我刮掉产品链接时,我只得到前10个,而不是完整的列表 有人能告诉我为什么它不起作用吗 我要刮的那一页是 蜘蛛在 from scrapy.selector import

我正在尝试使用一个scrapy spider从列表页面中刮取产品页面的链接。该页面显示前10台机器,并有一个“显示所有机器”按钮,该按钮调用一些javascript。javascript相当复杂(也就是说,我不能只看函数和按钮指向的url)。我试图使用SeleniumWebDriver来模拟点击按钮,但由于某些原因,它不起作用。当我刮掉产品链接时,我只得到前10个,而不是完整的列表

有人能告诉我为什么它不起作用吗

我要刮的那一页是

蜘蛛在

from scrapy.selector import HtmlXPathSelector
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.http import Request, FormRequest
from scrapy import log
from scrapy.exceptions import DropItem
from scrapy import signals
from mtispider.items import MachineItem

import urlparse
import time
import MySQLdb
import unicodedata
import re
from mtispider import tools
from selenium import webdriver


class MachineSpider(CrawlSpider):
name = 'nc-spider'
allowed_domains = ['ncservice.com']

def start_requests(self):
    requests = list(super(MachineSpider, self).start_requests())
    requests.append(Request('http://www.ncservice.com/en/second-hand-milling-machines', callback=self.parsencmilllist))
    return requests

def parsencmilllist(self,response):
    hxs=HtmlXPathSelector(response)
    driver= webdriver.Firefox()
    driver.get(response.url)
    try:
        driver.FindElement(By.Id("mas-resultados-fresadoras")).Click()
    except:
        log.msg("Couldnt get all the machines", level=log.INFO)
    ncmachs = hxs.select('//div[@id="resultados"]//a/@href').extract()
    for ncmach in ncmachs:
        yield Request(ncmach,
                      meta = {'type':'Milling'},
                      callback=self.parsencmachine)
    driver.quit()

def parsencmachine(self,response):
    #scrape the machine
    return item

谢谢

主要问题是,您需要从webdriver的
页面\u source
初始化
选择器
,而不是传递到回调中的
响应

from scrapy.contrib.spiders import CrawlSpider
from scrapy.http import Request
from scrapy import Selector

from selenium import webdriver

class MachineSpider(CrawlSpider):
    name = 'nc-spider'
    allowed_domains = ['ncservice.com']

    def start_requests(self):
        yield Request('http://www.ncservice.com/en/second-hand-milling-machines',
                      callback=self.parsencmilllist)

    def parsencmilllist(self, response):
        driver = webdriver.Firefox()

        driver.get(response.url)
        driver.find_element_by_id("mas-resultados-fresadoras").click()

        sel = Selector(text=driver.page_source)
        driver.quit()

        links = sel.xpath('//div[@id="resultados"]//a/@href').extract()
        for link in links:
            yield Request(link,
                          meta={'type': 'Milling'},
                          callback=self.parsencmachine)

    def parsencmachine(self, response):
        print response.url

感谢您的回答,看起来这可能有效,但现在我收到以下错误
selenium.common.exceptions.WebDriverException:Message:无法加载配置文件。配置文件目录:%s如果您在FirefoxBinary构造函数中指定了一个日志文件,请查看它的详细信息。
Firefox今天自动更新,看起来它已经损坏了!我一直看到firefox窗口打开,但页面没有显示,过了一段时间它崩溃了,然后scrapy显示了上述错误。@ahc ok,将firefox降级到34.0.5.ok,修复了firefox问题。不幸的是,点击功能仍然不起作用。爬行器仅将10台机器传递给
parsencmachine
driver.page\u source
的输出仍然包含查看所有机器按钮。我需要某种“等待”来让它有时间装载全套机器吗?明白了。页面确实需要时间重新加载。一个简单的解决方案是直接在
click()函数之后添加
time.sleep(10)
。讨论了一个更完整的解决方案。谢谢你的回答@alecxe,我会把它标记为正确的,除了等待。@ahc是的,这里需要显式的等待。谢谢分享!