1
votes

Écriture de la sortie Scrapy Python dans un fichier JSON

Je suis nouveau dans Python et le web scraping. Dans ce programme, je veux écrire la sortie finale (nom du produit et prix des 3 liens) dans un fichier JSON. Veuillez aider!

    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)


0 commentaires

3 Réponses :


0
votes

Vous ne fermez pas le fichier data.json , il reste donc en mémoire tampon et n'est pas écrit.

Soit ajouter une méthode close () :

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

ou utilisez une instruction with qui ferme automatiquement le fichier pour vous:

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

Assurez-vous de vraiment vouloir écraser le fichier à chaque fois en utilisant l'indicateur 'w' . Sinon, utilisez plutôt l'indicateur d'ajout 'a' .


2 commentaires

Merci. Mais la sortie JSON n'affiche que le nom et le prix du dernier lien. Je veux ajouter le nom et le prix des 3 liens vers les données extraites, puis les vider dans le fichier json.


Le drapeau d'ajout «a» est alors votre ami.



3
votes

Vous n'avez pas besoin de créer un fichier scrapy peut le faire, commencez par créer un ItemLoader et un élément lorsque vous retournez l'élément dans la dernière analyse, si vous avez besoin de ces données au format json, vous pouvez ajouter un paramètre -o lors de l'exploration de l'araignée

par exemple:

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


0 commentaires

3
votes

Il existe en fait une commande scrapy pour faire cela ( Read ):

    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(']')

Mais comme vous avez demandé le code python, j'ai trouvé ceci:

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

Ce qui fait tout simplement la même chose que la commande de sortie scrapy pour les fichiers json.


1 commentaires

Merci. Cela a fonctionné;) Le lien de référence était très utile.