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