scrapy 抓取多个url并将相应的数据存储在单独的文件中

0ejtzxu1  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(192)

我是一名大学生,正在做一个项目,我对Scrapy还是个新手。我已经做了尽可能多的研究stackoverflow/ yt,但是我似乎无法将我所看到的想法整合到我正在尝试做的事情中。基本上,我有一个需要从其中抓取数据的URL列表。我想将从每个URL抓取的数据保存/导出到相应的json/csv文件中。最终的目标是将这些文件传输到一个数据库中。我已经设法编写了spider来获取数据,但是,我必须手动更改spider类中的url,并且一次导出一个文件。我似乎找不到一种方法来自动化它。这是我第一次在stackoverflow上发帖。如果你能帮助我,我将不胜感激。
我看过pipelines/使用open函数写,但我不认为我理解如何使用它们来导出基于不同url的多个文件。
我可能没有用正确的方式表达我的问题,我需要浏览URL列表,从网站上抓取评论和相应的评级,并将它们存储在一个json/数据库中,我稍后将在那里访问它们,清理数据,然后将它们馈送到一个情绪分析模型。
因此例如,
1.我有一个URL列表,我需要通过(我有他们存储在一个csv文件),检查他们是否是“好”的一些链接不工作/没有评论
1.我从网站上抓取评论和相应的评级,并存储这些. json/ csv文件,因为我的计划是稍后将它们添加到数据库(sql)中。[我正在努力弄清楚我现在是否可以自己做这件事],因为我需要对这些评论运行一个情绪分析模型,以预测与评论相关的情绪,并针对给定的评级测试预测
注意:因为有相当多的数据要擦除,我打算在之后清理它,你觉得呢?
我现在已经包含了代码的副本。我开始自己手动更改url,并使用命令行导出文件,如:-O_name_of_file. json返回上一页
然而,这不是一种非常有效方法。
这是我的代码https://imgur.com/GlgmB0q的快照。我已经添加了项目加载器和多个url,之前它只是简单地产生项目和一个url,我手动更改
如果你能帮上忙,请随时发短信给我,我会非常感激的。

jc3wubiy

jc3wubiy1#

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

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()
        }

相关问题