【问题标题】:Python3 Scrapy WebcrawlerPython Scrapy 网络爬虫
【发布时间】:2020-07-20 08:37:29
【问题描述】:

为了我的工作,我要写一个爬虫,它只保存页面的标题,交货状态和产品的数量。

这是我的默认蜘蛛代码:

import scrapy

class QuotesSpider(scrapy.Spider):
    name = "quotes"

    def start_requests(self):
        urls = [
        'https://www.topart-online.com/de/Ahorn-japan.%2C-70cm%2C--36-Blaetter----Herbst/c-KAT282/a-150001HE'
        ]
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        page = response.url.split("/")[-1]
        filename = 'quotes-%s.html' % page
        with open(filename, 'wb') as f:
            f.write(response.body)
        self.log('Saved file %s' % filename)

我需要一个只包含这些类的输出文件:

产品名称、可用数量和交货状态

我不知道如何编辑代码,我在新文件中打印了值。 我只知道如何将整个页面保存为新的 .html 文件

感谢你们的帮助

【问题讨论】:

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


    【解决方案1】:

    基本上是根据选择器抓取数据,这里我们使用 XPATH 选择器,但如果您愿意,也可以使用 CSS 选择器。介绍请见here

    Here 是有关从文档中的 Scrapy 提取数据的更多信息。

    我们正在做的是从抓取 HTML 时获取的响应中生成字典。键是我们的行,值是每一行的列。

    代码示例

    def parse(self, response):    
        yield {
               'title': response.xpath('//h1[@class="text-center text-md-left mt-0"]/text()').get(),
               'product': response.xpath('//div[@class="col-6"]/text()')[0].get().strip(),
               'delivery_status': response.xpath('//div[@class="availabilitydeliverytime"]/text()').get().replace('/','').strip()
              }
    

    解释

    yield 语句返回所谓的惰性值,它与 return 相关但有很大不同。我建议您查看here 以了解有关区别的更多详细信息。

    response.xpath() 方法不包括 XPATH 选择器,并且可以获取数据。 get() 用于获取此数据,仅一次。如果有多个 html 标记具有该 XPATH 选择器,则可以使用 getall() 来获取所有结果。

    1. // - 搜索整个 HTML
    2. h1 - 我们要从中获取数据的标签
    3. [@class=""] - 我们要选择 class=""
    4. 的 h1 标签
    5. /text() - 抓取 html 标签内的文本
    6. get()scrapy 抓住了这个结果。

    在产品中,class= "col-6" 在 HTML 中有多个标签,所以我们只抓取第一个标签,因为 response.xpath() 返回一个列表。我们使用get() 方法,然后使用strip() 去除任何空白。

    投递状态和上面类似,但是我们用replace()方法去掉了/。

    当您运行 scrapy 脚本时,如果您希望它是 JSON 格式,请使用 scrapy crawl quotes -o quotes.json。文档中的更多信息here

    您应该查看文档here 中的scrapy 教程。这对于掌握基本的刮刀非常有帮助。这是我们生成一个基于 XPATH 选择器的字典。

    附加信息

    除了最结构化的数据之外,我建议您查找 Items 和 ItemLoaders 以存储数据。当您遇到需要清理的数据问题时,这些会更加灵活。生成字典是从 scrapy 获取数据的最简单方法。

    【讨论】:

    • 嘿 aaronS,谢谢你的好回答 :) 但我还有一个问题:我必须在哪里放置 xpath 表达式?我想知道我是否必须用 xpath 表达式替换创建 .html 文件的“def 部分”?我有点卡住了._.
    • 你好约洛米尔。 xpath 表达式位于 response.xpath() 方法中。您正在获取 scrapy 的响应(HTML)并对其应用 xpath() 方法,该方法内的 XPATH 选择器将指定您要提取的 HTML 标记属性/文本。看看上面的代码,我正在做的是从解析函数中的starts_request函数中获取scrapy给我的响应。然后我应用 respones.xpath() 方法从该响应中提取数据。
    • p.s:我现在明白了,非常感谢你的帮助 aaronS,你帮助了一个新手很好 :)