3
votes

Comment trier les informations de l'article scrapy dans un ordre personnalisé?

L'ordre par défaut dans scrapy est l'alphabet, j'ai lu un article pour utiliser OrderedDict pour afficher l'élément dans un ordre personnalisé.
J'écris une araignée et suis la page Web.
Comment obtenir l'ordre des champs dans l'élément Scrapy

Mes items.py.

2019-04-26 00:16:38 [scrapy.core.scraper] DEBUG: Scraped from <200 http://quotes.money.163.com/f10/gszl_600023.html>
{'name': ['浙能电力'],
 'phone': ['0571-87210223'],
 'address': ['浙江省杭州市天目山路152号浙能大厦'],}

Le simple fichier d'araignée.

2019-04-26 00:16:38 [scrapy.core.scraper] DEBUG: Scraped from <200 http://quotes.money.163.com/f10/gszl_600023.html>
{'address': ['浙江省杭州市天目山路152号浙能大厦'],
 'name': ['浙能电力'],
 'phone': ['0571-87210223']}

L'information de scrapy quand exécuter l'araignée.

cat info.csv
name,phone,address
浙能电力,0571-87210223,浙江省杭州市天目山路152号浙能大

Pourquoi je ne parviens pas à obtenir la commande souhaitée comme ci-dessous?

scrapy crawl  info -o  info.csv

Merci pour les conseils de Gallaecio, d'ajouter ce qui suit dans settings.py.

FEED_EXPORT_FIELDS=['name','phone','address']

Exécutez l'araignée et la sortie dans un fichier csv.

{'name': ['浙能电力'],'phone': ['0571-87210223'],'address': ['浙江省杭州市天目山路152号浙能大厦']}

L'ordre des champs est dans mon ordre personnalisé. p>

2019-04-25 13:45:01 [scrapy.core.scraper] DEBUG: Scraped from <200 http://quotes.money.163.com/f10/gszl_600023.html>
{'address': ['浙江省杭州市天目山路152号浙能大厦'],'name': ['浙能电力'],'phone': ['0571-87210223']}

Regardez les informations de débogage de scrapy:

import scrapy
from info.items import InfoItem

class InfoSpider(scrapy.Spider):
    name = 'Info'
    allowed_domains = ['quotes.money.163.com']
    start_urls = [ "http://quotes.money.163.com/f10/gszl_600023.html"]
    def parse(self, response):
        item = InfoItem()
        item["name"] = response.xpath('/html/body/div[2]/div[4]/table/tr[2]/td[2]/text()').extract()
        item["phone"] = response.xpath('/html/body/div[2]/div[4]/table/tr[7]/td[4]/text()').extract()
        item["address"] = response.xpath('/html/body/div[2]/div[4]/table/tr[2]/td[4]/text()').extract()
        item.items()
        yield  item

Comment puis-je créer les informations de débogage dans un ordre personnalisé? Comment obtenir le après la sortie de débogage?

import scrapy
from collections import OrderedDict


class OrderedItem(scrapy.Item):
    def __init__(self, *args, **kwargs):
        self._values = OrderedDict()
        if args or kwargs:  
            for k, v in six.iteritems(dict(*args, **kwargs)):
                self[k] = v

class StockinfoItem(OrderedItem):
    name = scrapy.Field()
    phone = scrapy.Field()
    address = scrapy.Field()


1 commentaires

Vous pouvez personnaliser l'ordre des champs dans un fichier de sortie réel. Voir FEED_EXPORT_FIELDS .


4 Réponses :


1
votes

vous pouvez définir une représentation sous forme de chaîne personnalisée de votre élément

class InfoItem:
    def __repr__(self):
      return 'name: {}, phone: {}, address: {}'.format(self['name'], self.['phone'], self.['address'])


0 commentaires

0
votes

Dans votre araignée, remplacez item.items () par self.log (item.items ()) , le message du journal devrait être une liste de tuples dans l'ordre où vous les avez attribués dans votre araignée.

Une autre façon consiste à combiner la réponse que vous avez mentionnée dans votre message avec cette réponse


0 commentaires

1
votes

Le problème est dans la fonction __repr__ de Item . À l'origine, son code est:

2019-04-30 18:56:20 [scrapy.core.scraper] DEBUG: Scraped from <200 http://quotes.money.163.com/f10/gszl_600023.html>
{"name": ["\u6d59\u80fd\u7535\u529b"], "phone": ["0571-87210223"], "address": ["\u6d59\u6c5f\u7701\u676d\u5dde\u5e02\u5929\u76ee\u5c71\u8def152\u53f7\u6d59\u80fd\u5927\u53a6"]}

Donc, même si vous convertissez votre article en OrderedDict et que vous vous attendez à ce que les champs soient enregistrés dans le même ordre, cette fonction applique dict () et casse l'ordre.

Donc, je vous propose de le surcharger comme vous le souhaitez, par exemple:

import json

class OrderedItem(scrapy.Item):
    def __init__(self, *args, **kwargs):
        self._values = OrderedDict()
        if args or kwargs:
            for k, v in six.iteritems(dict(*args, **kwargs)):
                self[k] = v

    def __repr__(self):
        return json.dumps(OrderedDict(self), ensure_ascii = False)  # it should return some string

Et maintenant vous pouvez obtenir cette sortie:

def __repr__(self):
    return pformat(dict(self))


1 commentaires

Ajoutez ensure_ascii = False dans json.dump pour afficher les caractères dans l'apparence cjk.



0
votes

L'ensemble de items.py qui peut générer des informations de débogage personnalisées dans l'apparence cjk est comme ci-dessous.

import scrapy
import json    
from collections import OrderedDict

class OrderedItem(scrapy.Item):
    def __init__(self, *args, **kwargs):
        self._values = OrderedDict()
        if args or kwargs:
            for k, v in six.iteritems(dict(*args, **kwargs)):
                self[k] = v

    def __repr__(self):
        return json.dumps(OrderedDict(self),ensure_ascii = False)  
        #ensure_ascii = False ,it make characters show in cjk appearance.

class StockinfoItem(OrderedItem):
    name = scrapy.Field()
    phone = scrapy.Field()
    address = scrapy.Field()


0 commentaires