我想获取刮掉的项目的总数和脚本运行的日期,并将其插入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'的重复条目
因此,可能是我将代码放在错误的位置。 请帮忙谢谢你
答案 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