scrapy学习笔记(三):使用item与pipeline保存数据
scrapy下使用item才是正经方法。
在item中定义需要保存的内容,然后在pipeline处理item,爬虫流程就成了这样:
抓取 --> 按item规则收集需要数据 -->使用pipeline处理(存储等)
定义item,在items.py中定义抓取内容
# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# http://doc.scrapy.org/en/latest/topics/items.html
import scrapy
class GetquotesItem(scrapy.Item):
# define the fields for your item here like:
# 定义我们需要抓取的内容:
# 1.名言内容
# 2.作者
# 3.标签
content = scrapy.Field()
author = scrapy.Field()
tags = scrapy.Field()
我们将数据库的配置信息保存在setting.py文件中,方便调用
MONGODB_HOST = 'localhost'
MONGODB_PORT = 27017
MONGODB_DBNAME = 'store_quotes2'
MONGODB_TABLE = 'quotes2'
另外,在setting.py文件中一点要将pipeline注释去掉,要不然pipeline不会起作用:
#ITEM_PIPELINES = {
# 'getquotes.pipelines.SomePipeline': 300,
#}
改成
ITEM_PIPELINES = {
'getquotes.pipelines.GetquotesPipeline': 300,
}
现在在pipeline.py中定义处理item方法:
# -*- 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
# 将setting导入,以使用定义内容
from scrapy.conf import settings
import pymongo
class GetquotesPipeline(object):
# 连接数据库
def __init__(self):
# 获取数据库连接信息
host = settings['MONGODB_HOST']
port = settings['MONGODB_PORT']
dbname = settings['MONGODB_DBNAME']
client = pymongo.MongoClient(host=host, port=port)
# 定义数据库
db = client[dbname]
self.table = db[settings['MONGODB_TABLE']]
# 处理item
def process_item(self, item, spider):
# 使用dict转换item,然后插入数据库
quote_info = dict(item)
self.table.insert(quote_info)
return item
相应的,myspider.py中的代码变化一下
import scrapy
import pymongo
# 别忘了导入定义的item
from getquotes.items import GetquotesItem
class myspider(scrapy.Spider):
# 设置爬虫名称
name = "get_quotes"
# 设置起始网址
start_urls = ['http://quotes.toscrape.com']
'''
# 配置client,默认地址localhost,端口27017
client = pymongo.MongoClient('localhost',27017)
# 创建一个数据库,名称store_quote
db_name = client['store_quotes']
# 创建一个表
quotes_list = db_name['quotes']
'''
def parse(self, response):
#使用 css 选择要素进行抓取,如果喜欢用BeautifulSoup之类的也可以
#先定位一整块的quote,在这个网页块下进行作者、名言,标签的抓取
for quote in response.css('.quote'):
'''
# 将页面抓取的数据存入mongodb,使用insert
yield self.quotes_list.insert({
'author' : quote.css('small.author::text').extract_first(),
'tags' : quote.css('div.tags a.tag::text').extract(),
'content' : quote.css('span.text::text').extract_first()
})
'''
item = GetquotesItem()
item['author'] = quote.css('small.author::text').extract_first()
item['content'] = quote.css('span.text::text').extract_first()
item['tags'] = quote.css('div.tags a.tag::text').extract()
yield item
# 使用xpath获取next按钮的href属性值
next_href = response.xpath('//li[@class="next"]/a/@href').extract_first()
# 判断next_page的值是否存在
if next_href is not None:
# 如果下一页属性值存在,则通过urljoin函数组合下一页的url:
# www.quotes.toscrape.com/page/2
next_page = response.urljoin(next_href)
#回调parse处理下一页的url
yield scrapy.Request(next_page,callback=self.parse)
scrapy学习笔记(三):使用item与pipeline保存数据的更多相关文章
- scrapy基础知识之将item 通过pipeline保存数据到mysql mongoDB:
pipelines.py class xxPipeline(object): def process_item(self, item, spider): con=pymysql.connect(hos ...
- tensorflow学习笔记(三十四):Saver(保存与加载模型)
Savertensorflow 中的 Saver 对象是用于 参数保存和恢复的.如何使用呢? 这里介绍了一些基本的用法. 官网中给出了这么一个例子: v1 = tf.Variable(..., nam ...
- Scrapy:学习笔记(2)——Scrapy项目
Scrapy:学习笔记(2)——Scrapy项目 1.创建项目 创建一个Scrapy项目,并将其命名为“demo” scrapy startproject demo cd demo 稍等片刻后,Scr ...
- iView学习笔记(三):表格搜索,过滤及隐藏列操作
iView学习笔记(三):表格搜索,过滤及隐藏某列操作 1.后端准备工作 环境说明 python版本:3.6.6 Django版本:1.11.8 数据库:MariaDB 5.5.60 新建Django ...
- openresty 学习笔记三:连接redis和进行相关操作
openresty 学习笔记三:连接redis和进行相关操作 openresty 因其非阻塞的调用,令服务器拥有高性能高并发,当涉及到数据库操作时,更应该选择有高速读写速度的redis进行数据处理.避 ...
- Oracle学习笔记三 SQL命令
SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)
- [Firefly引擎][学习笔记三][已完结]所需模块封装
原地址:http://www.9miao.com/question-15-54671.html 学习笔记一传送门学习笔记二传送门 学习笔记三导读: 笔记三主要就是各个模块的封装了,这里贴 ...
- JSP学习笔记(三):简单的Tomcat Web服务器
注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...
- java之jvm学习笔记三(Class文件检验器)
java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...
随机推荐
- CF 1117 E. Decypher the String
E. Decypher the String 链接 题意: 有一个字符串,一些操作,每次操作交换两个位置的字符,经过这些操作后,会得到新的字符串.给你新的字符串,求原来的串.可以有3次询问,每次询问给 ...
- Java虚拟机笔记(一):类加载机制
一.概述 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 二.类加载的生命周期 类从被加载到 ...
- Flutter - 弹出底部菜单Show Modal Bottom Sheet
在很多安卓App上,有很多底部弹出的菜单,这个在Flutter上同样可以实现. 先看一下效果 嗯,就是这样子的,当用户点击菜单区域以外的时候,菜单会自动关闭. 下面就看一下Dart语言实现 float ...
- 复杂值vs原始值&&内存空间
写在前面 最近在读<JavaScript启示录>,这本书不是JavaScript的详尽的参考指南,但是把对象作为了解JavaScript的透镜,受益匪浅. 那么我们先来聊一下JavaScr ...
- Quartz.net 定时任务在IIS中没有定时执行
问题:Quartz.net 定时任务在项目部署到IIS中发现没有定时执行 解决方案: 1.在服务器上装一个360(自带自动刷新功能),在工具——>自动刷新——>自动刷新勾上 然后再设置一下 ...
- 《python 经典实例》 分享 pdf下载
链接:https://pan.baidu.com/s/1FzSsBfynqx5ll_OpcZGDHg提取码:ykgk
- Python 循环的技巧
当在字典中循环时,用 items() 方法可将关键字和对应的值同时取出 >>> knights = {'gallahad': 'the pure', 'robin': 'the br ...
- 可道云kodexplorer搭建私有云后的配置优化
一.上传下载速度优化首先明确可道云没有对上传下载做任何限制,速度快慢和网络环境有关.可道云是基于http上传,所以和其他http上传速度基本一致:可以对比其他web系统或网站说附件上传速度.同其他例如 ...
- Java中 static、final和static final的特点及区别
final: final可以修饰:属性,方法,类,局部变量(方法中的变量) final修饰的属性的初始化可以在编译期,也可以在运行时,初始化后不能被改变. final修饰的属性跟具体对象有关,在运行期 ...
- Java面试中的Spring方面问题
1.一般问题 1.1. 不同版本的 Spring Framework 有哪些主要功能? VersionFeatureSpring 2.5发布于 2007 年.这是第一个支持注解的版本.Spring 3 ...