将 Scrapy Python 输出写入 JSON 文件

Posted

技术标签:

【中文标题】将 Scrapy Python 输出写入 JSON 文件【英文标题】:Writing Scrapy Python Output to JSON file 【发布时间】:2019-10-12 09:48:12 【问题描述】:

我是 Python 和网络抓取的新手。在这个程序中,我想将最终输出(所有 3 个链接的产品名称和价格)写入 JSON 文件。请帮忙!

    import scrapy
    from time import sleep
    import csv, os, json
    import random


    class spider1(scrapy.Spider):
        name = "spider1"

        def start_requests(self):
            list = [
                "https://www. example.com/item1",
                "https://www. example.com/item2",
                "https://www. example.com/item3"]

            for i in list:
                yield scrapy.Request(i, callback=self.parse)
                sleep(random.randint(0, 5))

        def parse(self, response):
            product_name = response.css('#pd-h1-cartridge::text')[0].extract()
            product_price = response.css(
                '.product-price .is-current, .product-price_total .is-current, .product-price_total ins, .product-price ins').css(
                '::text')[3].extract()

            name = str(product_name).strip()
            price = str(product_price).replace('\n', "")

data = name, price

yield data

extracted_data = []
    while i < len(data):

        extracted_data.append()
        sleep(5)
    f = open('data.json', 'w')
    json.dump(extracted_data, f, indent=4)

【问题讨论】:

【参考方案1】:

您没有关闭 data.json 文件,因此它处于缓冲状态并且不会被写入。

要么添加close() 方法:

f = open('data.json', 'w')
json.dump(extracted_data, f, indent=4)
f.close()

或使用自动为您关闭文件的with 语句:

with open('data.json', 'w') as f:
    json.dump(extracted_data, f, indent=4)

确保每次都使用'w' 标志来覆盖文件。如果没有,请改用 'a' 附加标志。

【讨论】:

谢谢。但 JSON 输出仅显示最后一个链接的名称和价格。我想将所有 3 个链接中的名称和价格添加到提取数据,然后将其转储到 json 文件中。 'a' 附加标志是你的朋友。【参考方案2】:

你不需要创建文件scrapy就可以了,先创建一个ItemLoader和最后一次解析返回item时的Item,如果你需要这个json格式的数据,可以加个参数-o爬蜘蛛的时候

例如:

scrapy crawl <spidername> -o <filename>.json

【讨论】:

【参考方案3】:

实际上有一个scrapy命令可以做到这一点(Read):

scrapy crawl <spidername> -o <outputname>.<format>
scrapy crawl quotes -o quotes.json

但是既然你要python代码,我想出了这个:

    def parse(self, response):
        with open("data_file.json", "w") as filee:
            filee.write('[')
            for index, quote in enumerate(response.css('div.quote')):
                json.dump(
                    'text': quote.css('span.text::text').extract_first(),
                    'author': quote.css('.author::text').get(),
                    'tags': quote.css('.tag::text').getall()
                , filee) 
                if index < len(response.css('div.quote')) - 1:
                    filee.write(',')
            filee.write(']')

这与 json 文件的 scrapy 输出命令的作用相同。

【讨论】:

谢谢。它起作用了 ;) 参考链接非常有用。

以上是关于将 Scrapy Python 输出写入 JSON 文件的主要内容,如果未能解决你的问题,请参考以下文章

从python脚本调用scrapy而不创建JSON输出文件

转载Python爬虫框架Scrapy学习笔记

Scrapy - 输出到多个 JSON 文件

Scrapy python csv输出每行之间有空行

scrapy中输出中文保存中文

深入爬虫书scrapy 之json内容没有写入文本