【零基础学爬虫】scrapy中的pipline详解
2019-04-13 本文已影响1人
大菜鸟_
scrapy中的pipline主要可以用来:
- 清洗爬取到的数据
- 数据去重
- 去除无效数据
- 数据存储
在定义pipline时,只需要定义一个类并实现process_item(self, item, spider)方法,参数中的item就是爬取到的每一个数据对象,spider是爬虫的实例。该方法主要有两种返回值:
- item对象
- DropItem 异常:即抛弃当前的item
另外,在自定义的类中还可以实现下面几个方法:
- open_spider(self, spider):当spider打开的时候该方法会被调用
- close_spider(self, spider):当spider关闭的时候该方法会被调用
- from_crawler(cls, crawler):当创建一个pipline实例的时候该方法会被调用,该方法必须返回一个pipline实例对象,一般用于获取scrapy项目的配置setting中配置的值
自定义pipline
1.数据清洗加工pipline实例
from scrapy.exceptions import DropItem
class PricePipeline(object):
vat_factor = 1.15
def process_item(self, item, spider):
if item.get('price'):
if item.get('price_excludes_vat'):
item['price'] = item['price'] * self.vat_factor
return item
else:
raise DropItem("Missing price in %s" % item)
如果价格信息没有缺失的话就进行一些操作,更新该值;否则直接丢弃该item
2.将数据保存到jsonline文件
import json
class JsonWriterPipeline(object):
def open_spider(self, spider):
self.file = open('items.jl', 'w')
def close_spider(self, spider):
self.file.close()
def process_item(self, item, spider):
line = json.dumps(dict(item)) + "\n"
self.file.write(line)
return item
3.将数据写到mongdb数据库
MongoDB 的URI和数据库名字都配置在Scrapy项目的 settings文件中;
import pymongo
class MongoPipeline(object):
collection_name = 'scrapy_items'
def __init__(self, mongo_uri, mongo_db):
self.mongo_uri = mongo_uri
self.mongo_db = mongo_db
@classmethod
def from_crawler(cls, crawler):
return cls(
mongo_uri=crawler.settings.get('MONGO_URI'),
mongo_db=crawler.settings.get('MONGO_DATABASE', 'items')
)
def open_spider(self, spider):
self.client = pymongo.MongoClient(self.mongo_uri)
self.db = self.client[self.mongo_db]
def close_spider(self, spider):
self.client.close()
def process_item(self, item, spider):
self.db[self.collection_name].insert_one(dict(item))
return item # 依旧需要返回item
4.数据去重
from scrapy.exceptions import DropItem
class DuplicatesPipeline(object):
def __init__(self):
self.ids_seen = set()
def process_item(self, item, spider):
if item['id'] in self.ids_seen:
raise DropItem("Duplicate item found: %s" % item)
else:
self.ids_seen.add(item['id'])
return item
pipline的使用
写好pipline后我们需要使pipline生效,我们需要把pipline类配置到setting文件中:
ITEM_PIPELINES = {
'myproject.pipelines.PricePipeline': 300,
'myproject.pipelines.JsonWriterPipeline': 800,
}
后面的300、800表示的是优先级,数字值越小,优先级越高,优先级高的pipline优先被调用
另外,scrapy中还有middleware的概念,它主要是用来操作request和response的,例如配置代理:
有关middleware的详细介绍可以查看官网的介绍
扫描下方二维码,及时获取更多互联网求职面经、java、python、爬虫、大数据等技术,和海量资料分享:
公众号菜鸟名企梦
后台发送“csdn”即可免费领取【csdn】和【百度文库】下载服务;
公众号菜鸟名企梦
后台发送“资料”:即可领取5T精品学习资料、java面试考点和java面经总结,以及几十个java、大数据项目,资料很全,你想找的几乎都有