Scrapy爬虫入门系列3 将抓取到的数据存入数据库与验证数据有效性
抓取到的item 会被发送到Item Pipeline进行处理
Item Pipeline常用于
- cleansing HTML data
- validating scraped data (checking that the items contain certain fields)
- checking for duplicates (and dropping them)
- storing the scraped item in a database
目录[隐藏] |
写一个自己的item pipeline
就是写一个Python类,并且实现process_item(item, spider)方法
must either return a Item (or any descendant子孙 class) object or raise a DropItem exception.
Price validation and dropping items with no prices
adjusts the price attribute for those items that do not include VAT (price_excludes_vat attribute), and drops those items which don’t contain a price:
如果没有price则丢掉,如果没有price_excludes_vat,调整价格值。
from scrapy.exceptions import DropItem class PricePipeline(object): vat_factor =1.15 def process_item(self, item, spider): if item['price']: if item['price_excludes_vat']: item['price']= item['price'] * self.vat_factor
return item else: raise DropItem("Missing price in %s" % item)
写到JSON文件中
import json class JsonWriterPipeline(object): def__init__(self): self.file=open('items.jl','wb') def process_item(self, item, spider): line = json.dumps(dict(item)) + "\n"
self.file.write(line)
return item
Duplicates filter
A filter that looks for duplicate items, and drops those items that were already processed. Let say that our items have an unique id, but our spider returns multiples items with the same id:
from scrapy.exceptionsimport 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
Activating激活 an Item Pipeline component
在settings.py中加入如下代码:
ITEM_PIPELINES ={'myproject.pipelines.PricePipeline': 300,'myproject.pipelines.JsonWriterPipeline': 800,}
我们在Scrapy爬虫入门系列2:示例教程的基础上,支持json输出
- 1,先写好pipeline
import json class TutorialPipeline(object): def__init__(self): self.file=open('output.json','wb') def process_item(self, item, spider): line = json.dumps(dict(item)) + "\n"
self.file.write(line)
return item
- 2,然后在settings.py中加入
ITEM_PIPELINES={'tutorial.pipelines.TutorialPipeline':400,}
最后运行scrapy crawl dmoz会生成output.json。
存入数据库
打开pipelines.py输入如下:
# -*- coding: utf-8 -*- # Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html # -*- coding: utf-8 -*-
from scrapy import log from twisted.enterprise import adbapi from scrapy.httpimport Request from scrapy.selectorimport HtmlXPathSelector import urllib import MySQLdb import MySQLdb.cursors class TutorialPipeline(object): def__init__(self): self.dbpool= adbapi.ConnectionPool('MySQLdb',db ='scrapy',user='root',passwd ='pwd', cursorclass = MySQLdb.cursors.DictCursor, charset ='utf8', use_unicode =False)
def process_item(self, item, spider): query =self.dbpool.runInteraction(self._conditional_insert, item) query.addErrback(self.handle_error)
return item def _conditional_insert(self,tx,item): tx.execute("select * from item where title = %s",(item['title'])) result=tx.fetchone()
# log.msg(result,level=log.DEBUG)#print result
if result: log.msg("Item already stored in db:%s" % item,level=log.DEBUG)
else: tx.execute("insert into item (title) values (%s)",(item['title']))
def handle_error(self, e): log.err(e)
请注意python的缩进,不然会报错。
然后在settings.py里加上:
ITEM_PIPELINES={'tutorial.pipelines.TutorialPipeline':400,}
运行scrapy crawl dmoz,会发现数据成功插入到数据库中:
如果报错:
No module named MySQLdb
解决:
yum install MySQL-python pip install mysql-python
源码下载:艺搜下载
[编辑]艺搜参考
http://doc.scrapy.org/en/latest/topics/item-pipeline.html
http://stackoverflow.com/questions/10845839/writing-items-to-a-mysql-database-in-scrapy
http://www.cnblogs.com/lchd/p/3820968.html
Scrapy爬虫入门系列3 将抓取到的数据存入数据库与验证数据有效性的更多相关文章
- Scrapy爬虫入门系列2 示例教程
本来想爬下http://www.alexa.com/topsites/countries/CN 总排名的,但是收费了 只爬了50条数据: response.xpath('//div[@class=&q ...
- Scrapy爬虫入门系列4抓取豆瓣Top250电影数据
豆瓣有些电影页面需要登录才能查看. 目录 [隐藏] 1 创建工程 2 定义Item 3 编写爬虫(Spider) 4 存储数据 5 配置文件 6 艺搜参考 创建工程 scrapy startproj ...
- Scrapy爬虫入门系列1 安装
安装python2.7 参见CentOS升级python 2.6到2.7 安装pip 参见CentOS安装python setuptools and pip 依赖 https://docs.scra ...
- python网络爬虫抓取动态网页并将数据存入数据库MySQL
简述以下的代码是使用python实现的网络爬虫,抓取动态网页 http://hb.qq.com/baoliao/ .此网页中的最新.精华下面的内容是由JavaScript动态生成的.审查网页元素与网页 ...
- scrapy爬虫学习系列四:portia的学习入门
系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备: http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...
- scrapy爬虫学习系列五:图片的抓取和下载
系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备: http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...
- scrapy爬虫学习系列二:scrapy简单爬虫样例学习
系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备: http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...
- scrapy爬虫学习系列一:scrapy爬虫环境的准备
系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备: http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...
- scrapy爬虫学习系列三:scrapy部署到scrapyhub上
系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备: http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...
随机推荐
- Word里如何打出带有上下横杠的大写字母i
换成新罗马就行了.
- 《你不知道的 CSS》之等比例缩放的盒子
你肯定已经知道,对于一个 img 元素而言,你可以单独地修改它的 width 或者 height 属性来设置它的大小,同时图片的比例还能够保持不变. 如下图所示,最上面是原始大小的图片,下面两张则分别 ...
- nginx做反向代理时获取真实IP
原文:http://blog.csdn.net/aquester/article/details/48657395 1. 编译 对于client -> nginx reverse proxy - ...
- Silverlight游戏设计(Game Design):(十四)练习用游戏素材资源的获取及相关工具使用心得 --转
Silverlight游戏设计(Game Design):(十四)练习用游戏素材资源的获取及相关工具使用心得 通过前6节的Demo制作演示,大家应该已经相当熟悉这款Silverlight-2D游戏场景 ...
- easyui datagrid加载成功之后选定并获取首行数据
//加载成功之后,选定并获取首行数据 onLoadSuccess:function(data){ alert("grid加载成功"); var rows=$('test').dat ...
- elasticsearch term 查询之一
1.前言 term级别查询将按照存储在倒排索引中的确切字词进行操作,这些查询通常用于数字,日期和枚举等结构化数据,而不是全文本字段. 或者,它们允许您制作低级查询,并在分析过程之前进行. term级别 ...
- 键值对操作 上(Spark自学五)
键值对RDD是Spark中许多操作所需要的常见数据类型. “分区”是用来让我们控制键值对RDD在各节点上分布情况的高级特性.使用可控的分区方式把常在一起被访问的数据放在同一个节点上,可以大大减少应用的 ...
- nginx出现的403错误
参考这篇文章: http://www.server110.com/nginx/201309/1792.html 我是这样解决的: 为了保证文件能正确执行,nginx既需要文件的读权限,又需要文件所有父 ...
- 倍福TwinCAT(贝福Beckhoff)应用教程12.1 TwinCAT控制松下伺服 连接和试运行
首先是用松下伺服自带的软件可以测试运行(驱动器,电机都连接好,然后用USB线连接到松下伺服驱动器的X1口),打开调试软件会自动提示连接到伺服 一般需要对驱动器清除绝对值编码器数据(驱动器可能报错4 ...
- PHP-php-fpm配置优化
前言: 1.少安装PHP模块, 费内存 2.调高linux内核打开文件数量,可以使用这些命令(必须是root帐号)(我是修改/etc/rc.local,加入ulimit -SHn 51200的) ec ...