道歉,如果这是一个scrapy noob问题,但我花了很多年时间寻找答案:
我想存储每个&的原始数据。我在本地文件系统中作为单独文件爬行的每个URL(即response.body - > /files/page123.html) - 理想情况下,文件名是URL的哈希值。这样我就可以进一步处理HTML(即进一步解析,在Solr / ElasticSearch中进行索引等)。
我已经阅读了文档并且不确定是否有内置的方法来执行此操作?由于系统默认下载页面,因此编写自定义管道等似乎没有意义
答案 0 :(得分:8)
正如保罗所说HttpCache中间件可能适合你,但我建议你写自己的自定义管道。
Scrapy将built-in ways导出数据到文件,但它们用于json,xml和csv而不是原始html。不要担心,虽然不是太难!
如果您的items.py
看起来像:
from scrapy.item import Item, Field
class Listing(Item):
url = Field()
html = Field()
并且您已将抓取的数据保存到蜘蛛中的那些项目,如下所示:
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,
}
来源:http://doc.scrapy.org/en/latest/topics/item-pipeline.html