在我的scrapy代码中需要稍微抽搐以摆脱冗余数据

时间:2017-04-04 19:50:07

标签: python csv scrapy

我在scrapy中写了一个代码来从黄页刮掉咖啡店。总数据大约是870,但是我得到了大约1200,并且重复次数最少。此外,在csv输出中,数据将被放置在每个备用行中。期待有人为我提供解决方法。提前谢谢。

文件夹名称“yellpg”和“items.py”包含

from scrapy.item import Item, Field
class YellpgItem(Item):
    name= Field()
    address = Field()
    phone= Field()

蜘蛛名称“yellsp.py”,其中包含:

from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from yellpg.items import YellpgItem

class YellspSpider(CrawlSpider):
    name = "yellsp"
    allowed_domains = ["yellowpages.com"]
    start_urls = (
        'https://www.yellowpages.com/search?search_terms=Coffee%20Shops&geo_location_terms=Los%20Angeles%2C%20CA&page=1',
    )
    rules = (Rule(LinkExtractor(allow=('\&page=.*',)),callback='parse_item',follow=True),)
    def parse_item(self, response):
        page=response.xpath('//div[@class="info"]')
        for titles in page:
            item = YellpgItem()
            item["name"] = titles.xpath('.//span[@itemprop="name"]/text()').extract()
            item["address"] = titles.xpath('.//span[@itemprop="streetAddress" and @class="street-address"]/text()').extract()
            item["phone"] = titles.xpath('.//div[@itemprop="telephone" and @class="phones phone primary"]/text()').extract()
            yield item

要获取CSV输出,我正在使用的命令行:

scrapy crawl yellsp -o items.csv

2 个答案:

答案 0 :(得分:0)

我可以建议创建一个存储项目的管道,以便稍后检查新项目是否重复,但这不是一个真正的解决方案,因为它可能会造成内存问题。

这里真正的解决方案是你应该避免"存储"在最终数据库中重复。

定义项目的哪个字段将作为数据库中的索引,并且一切都应该正常工作。

答案 1 :(得分:0)

最好的方法是在管道中使用CSVItemExporter。在scrapy项目中创建一个名为pipeline.py的文件,并在下面添加代码行。

from scrapy import signals
from scrapy.exporters import CsvItemExporter

class CSVExportPipeline(object):

    def __init__(self):
        self.files = {}

     @classmethod
     def from_crawler(cls, crawler):
         pipeline = cls()
         crawler.signals.connect(pipeline.spider_opened, signals.spider_opened)
         crawler.signals.connect(pipeline.spider_closed, signals.spider_closed)
         return pipeline

    def spider_opened(self, spider):
        file = open('%s_coffer_shops.csv' % spider.name, 'w+b') # hard coded filename, not a good idea
        self.files[spider] = file
        self.exporter = CsvItemExporter(file)
        self.exporter.start_exporting()

    def spider_closed(self, spider):
        self.exporter.finish_exporting()
        file = self.files.pop(spider)
        file.close()

    def process_item(self, item, spider):
        self.exporter.export_item(item)
        return item

现在在setting.py

中添加这些行
  ITEM_PIPELINES = {
     'your_project_name.pipelines.CSVExportPipeline': 300
  }

此自定义CSVItemExporter将以CSV样式导出您的数据。如果您没有按预期获得数据,可以修改process_item方法以满足您的需要。