Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用硒+;发痒的_Javascript_Python_Selenium_Scrapy - Fatal编程技术网

Javascript 使用硒+;发痒的

Javascript 使用硒+;发痒的,javascript,python,selenium,scrapy,Javascript,Python,Selenium,Scrapy,我正在尝试将scrapy与selenium结合使用,以便能够与javascript交互,并且仍然拥有scrapy提供的强大的scraping框架。我写了一个脚本,可以访问,在搜索栏中输入“Amsterdam”,然后成功单击搜索按钮。单击搜索按钮后,我希望scrapy从新呈现的页面中检索一个元素。不幸的是,scrapy不返回任何值 这就是我的代码的样子: from selenium import webdriver from scrapy.loader import ItemLoader from

我正在尝试将scrapy与selenium结合使用,以便能够与javascript交互,并且仍然拥有scrapy提供的强大的scraping框架。我写了一个脚本,可以访问,在搜索栏中输入“Amsterdam”,然后成功单击搜索按钮。单击搜索按钮后,我希望scrapy从新呈现的页面中检索一个元素。不幸的是,scrapy不返回任何值

这就是我的代码的样子:

from selenium import webdriver
from scrapy.loader import ItemLoader
from scrapy import Request
from scrapy.crawler import CrawlerProcess
from properties import PropertiesItem
import scrapy


class BasicSpider(scrapy.Spider):
    name = "basic"
    allowed_domains = ["web"]
    # Start on a property page
    start_urls = ['http://www.iens.nl']

    def __init__(self):
        chrome_path = '/Users/username/Documents/chromedriver'
        self.driver = webdriver.Chrome(chrome_path)

    def parse(self, response):
        self.driver.get(response.url)
        text_box = self.driver.find_element_by_xpath('//*[@id="searchText"]')
        submit_button = self.driver.find_element_by_xpath('//*[@id="button_search"]')
        text_box.send_keys("Amsterdam")
        submit_button.click()

        l = ItemLoader(item=PropertiesItem(), response=response)
        l.add_xpath('description', '//*[@id="results"]/ul/li[1]/div[2]/h3/a/')

        return l.load_item()


process = CrawlerProcess()
process.crawl(BasicSpider)
process.start()
“属性”是另一个类似于以下内容的脚本:

from scrapy.item import Item, Field

class PropertiesItem(Item):
    # Primary fields
    description = Field()
Q:我如何成功地让scrapy在页面上通过xpath找到我称为“description”的元素,并将其作为输出返回


提前谢谢

分配给
ItemLoader
response
对象是
scrapy
响应,而不是Selenium响应

我建议使用selenium返回的页面源创建一个新的
选择器

from scrapy import Selector
...

selenium_response_text = driver.page_source

new_selector = Selector(text=selenium_response_text)
l = ItemLoader(item=PropertiesItem(), selector=new_selector)
...

通过这种方式,
add\uxpath
将从该响应结构而不是scrapy(您实际上不需要)获取信息

@eLRuLL it确实到达了
解析
,否则selenium就不会移动到下一页了,对吗?您可能想看看这个,了解Scrapy与selenium结合的其他方法:如我所说;我想使用scrapy来刮取数据,因为它的速度快!我知道如何使用硒。:)@在selenium中,提多萨达姆的速度并不是一个真正的东西。如果想要提高速度,您需要完全抛弃selenium,或者用支持异步渲染的东西替换它。i、 e.@Granitosaurus是否可以像本例中的selenium那样使用splash在页面中移动?@titusAdam可以单独使用scrapy,而不使用任何javascript渲染。@titusAdam我刚刚回答了您发布的问题:如何成功地使scrapy找到我称之为“description”的元素通过页面上的xpath访问selenium并将其作为输出返回?