Scrapy-将爬网页面存储为静态文件

Scrapy-将爬网页面存储为静态文件,scrapy,Scrapy,如果这是一个棘手的问题,我深表歉意,但我已经花了很长时间寻找答案: 我希望将本地文件系统中爬网的每个URL的原始数据存储为一个单独的文件(即response.body->/files/page123.html)——理想情况下,文件名是URL的散列。这样我就可以对HTML做进一步的处理(比如进一步的解析,Solr/ElasticSearch中的索引等) 我读过这些文档,不确定是否有一种内置的方法可以做到这一点?由于页面默认由系统下载,因此编写自定义管道等似乎没有意义,正如paul t所说,Http

如果这是一个棘手的问题,我深表歉意,但我已经花了很长时间寻找答案:

我希望将本地文件系统中爬网的每个URL的原始数据存储为一个单独的文件(即response.body->/files/page123.html)——理想情况下,文件名是URL的散列。这样我就可以对HTML做进一步的处理(比如进一步的解析,Solr/ElasticSearch中的索引等)


我读过这些文档,不确定是否有一种内置的方法可以做到这一点?由于页面默认由系统下载,因此编写自定义管道等似乎没有意义,正如paul t所说,HttpCache中间件可能适合您,但我建议您编写自己的自定义管道

Scrapy有将数据导出到文件的功能,但它们用于json、xml和csv,而不是原始html。别担心,虽然不太难

提供您的
项目。py
看起来像:

from scrapy.item import Item, Field

class Listing(Item):
    url = Field()
    html = Field()
您一直在将刮取的数据保存到spider中的这些项目中,如下所示:

item['url'] = response.url
item['html'] = response.body
您的
pipelines.py
将只是:

import hashlib
class HtmlFilePipeline(object):
    def process_item(self, item, spider):
        file_name = hashlib.sha224(item['url']).hexdigest() #chose whatever hashing func works for you
        with open('files/%s.html' % file_name, 'w+b') as f:
            f.write(item['html'])
希望有帮助。哦,别忘了在项目根目录中放置一个
files/
目录,并将其添加到
settings.py中:

ITEM_PIPELINES = {
'myproject.pipeline.HtmlFilePipeline': 300,

}

来源:

您可能想看看很棒的答案,谢谢-一个小改动,ITEM_PIPELINES设置对我不起作用,我只是将它改为“myproject.PIPELINES.HtmlFilePipeline”,效果很好。还值得注意的是,HttpCacheMiddleware将缓存文件保存在项目中的一个隐藏的/.scrapy/文件夹中。@hammondos感谢您的编辑!如果答案有效,你介意接受还是投票?试图建立这些虚假的互联网积分就是:)还没有足够的荣誉去投票对不起,我会接受答案的,谢谢again@NKelner我也想这样做,我按照你定义的步骤操作,但无法保存网页。在这里我发布了我的配置。请你看一下,让我知道我做错了什么。