【问题标题】:Scrapy and Selenium loading web page but returns no result in item loaderScrapy 和 Selenium 加载网页但在项目加载器中没有返回结果
【发布时间】:2018-05-01 13:33:34
【问题描述】:

所以试图从 jet.com 抓取一个动态加载的页面,实际的 url 是:

https://jet.com/product/Pringles-Pizza-Potato-Crisps-55-Oz/b809dbfac8de4758b3234a82ff562fd5

我在下面包含了我的蜘蛛,页面在 chrome 浏览器中加载,但加载器没有返回任何结果。老实说,我对python和scrapy很陌生,今天早上才开始玩Selenium,不幸的是,当你找到它时,使用Scrapy和Selenium和项目加载器的文档有些命中或错过。任何提示都会有所帮助,恐怕它可能是一个明显的错误,但我不能很快看到它。

import scrapy
from scrapy.loader import ItemLoader
from JetScrape.items import ProductLoader, JetProduct
import datetime
from selenium import webdriver
import time



class JetSpider(scrapy.Spider):
    name = "jet"
    allowed_domains = ["jet.com"]
    with open("JetURL.txt", "rt") as f:
        start_urls = [url.strip() for url in f.readlines()]

    def __init__(self):
        scrapy.Spider.__init__(self)
        self.br = webdriver.Chrome()

    def _del_(self):
        self.br.close()

    def parse(self, response):
        self.br.get(response.url)
        time.sleep(3)
        Today = datetime.datetime.now()
        jetload = ProductLoader(item=JetProduct(), selector=self.br.page_source)
        jetload.add_xpath("jetprice", "//span[@class='formatted-value']/text()")
        jetload.add_xpath("jettitle", "//h1[@class='name']/text()")
        jetload.add_value("jetLast_Updated", Today)
        yield jetload.load_item()

【问题讨论】:

    标签: python selenium scrapy


    【解决方案1】:

    您应该将一个scrapy 选择器项传递给 ItemLoader 函数。

    您可以尝试以下修改:

    from scrapy import Selector
    ...
    def parse(self, response):
        ...
        br_selector = Selector(text = self.br.page_source)
        jetload = ProductLoader(item = JetProduct(), selector = br_selector)
    

    完整的蜘蛛代码应该是这样的:

    import datetime
    import time
    import scrapy
    from selenium import webdriver
    from scrapy import Selector
    from scrapy.loader import ItemLoader
    from JetScrape.items import ProductLoader, JetProduct
    
    
    class JetSpider(scrapy.Spider):
        name = "jet"
        allowed_domains = ["jet.com"]
        with open("JetURL.txt", "rt") as f:
            start_urls = [url.strip() for url in f.readlines()]
    
        def __init__(self):
            scrapy.Spider.__init__(self)
            self.br = webdriver.Chrome()
    
        def _del_(self):
            self.br.close()
    
        def parse(self, response):
            self.br.get(response.url)
            time.sleep(3)
            Today = datetime.datetime.now()
            br_selector = Selector(text = self.br.page_source)
            jetload = ProductLoader(item=JetProduct(), selector=br_selector)
            jetload.add_xpath("jetprice", "//span[@class='formatted-value']/text()")
            jetload.add_xpath("jettitle", "//h1[@class='name']/text()")
            jetload.add_value("jetLast_Updated", Today)
            yield jetload.load_item()
    

    如果这不起作用,请发布您的 items.py 内容,以便我重现完整的爬虫。

    【讨论】:

    • 谢谢!这解决了动态抓取问题,我开始返回 jetprice 的值并最后更新,我需要确认我的 xpath 的标题并添加更多变量。但是,它确实不断抛出 Windows 错误,并说 chromedriver 已停止工作并关闭程序。我认为这与强制关闭有关,但看来您解决了我的问题。非常感谢您的详细回复。我确实不得不将它从 br.selector 更改为 br_selector,因为它一直说 br 是一个未定义的全局变量。
    • 很高兴知道它对您有用。根据您的反馈,我已将答案中的变量名称从 br.selector 更正为 br_selector。关于您的其他问题,如果您需要更多帮助,我建议您发布一个新问题。快乐刮!
    猜你喜欢
    • 1970-01-01
    • 2021-11-28
    • 2016-10-08
    • 1970-01-01
    • 2014-10-03
    • 2014-07-16
    • 2019-02-18
    • 1970-01-01
    • 2019-07-09
    相关资源
    最近更新 更多