spider传过来的item,是在pipelines完成数据的的清洗,去重,存入数据库操作,结合书上的例子,pipelines部分这么写,写完记得在"setting"激活:
class BookPipeline(object):
def process_item(self, item, spider):
exchange_rate=8.26
price=float(item['price'][1:])*exchange_rate
#如果格式化加了's',输出不再是保留两位小数点
#item['price']='¥%s.2f' % price
item['price']='¥{:.2f}'.format(price)
#item['price']='¥%.2f' % price
return item
下面是"去重的操作":
from scrapy.exceptions import DropItem
class BookPipeline(object):
def process_item(self, item, spider):
exchange_rate=8.26
price=float(item['price'][1:])*exchange_rate
#如果格式化加了's',输出不再是保留两位小数点
#item['price']='¥%s.2f' % price
item['price']='¥{:.2f}'.format(price)
return item
class DuplicatePipeline(object):
def __init__(self):
#如果不进行初始化,比如把set_name直接写在process_item()里,无法实现去重操作,回头再去看看Python的类和函数这些基础....
self.set_name=set()
def process_item(self,item,spider):
#set_name=set()
if item['name'] in self.set_name:
raise DropItem('Duplicate book found:%S' % item['name'])
self.set_name.add(item['name'])
return item
>>>
'finish_time': datetime.datetime(2019, 1, 22, 7, 55, 26, 329422),
# 丢弃了8个重复的书名
'item_dropped_count': 8,
'item_dropped_reasons_count/DropItem': 8,
# 数量由1000变成992
'item_scraped_count': 992,
'log_count/DEBUG': 1044,
'log_count/INFO': 7,
'log_count/WARNING': 8,
'request_depth_max': 49,
'response_received_count': 51,
'scheduler/dequeued': 50,
'scheduler/dequeued/memory': 50,
'scheduler/enqueued': 50,
'scheduler/enqueued/memory': 50,
'start_time': datetime.datetime(2019, 1, 22, 7, 55, 5, 347273)}
2019-01-22 15:55:26 [scrapy.core.engine] INFO: Spider closed (finished)
"""
别人的去重解释:
增加构造器方法,初始化用于去重的集合。
在process_item方法中,先取出item的name字段,检查书名是否已存在集合book_set中,如果存在,抛出DropItem异常,将item抛弃;否则,将item的name字段存入集合,返回item。
"""