scrapy下使用item才是正经方法。
在item中定义需要保存的内容,然后在pipeline处理item,爬虫流程就成了这样:

抓取 --> 按item规则收集需要数据 -->使用pipeline处理(存储等)

定义item,在items.py中定义抓取内容

  1. # -*- coding: utf-8 -*-
  2. # Define here the models for your scraped items
  3. #
  4. # See documentation in:
  5. # http://doc.scrapy.org/en/latest/topics/items.html
  6. import scrapy
  7. class GetquotesItem(scrapy.Item):
  8. # define the fields for your item here like:
  9. # 定义我们需要抓取的内容:
  10. # 1.名言内容
  11. # 2.作者
  12. # 3.标签
  13. content = scrapy.Field()
  14. author = scrapy.Field()
  15. tags = scrapy.Field()

我们将数据库的配置信息保存在setting.py文件中,方便调用

  1. MONGODB_HOST = 'localhost'
  2. MONGODB_PORT = 27017
  3. MONGODB_DBNAME = 'store_quotes2'
  4. MONGODB_TABLE = 'quotes2'

另外,在setting.py文件中一点要将pipeline注释去掉,要不然pipeline不会起作用:

  1. #ITEM_PIPELINES = {
  2. # 'getquotes.pipelines.SomePipeline': 300,
  3. #}

改成

  1. ITEM_PIPELINES = {
  2. 'getquotes.pipelines.GetquotesPipeline': 300,
  3. }

现在在pipeline.py中定义处理item方法:

  1. # -*- coding: utf-8 -*-
  2. # Define your item pipelines here
  3. #
  4. # Don't forget to add your pipeline to the ITEM_PIPELINES setting
  5. # See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html
  6. # 将setting导入,以使用定义内容
  7. from scrapy.conf import settings
  8. import pymongo
  9. class GetquotesPipeline(object):
  10. # 连接数据库
  11. def __init__(self):
  12. # 获取数据库连接信息
  13. host = settings['MONGODB_HOST']
  14. port = settings['MONGODB_PORT']
  15. dbname = settings['MONGODB_DBNAME']
  16. client = pymongo.MongoClient(host=host, port=port)
  17. # 定义数据库
  18. db = client[dbname]
  19. self.table = db[settings['MONGODB_TABLE']]
  20. # 处理item
  21. def process_item(self, item, spider):
  22. # 使用dict转换item,然后插入数据库
  23. quote_info = dict(item)
  24. self.table.insert(quote_info)
  25. return item

相应的,myspider.py中的代码变化一下

  1. import scrapy
  2. import pymongo
  3. # 别忘了导入定义的item
  4. from getquotes.items import GetquotesItem
  5. class myspider(scrapy.Spider):
  6. # 设置爬虫名称
  7. name = "get_quotes"
  8. # 设置起始网址
  9. start_urls = ['http://quotes.toscrape.com']
  10. '''
  11. # 配置client,默认地址localhost,端口27017
  12. client = pymongo.MongoClient('localhost',27017)
  13. # 创建一个数据库,名称store_quote
  14. db_name = client['store_quotes']
  15. # 创建一个表
  16. quotes_list = db_name['quotes']
  17. '''
  18. def parse(self, response):
  19. #使用 css 选择要素进行抓取,如果喜欢用BeautifulSoup之类的也可以
  20. #先定位一整块的quote,在这个网页块下进行作者、名言,标签的抓取
  21. for quote in response.css('.quote'):
  22. '''
  23. # 将页面抓取的数据存入mongodb,使用insert
  24. yield self.quotes_list.insert({
  25. 'author' : quote.css('small.author::text').extract_first(),
  26. 'tags' : quote.css('div.tags a.tag::text').extract(),
  27. 'content' : quote.css('span.text::text').extract_first()
  28. })
  29. '''
  30. item = GetquotesItem()
  31. item['author'] = quote.css('small.author::text').extract_first()
  32. item['content'] = quote.css('span.text::text').extract_first()
  33. item['tags'] = quote.css('div.tags a.tag::text').extract()
  34. yield item
  35. # 使用xpath获取next按钮的href属性值
  36. next_href = response.xpath('//li[@class="next"]/a/@href').extract_first()
  37. # 判断next_page的值是否存在
  38. if next_href is not None:
  39. # 如果下一页属性值存在,则通过urljoin函数组合下一页的url:
  40. # www.quotes.toscrape.com/page/2
  41. next_page = response.urljoin(next_href)
  42. #回调parse处理下一页的url
  43. yield scrapy.Request(next_page,callback=self.parse)

