【问题标题】:Scrapy- can't extract data from h3Scrapy-无法从 h3 中提取数据
【发布时间】:2021-05-12 06:57:42
【问题描述】:

我开始使用 Scrapy,并设法提取了一些我需要的数据。但是,并非所有内容都正确获得。我正在应用从here 找到的官方教程中的知识,但它不起作用。我用谷歌搜索了一下,还阅读了this SO question,但我相当确定这不是问题所在。

无论如何,我正在尝试解析来自this webshop 的产品信息。我正在尝试获取产品名称、价格、rrp、发布日期、类别、宇宙、作者和出版商。这是一种产品的相关 CSS:https://pastebin.com/9tqnjs7A。这是我的代码。最后带有#! 的所有内容都没有按预期工作。

import scrapy
import pprint

class ForbiddenPlanetSpider(scrapy.Spider):
  name = "fp"
  start_urls = [
            'https://forbiddenplanet.com/catalog/?q=mortal%20realms&sort=release-date&page=1',
    ]

  def parse(self, response):
    for item in response.css("section.zshd-00"):
      print(response.css)
      name = item.css("h3.h4::text").get() #!
      price = item.css("span.clr-price::text").get() + item.css("span.t-small::text").get()
      rrp = item.css("del.mqr::text").get()
      release = item.css("dd.mzl").get() #!
      category = item.css("li.inline-list__item::text").get() #!
      universe = item.css("dt.txt").get() #!
      authors = item.css("a.SubTitleItems").get() #!
      publisher = item.css("dd.mzl").get() #!

      pprint.pprint(dict(name=name,
                         price=price,
                         rrp=rrp,
                         release=release,
                         category=category,
                         universe=universe,
                         authors=authors,
                         publisher = publisher
                         )
                    )

我想我需要添加一些子搜索(例如,目前 release 和 publisher 具有相同的条件),但我不知道如何用词来搜索它(我试过了,但是最终得到了不涵盖它的通用教程)。任何指出我正确方向的东西都值得赞赏!

哦,我没有包含 ' ' 空格,因为每当我使用一个 Scrapy 时都会立即找不到。

【问题讨论】:

    标签: python html python-3.x scrapy web-crawler


    【解决方案1】:

    Scrapy 不渲染 JS,尝试disable javascript in your browser 刷新页面,没有 JS 的站点版本的 HTML 结构不同。

    你应该用新的 HTML 结构重写你的选择器。尝试使用 XPATH 而不是 CSS,它更灵活。

    更新

    抓取此网站的最简单方法是向https://forbiddenplanet.com/api/products/listing/?q=mortal%20realms&sort=release-date发出请求

    响应是一个包含所有必要数据的 JSON 对象。您可以将“结果”字段(或整个 JSON 对象)转换为 python 字典,并使用字典方法获取所有字段。

    行之有效的代码草案。

    import scrapy
    import json
    
    
    def get_tags(tags: list):
        parsed_tags = []
        if tags:
            for tag in tags:
                parsed_tags.append(tag.get('name'))
            return parsed_tags
        return None
    
    
    class ForbiddenplanetSpider(scrapy.Spider):
        name = 'forbiddenplanet'
        allowed_domains = ['forbiddenplanet.com']
        start_urls = ['https://forbiddenplanet.com/api/products/listing/?q=mortal%20realms&sort=release-date']
    
        def parse(self, response):
            response_dict = json.loads(response.body)
            items = response_dict.get('results')
    
            for item in items:
                yield {
                    'name': item.get('title'),
                    'price': item.get('site_price'),
                    'rrp': item.get('rrp'),
                    'release': item.get('release_date'),
                    'category': get_tags(item.get('derived_tags').get('type')),
                    'universe': get_tags(item.get('derived_tags').get('universe')),
                    'authors': get_tags(item.get('derived_tags').get('author')),
                    'publisher': get_tags(item.get('derived_tags').get('publisher')),
                }
    
            next_page = response_dict.get('next')
            if next_page:
                yield scrapy.Request(
                    url=next_page,
                    callback=self.parse
                )
    

    【讨论】:

    • 谢谢,我没有检查 API。它就像一个魅力!
    猜你喜欢
    • 2020-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    相关资源
    最近更新 更多