我在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
答案 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
方法以满足您的需要。