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 ...
随机推荐
- WPF在代码中创建DataTemplate时候的异常
今天写段程序用到了在代码中手动创建DataTemplate, var factory = new FrameworkElementFactory(typeof(OperationColumn)); ...
- iOS面试_1.浅析内存管理
为了开学的面试,就在博客里总结一下面试会问到的问题,今天就来谈谈内存管理,看到一篇文章非常不错,http://vinceyuan.cnblogs.com/,深入浅出,推荐大家去看看! Objectiv ...
- 【SQL】查询数据库中某个字段有重复值出现的信息
select name,mobile from [GeneShop].[dbo].[xx_member] where mobile in ( SELECT mobile FROM [GeneShop] ...
- Session集中式管理
Asp.net Session集中式管理主要有StateServer(状态服务器).Sqlserver(数据库服务器).自定义(如Redis缓存服务器)等,本文主要介绍StateServe ...
- 安装完office2016 64位后,在安装visio时,报错,无法安装,
安装环境要求: 系统要求:win8,win10等: office要求:sw(批量版)不能和cn(零售版).365版混装.-------重点注意事项 一定要注意批量版和零售版的区别,各版本之间绝对不允许 ...
- 无password身份验证:安全、简单且部署高速
Passwordless authentication: Secure, simple, and fast to deploy [编者按]本文作者为 Florian Heinemann 与 Rober ...
- Django——基于类的视图源码分析 一
基于类的视图(Class-based view)是Django 1.3引入的新的视图编写方式,用于取代以前基于函数(Function-based)方式. 借助于OO和Python中方便的多重继承特性, ...
- android adt 最新下载地址23.03
打开这个网址就可以看到adt的详细信息: http://developer.android.com/sdk/installing/installing-adt.html 或者直接在你的eclipse ...
- AR路由器web界面每IP限速配置方法
一.做下载方向的限速:在 QOS>接口限速,选择“新建”“接口名称”选择内网接口“限速类型”选择IP限速(目的)“方向”选择流出“起始/目的ip”写内网的ip“类型”选择独占“承诺速率”为限速的 ...
- 关于Spring管理的类如何创建对象
今天项目中出现了空指针错误,其实一看这个错误我就知道是哪里错了.而且以前也总是说,没有真正的改过啊.今天把改进方法和大家共享.现在我们的项目中,大多数我们的管理方式都是交由Spring去管理,至于好处 ...