我正在尝试将Scraper与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()
“属性”是另一个如下所示的脚本:
from scrapy.item import Item, Field class PropertiesItem(Item): # Primary fields description = Field()
问: 如何成功地使到达页面selenium上的xpath找不到我称为“描述”的元素,并将其作为输出返回?
提前致谢!
response您要分配给您的对象ItemLoader是scrapy响应,而不是Selenium。
response
ItemLoader
scrapy
我建议Selector使用selenium返回的页面源创建一个新的页面:
Selector
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_xpath它将从该响应结构中获取信息,而不是无用(您实际上不需要)。
add_xpath