插入编号使用Scrapy

时间:2019-04-18 10:23:42

标签: python scrapy web-crawler

我想获取刮掉的项目的总数和脚本运行的日期,并将其插入Mysql中,我将代码放入Pipeline中,看来数据的插入处于循环中,在哪里可以正确放置这些数据我希望在抓取完成后放入。

请问有什么主意吗?这是我的代码

import mysql.connector

class GpdealsSpiderPipeline_hm(object):

#some working code here

def store_db(self, item):
    self.curr.execute("""insert into status_hm (script_lastrun, new_sale_item, no_item_added, total_item) values (%s, %s, %s, %s)""", (
            'sample output',
            'sample output',
            'sample output',
            'sample output',
        ))
    self.conn.commit()

错误: mysql.connector.errors.IntegrityError:1062(23000):键'PRIMARY'的重复条目

因此,可能是我将代码放在错误的位置。 请帮忙谢谢你

1 个答案:

答案 0 :(得分:1)

Scrapy管道的目的是一次处理单个项目。但是,您可以通过将逻辑放在close_spider方法中来实现所需的功能。您可以在键item_scraped_count下从Scrapy统计信息中获取刮掉的项目总数。参见示例:

class ExamplePipeline(object):
    def close_spider(self, spider):
        stats = spider.crawler.stats.get_stats()
        print('Total number of scraped items:', stats['item_scraped_count'])

    def process_item(self, item, spider):
        # logic to process the item
        return item

要提供完整的信息,您还可以通过连接来自管道,扩展或蜘蛛本身的信号spider_closed来实现您的目标。请参见连接到蜘蛛信号的完整示例:

import scrapy
from scrapy import signals

class QuotesSpider(scrapy.Spider):
    name = 'quotes'
    start_urls = ['http://quotes.toscrape.com/']

    @classmethod
    def from_crawler(cls, crawler, *args, **kwargs):
        spider = super(QuotesSpider, cls).from_crawler(crawler, *args, **kwargs)
        crawler.signals.connect(spider.spider_closed, signal=signals.spider_closed)
        return spider

    def spider_closed(self, spider):
        stats = spider.crawler.stats.get_stats()
        print('Total number of scraped items:', stats['item_scraped_count'])

    def parse(self, response):
        for quote in response.xpath('//div[@class="quote"]'):
            item = {
                'text': quote.xpath('./*[@itemprop="text"]/text()').extract_first()
            }
            yield item