0

我是一名正在从事一个项目的大学生,我对使用 Scrapy 非常陌生。我已经尽可能多地进行了 stackoverflow/yt 的研究,但我似乎无法将我所看到的想法与我正在尝试做的事情整合起来。基本上,我有一个需要从中抓取数据的 url 列表。我想将从每个 url 抓取的数据保存/导出到相应的 json/csv 文件。最终目标是将这些文件传输到数据库。我已经设法编写蜘蛛代码来获取数据,但是,我必须手动更改蜘蛛类中的 url 并一次导出一个文件。我似乎无法找到一种自动化的方法。这是我第一次在stackoverflow上发帖,如果您能帮助我,将不胜感激。

我已经查看了管道/使用带有写入的 open 函数,但我认为我不明白如何使用它们来基于不同的 url 导出多个文件。

我可能没有以正确的方式提出我的问题。我需要浏览 urls 列表,从网站上抓取评论和相应的评级并将它们存储在一个 json/ 数据库中,我稍后将访问它们,清理数据,然后将它们提供给情绪分析模型。

例如,

  1. 我有一个我需要通过的 url 列表(我将它们存储在一个 csv 文件中),检查它们是否“好”,因为某些链接不起作用/没有评论

  2. 从网站上抓取评论和相应的评级并存储它们。json/ csv 文件,因为我的计划是稍后将它们添加到数据库中(sql)。[我正在努力弄清楚我现在是否可以自己做]因为我需要对那些运行情绪分析模型来预测与评论相关的情绪并根据给定评级测试预测

注意:因为有很多数据要刮,我打算事后清理它,想法?

我现在已经包含了代码的副本。我开始自己手动更改网址并使用命令行导出文件,例如:scrapy crawl spidey -O name_of_file.json

然而,这不是一个非常有效的方法。

这是我的代码的快照,https://imgur.com/GlgmB0q。我已经添加了项目加载器和多个 url,在它只是简单地生成项目和我手动更改的单个 url 之前

如果您能提供帮助,请随时给我留言,我将非常感激。Twitter,不和谐等...

谢谢你,肖恩

4

2 回答 2

1

您可以使用项目管道将输出拆分为多个文件。请参见下面的示例代码。

import scrapy
from scrapy.exporters import CsvItemExporter
from urllib.parse import urlparse

class PerFilenameExportPipeline:
    def open_spider(self, spider):
        self.filename_to_exporter = {}

    def close_spider(self, spider):
        for exporter in self.filename_to_exporter.values():
            exporter.finish_exporting()

    def _exporter_for_item(self, item):
        filename = item.get('url').strip()
        if filename not in self.filename_to_exporter:
            f = open(f'{filename}.csv', 'wb')
            exporter = CsvItemExporter(f, export_empty_fields=True)
            exporter.start_exporting()
            self.filename_to_exporter[filename] = exporter
        return self.filename_to_exporter[filename]

    def process_item(self, item, spider):
        exporter = self._exporter_for_item(item)
        exporter.export_item(item)
        return item

class SampleSpider(scrapy.Spider):
    name = 'sample'
    start_urls = ['https://example.com', "https://www.scrapethissite.com/pages/simple", "https://stackoverflow.com"]

    custom_settings = {
        'USER_AGENT': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36',
        "ITEM_PIPELINES": {PerFilenameExportPipeline: 100}
    }

    def parse(self, response):
        parsed =  urlparse(response.url)
        yield {
            "url": parsed.netloc,
            "title": response.css("title::text").get()
        }
于 2022-01-29T05:31:47.673 回答
0

如果每个 URL 的代码都相同 - 您可以全部定义它们并运行一次蜘蛛。

您可以将其存储start_url为“列”,以便了解每个“行”的来源。

myspider.py:

import scrapy

class MySpider(scrapy.Spider):
    name = 'myspider'
    start_urls = [
        'https://scrapy.org/',
        'https://www.stackoverflow.com/',
        'https://python.org/',
    ]

    def start_requests(self):
        for url in self.start_urls:
            yield scrapy.Request(url, dont_filter=True, meta={'start_url': url})

    def parse(self, response):
        yield {
            'start_url': response.meta['start_url'],
            'title': response.css('title::text').get()
        }

输出:

$ scrapy runspider myspider.py -o titles.csv
开始网址 标题
0 https://scrapy.org/ 刮擦
1 https://python.org/ 欢迎来到 Python.org
2 https://www.stackoverflow.com/ Stack Overflow - 开发人员学习、分享和建立职业生涯的地方
于 2022-01-28T18:37:02.083 回答