专业的编程技术博客社区

网站首页 > 博客文章 正文

一文教你如何在Scrapy中导出Json和CSV

baijin 2024-09-17 12:00:01 博客文章 4 ℃ 0 评论

在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的范围内。

如果觉得文章对你有用,或是觉得文章不错,请关注小编,后续推出更多精彩内容哟~

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表