在Scrapy中的数据可以通过有一些方法生成Json或CSV文件。
第一种方法是使用Feed Exports。您可以通过从命令行设置文件名和所需格式来运行爬虫并存储数据。
如果您希望自定义输出并在爬虫运行时生成结构化Json或CSV。您可以使用Item Pipeline在管道中设置输出属性,而不是从命令行设置。
使用Feed Export导出
您可以使用scrapy crawl myspider命令从命令行运行您的scraper 。如果要创建输出文件,则必须设置要使用的文件名和扩展名:
scrapy crawl myspider -o data.json
scrapy crawl myspider -o data.csv
scrapy crawl myspider -o data.xml
Scrapy有自己的内置工具来生成json,csv,xml和其他序列化格式。
如果要指定生成的文件的相对路径或绝对路径,或者从命令行设置其他属性,也可以执行此操作:
scrapy crawl reddit -s FEED_URI='/home/user/folder/mydata.csv' -s FEED_FORMAT=csv
scrapy crawl reddit -s FEED_URI='mydata.json' -s FEED_FORMAT=json
使用Item Pipeline导出
Scrapy Item Pipeline是一种处理数据的通用工具。典型的用法是清理html,验证已删除的数据,删除重复数据并将数据存储在数据库中。如果您想要一个方便且可自定义的过程来存储数据,则可以使用管道。
您需要使用JsonItemExporter:
from scrapy.exporters import JsonItemExporter
class JsonPipeline(object):
def __init __(self):
self.file = open(“books.json”,'wb')
self.exporter = JsonItemExporter(self.file,encoding ='utf-8',ensure_ascii = False)
self.exporter.start_exporting()
def close_spider(self,spider):
self.exporter.finish_exporting()
self.file.close()
def process_item(self,item,spider):
self.exporter.export_item(item)
return item
除了JsonItemExporter,还有CsvItemExporter,它与CSV的工作方式相同,但您必须调用CsvItemExporter:
class CsvPipeline(object):
def __init __(self):
self.file = open(“booksdata.csv”,'wb')
self.exporter = CsvItemExporter(self.file,unicode)
self.exporter.start_exporting()
def close_spider( self,spider):
self.exporter.finish_exporting()
self.file.close()
def process_item(self,item,spider):
self.exporter.export_item(item)
return item
请注意,在csv文件中,默认情况下,字段用“,”(逗号)分隔。如果您的字段包含带逗号的文本,这会破坏整个结构,您可能需要创建一个修复此问题的函数:
def create_valid_csv(self, item):
for key, value in item.items():
is_string = (isinstance(value, basestring))
if (is_string and ("," in value.encode('utf-8'))):
item[key] = """ + value + """
您必须在导出项目之前调用此函数,以便ItemExporter相应地识别数据中的逗号。
配置settings.py
告诉scrapy你使用的管道非常重要,否则你的管道将不会被调用。
您必须将下面的代码添加到Scrapy项目中的settings.py中:
ITEM_PIPELINES = {
'RedditScraper.pipelines.JsonPipeline':300,
'RedditScraper.pipelines.CsvPipeline':500,
}
这些数字的含义是管道执行的优先级。在此示例中,JsonPipeline将更快执行。并且数字必须在0-1000的范围内。
关于作者:
****************************************
- 姓名:麦艳涛
- 网名:挖掘机小王子
- Q群:581465069
****************************************
转载请注明出处:https://zhuanlan.zhihu.com/p/58944212