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)
3 Réponses :
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'
.
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.
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
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.
Merci. Cela a fonctionné;) Le lien de référence était très utile.