Scrapy不保存已刮的项目

rta7y2nd  于 2023-08-05  发布在  其他
关注(0)|答案(2)|浏览(110)

以下是我如何启动我的Spider:

with resources.path(SCRAPING_MANIFESTS['systems'], 'manifest.jl') as path:
        process = CrawlerProcess({
            'FEEDS': {
                path: {
                    'format': 'jsonlines',
                    'overwrite': True,
                    'indent': 4
                }
            }
        })

        process.crawl(SystemsManifestSpider, prev_hashes=prev_list)
        process.start()

字符串
我在调试中验证了路径确实是正确的,并指向一个我设置为覆盖的现有文件。是本地文件。
当我调试我的蜘蛛时,我看到我的项目被成功填充。我把它填充成这样:

MyCustomItem(scrapy.Item):
    my_field = scrapy.Field()

# inside my spider class defined as SystemsManifestSpider(scrapy.Spider):
def parse(self, response, **kwargs):
    while True:
    
        ...

        my_item = MyCustomItem()
        my_item['my_field'] = "test"

        ...

        print(my_item)  # prints the dictionary with 'my_field' correctly populated
        yield my_item


以及运行一段时间后的调试输出:第一个月
它正确地访问了网页并抓取了在debug中验证的数据,但是在项目被产生之后,它没有将任何内容保存到我的manifest.jl中。
但是,当我将其修改为:

process = CrawlerProcess({
        'FEEDS': {
            Path("./manifest.jsonlines"): {
                'format': 'jsonlines',
                'overwrite': True,
                'indent': 4
            }
        }
    })


它正确地创建了一个新文件,并将其保存在我运行代码的本地目录中。这两条路径都指向一个真实的文件和目录。
但是当我指定一个绝对路径时,它仍然不起作用:

process = CrawlerProcess({
        'FEEDS': {
            Path("C:\\Users\\xxxx\\PycharmProjects\\xxxx\\src\\python_scrapper_nf\\xxxx\\manifest.jsonlines"): {
                'format': 'jsonlines',
                'overwrite': True,
                'indent': 4
            }
        }
    })


上面的路径与Path(./manifest.jsonlines)相同
注意:似乎所有相对路径都可以工作,但绝对路径永远不会。

35g0bw71

35g0bw711#

你只说对了一部分。在Windows操作系统上使用绝对路径不起作用。这在Feed Export部分的Scrapy文档中提到:
存储后端
本地文件系统
提要存储在本地文件系统中。
URI方案:文件
URI示例:文件:/tmp/export. csv
所需的外部库:无
请注意,对于本地文件系统存储(仅限),如果指定了像/tmp/export. csv这样的绝对路径,则可以省略该方案。这只适用于Unix系统。
在同一页的后面还提到,您可以使用pathlib.Path对象,但是使用Windows绝对pathlib.Path对象仍然不起作用。
之所以会出现这种情况,是因为scrapy解析字段以查找URI方案。然而,当它检测到没有方案时,它就假定它是一个本地文件系统路径。不幸的是,Windows绝对路径以驱动器号作为根,URI解析器将其解释为无法识别的方案,这导致它默默地忽略提要导出位置。

hfyxw5xn

hfyxw5xn2#

“是的,” Alexandria 说得完全正确。
在未来的版本中可能会有一个修复。您可以按照以下步骤操作:https://github.com/scrapy/scrapy/pull/5971。这样,Windows路径将得到更好的处理,如果它不能确定正确的存储,它将默认为文件存储,这将在您的情况下工作。
另外,如果您在路径前添加file:///,我认为它可能会起作用。
:)

相关问题