2017-08-27 2 views
-1

J'ai écrit un tout petit script en python scrapy pour analyser le nom, la rue et le numéro de téléphone affichés sur plusieurs pages du site web de yellowpage. Quand je cours mon script je le trouve fonctionnant doucement. Cependant, le seul problème que je rencontre est la façon dont les données sont récupérées dans la sortie csv. C'est toujours un écart de ligne (ligne) entre deux rangées. Ce que je voulais dire, c'est que les données sont imprimées tous les deux rangs. En voyant l'image ci-dessous, vous saurez ce que je voulais dire. Si ce n'était pas pour le scrapy, j'aurais pu utiliser [newline = '']. Mais, malheureusement, je suis totalement impuissant ici. Comment puis-je me débarrasser des lignes vides qui arrivent dans la sortie csv? Merci d'avance d'y jeter un coup d'œil.Impossible de se débarrasser des lignes vides dans la sortie csv

items.py comprend:

import scrapy 

class YellowpageItem(scrapy.Item): 
    name = scrapy.Field() 
    street = scrapy.Field() 
    phone = scrapy.Field() 

Voici l'araignée:

import scrapy 

class YellowpageSpider(scrapy.Spider): 
    name = "YellowpageSp" 
    start_urls = ["https://www.yellowpages.com/search?search_terms=Pizza&geo_location_terms=Los%20Angeles%2C%20CA&page={0}".format(page) for page in range(2,6)] 

    def parse(self, response): 
     for titles in response.css('div.info'): 
      name = titles.css('a.business-name span[itemprop=name]::text').extract_first() 
      street = titles.css('span.street-address::text').extract_first() 
      phone = titles.css('div[itemprop=telephone]::text').extract_first() 
      yield {'name': name, 'street': street, 'phone':phone} 

Voici comment la sortie csv ressemble:

enter image description here

BTW, la commande J'utilise pour obtenir la sortie csv est:

scrapy crawl YellowpageSp -o items.csv -t csv 
+0

J'ai parlé à bientôt. Cela a fonctionné pour moi. Je suis en train de voter cette réponse et la question: D –

Répondre

3

Vous pouvez le réparer en créant un nouveau FeedExporter. Changez votre settings.py comme ci-dessous

FEED_EXPORTERS = { 
    'csv': 'project.exporters.FixLineCsvItemExporter', 
} 

créer un exporters.py dans votre projet

exporters.py

import io 
import os 
import six 
import csv 

from scrapy.contrib.exporter import CsvItemExporter 
from scrapy.extensions.feedexport import IFeedStorage 
from w3lib.url import file_uri_to_path 
from zope.interface import implementer 


@implementer(IFeedStorage) 
class FixedFileFeedStorage(object): 

    def __init__(self, uri): 
     self.path = file_uri_to_path(uri) 

    def open(self, spider): 
     dirname = os.path.dirname(self.path) 
     if dirname and not os.path.exists(dirname): 
      os.makedirs(dirname) 
     return open(self.path, 'ab') 

    def store(self, file): 
     file.close() 


class FixLineCsvItemExporter(CsvItemExporter): 

    def __init__(self, file, include_headers_line=True, join_multivalued=',', **kwargs): 
     super(FixLineCsvItemExporter, self).__init__(file, include_headers_line, join_multivalued, **kwargs) 
     self._configure(kwargs, dont_fail=True) 
     self.stream.close() 
     storage = FixedFileFeedStorage(file.name) 
     file = storage.open(file.name) 
     self.stream = io.TextIOWrapper(
      file, 
      line_buffering=False, 
      write_through=True, 
      encoding=self.encoding, 
      newline="", 
     ) if six.PY3 else file 
     self.csv_writer = csv.writer(self.stream, **kwargs) 

Je suis sur Mac, donc ne peut pas tester son comportement Windows. Mais si ne fonctionne pas au-dessus puis changer ci-dessous une partie du code et mis newline="\n"

 self.stream = io.TextIOWrapper(
      file, 
      line_buffering=False, 
      write_through=True, 
      encoding=self.encoding, 
      newline="\n", 
     ) if six.PY3 else file 
+0

Merci beaucoup Tarun. Tu es vraiment le géant python. Je souffre de cette question depuis des années. Création et suppression de plusieurs threads pour rechercher la solution. Vous venez de tout résoudre. J'aurais aimé pouvoir appuyer sur le bouton upvote des millions de fois. Btw, puis-je utiliser cela dans d'autres projets parce que c'est tellement énorme et difficile pour moi de me créer autre que de suivre le rythme. Thanksssssssssssssssss un zillion. – SIM

+0

Vous pouvez l'utiliser partout où cela fonctionne –

+0

Une dernière chose à savoir si je n'ai pas déjà été trop gourmand. Parfois, la position des colonnes a changé. Bien que ce ne soit pas un gros problème, je suis curieux de savoir. Vous pouvez comprendre si vous voyez le lien. Plus important encore, ce n'est pas lié à ce sujet, alors n'hésitez pas à ignorer. https://www.dropbox.com/s/tzztbli7v6quhc2/column%20order.txt?dl=0 – SIM