scrapy学习笔记(三):使用item与pipeline保存数据的更多相关文章

  1. scrapy基础知识之将item 通过pipeline保存数据到mysql mongoDB:

    pipelines.py class xxPipeline(object): def process_item(self, item, spider): con=pymysql.connect(hos ...

  2. tensorflow学习笔记(三十四):Saver(保存与加载模型)

    Savertensorflow 中的 Saver 对象是用于 参数保存和恢复的.如何使用呢? 这里介绍了一些基本的用法. 官网中给出了这么一个例子: v1 = tf.Variable(..., nam ...

  3. Scrapy:学习笔记(2)——Scrapy项目

    Scrapy:学习笔记(2)——Scrapy项目 1.创建项目 创建一个Scrapy项目,并将其命名为“demo” scrapy startproject demo cd demo 稍等片刻后,Scr ...

  4. iView学习笔记(三):表格搜索,过滤及隐藏列操作

    iView学习笔记(三):表格搜索,过滤及隐藏某列操作 1.后端准备工作 环境说明 python版本:3.6.6 Django版本:1.11.8 数据库:MariaDB 5.5.60 新建Django ...

  5. openresty 学习笔记三:连接redis和进行相关操作

    openresty 学习笔记三:连接redis和进行相关操作 openresty 因其非阻塞的调用,令服务器拥有高性能高并发,当涉及到数据库操作时,更应该选择有高速读写速度的redis进行数据处理.避 ...

  6. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  7. [Firefly引擎][学习笔记三][已完结]所需模块封装

    原地址:http://www.9miao.com/question-15-54671.html 学习笔记一传送门学习笔记二传送门 学习笔记三导读:        笔记三主要就是各个模块的封装了,这里贴 ...

  8. JSP学习笔记(三):简单的Tomcat Web服务器

    注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...

  9. java之jvm学习笔记三(Class文件检验器)

    java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...

随机推荐

  1. 17-[模块]-time&datetime

    1.表示时间time方式 在Python中,用三种方式来表示时间,分别是时间戳.格式化时间字符串和结构化时间 1.时间戳(timestamp):也就是1970年1月1日之后的秒, 例如15063882 ...

  2. 04-cookies 会话跟踪技术

    1.会话跟踪技术 1.Http协议的无状态保存 会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应 2 .会话路径技术使用Cookie或session完成 我们知道HTTP协 ...

  3. noip2017 PJ AK记

    嗨小朋友们大家好,还记得我是谁吗?我就是为RE代言的蒟蒻--xzz day1 蛤?四楼只有一个考场???在逗我 然后解压 蛤?空军68年????我怎么不知道???huaji 蛤?T1这么sb?切掉 蛤 ...

  4. [BZOJ1974][SDOI2010]代码拍卖会[插板法]

    题意 询问有多少个数位为 \(n\) 的形如 \(11223333444589\) 的数位值不下降的数字在\(\mod p\) 的意义下同余 \(0\). $n\leq 10^{18} ,p\leq ...

  5. 菜鸟vimer成长记——第0章、我眼中的vim学习

    这是一系统总结vim的学习文章,记录我自己学习vim的过程和感悟.与此同时也想分享出来给大家,欢迎大家互相讨论和学习. 在这里假设你们对vim已经有了一些基本的认识或者说已经使用过几个月的vim.该系 ...

  6. node.js学习笔记(二)——回调函数

    Node.js 异步编程的直接体现就是回调. 那什么是回调呢?回调指的是将一个函数作为参数传递给另一个函数,并且通常在第一个函数完成后被调用.需要指明的是,回调函数不是由该函数的实现方直接调用,而是在 ...

  7. list add() 和 addall()的区别

    http://blog.tianya.cn/post-4777591 如果有多个已经被实例化的List 集合,想要把他们组合成一个整体,并且,这里必须直接使用List 自身提供的一个方法List.ad ...

  8. Jmeter性能指标分析

    以下是下载了服务器监控插件的各个组件的功能介绍,有助于以后jmeter的性能测试 1.jp@gc - Actiive Threads Over Time:不同时间的活动用户数量展示(图表) 当前的时间 ...

  9. C程序员必读的 3 本书

    C程序员必读的 3 本书 原创: Martin 老师  公众号:零基础零障碍学习C语言 勿用质疑,今天来看这篇文章的朋友都是准备学好C语言的朋友,大家想学好C语言的迫切性,就好比Martin老师等着元 ...

  10. appium 元素定位工具

    两种元素定位工具: 1.uiautomatorviewer是android-sdk自带的一个元素定位工具,目录D:\androidsdk\androidsdk\tools\bin . 双击启动uiau ...