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