以下是我如何启动我的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)
相同
注意:似乎所有相对路径都可以工作,但绝对路径永远不会。
2条答案
按热度按时间35g0bw711#
你只说对了一部分。在Windows操作系统上使用绝对路径不起作用。这在Feed Export部分的Scrapy文档中提到:
存储后端
本地文件系统
提要存储在本地文件系统中。
URI方案:文件
URI示例:文件:/tmp/export. csv
所需的外部库:无
请注意,对于本地文件系统存储(仅限),如果指定了像/tmp/export. csv这样的绝对路径,则可以省略该方案。这只适用于Unix系统。
在同一页的后面还提到,您可以使用
pathlib.Path
对象,但是使用Windows绝对pathlib.Path
对象仍然不起作用。之所以会出现这种情况,是因为
scrapy
解析字段以查找URI
方案。然而,当它检测到没有方案时,它就假定它是一个本地文件系统路径。不幸的是,Windows绝对路径以驱动器号作为根,URI
解析器将其解释为无法识别的方案,这导致它默默地忽略提要导出位置。hfyxw5xn2#
“是的,” Alexandria 说得完全正确。
在未来的版本中可能会有一个修复。您可以按照以下步骤操作:https://github.com/scrapy/scrapy/pull/5971。这样,Windows路径将得到更好的处理,如果它不能确定正确的存储,它将默认为文件存储,这将在您的情况下工作。
另外,如果您在路径前添加
file:///
,我认为它可能会起作用。:)