【问题标题】:Scrapy Splash cannot get the data of a React siteScrapy Splash 无法获取 React 站点的数据
【发布时间】:2019-09-17 16:29:52
【问题描述】:

我需要抓取this 网站。 是用 React 制作的,所以看起来。然后我尝试用scrapy-splash提取数据。例如,我需要类shelf-product-name 的“a”元素。但响应是一个空数组。我在大约 5 秒内使用了 wait 参数。 但我只得到一个空数组。

def start_requests(self):
        yield SplashRequest(
            url='https://www.jumbo.cl/lacteos-y-bebidas-vegetales/leches-blancas?page=6',
            callback=self.parse,
            args={'wait':5}
        )

def parse(self,response):
        print(response.css("a.shelf-product-name"))

【问题讨论】:

    标签: python reactjs scrapy scrapy-splash


    【解决方案1】:

    实际上没有必要使用 Scrapy Splash,因为所有必需的数据都存储在原始 html 响应的 <script> 标记中作为 json 格式的数据:

    import scrapy
    from scrapy.crawler import CrawlerProcess
    import json
    
    class JumboCLSpider(scrapy.Spider):
        name = "JumboCl"
        start_urls = ["https://www.jumbo.cl/lacteos-y-bebidas-vegetales/leches-blancas?page=6"]
    
        def parse(self,response):
            script = [script for script in response.css("script::text") if "window.__renderData" in script.extract()]
            if script:
                script = script[0]
            data = script.extract().split("window.__renderData = ")[-1]
            json_data = json.loads(data[:-1])
            for plp in json_data["plp"]["plp_products"]:
                for product in plp["data"]:
                    #yield {"productName":product["productName"]} # data from css:  a.shelf-product-name
                    yield product
    
    if __name__ == "__main__":
        c = CrawlerProcess({'USER_AGENT':'Mozilla/5.0'})
        c.crawl(JumboCLSpider)
        c.start()
    

    【讨论】:

      猜你喜欢
      • 2021-12-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-27
      • 2020-05-04
      • 2017-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多