Вставьте №царапины с помощью Scrapy - PullRequest
0 голосов
/ 18 апреля 2019

Я хочу получить общее количество очищенного элемента и дату запуска сценария и вставить его в 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 Ответ

1 голос
/ 18 апреля 2019

Трубопровод Scrapy предназначен для обработки одного элемента за раз.Тем не менее, вы можете достичь того, что вы хотите, поместив логику в метод close_spider.Вы можете получить общее количество соскобленных предметов из статистики Scrapy под ключом item_scraped_count.См. Пример:

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
...