使用硒 + Scrapy

tit*_*dam 2 javascript python selenium scrapy

我正在尝试将scrapy与selenium一起使用,以便能够与javascript交互,并且仍然拥有scrapy提供的强大的抓取框架。我编写了一个访问http://www.iens.nl的脚本,在搜索栏中输入“阿姆斯特丹”,然后成功点击搜索按钮。单击搜索按钮后,我希望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()
Run Code Online (Sandbox Code Playgroud)

“properties”是另一个脚本,看起来像这样:

from scrapy.item import Item, Field

class PropertiesItem(Item):
    # Primary fields
    description = Field()
Run Code Online (Sandbox Code Playgroud)

问:我如何成功地让scrapy 在selenium 到达的页面上通过xpath 找到我称之为“描述”的元素并将其作为输出返回?

提前致谢!

eLR*_*uLL 5

response您分配给您的对象ItemLoaderscrapy响应,而不是 Selenium 的。

我建议Selector使用 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)
...
Run Code Online (Sandbox Code Playgroud)

这样,add_xpath它将从该响应结构而不是scrapy(您实际上不需要)获取信息。