边学边敲边记之爬虫系列(九):Item+Pipeline数据存储_item中可以定义需要爬取数据的数据结构_简说Python的博客-程序员秘密

技术标签: pipeline  Item  边学边敲边记爬虫学习系列  Python  

在这里插入图片描述

一、写在前面

好久没更新了,快半个月了,也少有读者催着更新,于是乎自己就拖啊,为公众号出路想方设法,着实是有点迷失自我,废话不多说了。
今天是爬虫系列第9篇,上一篇Scrapy系统爬取伯乐在线中我们已经利用Scrapy获取到了伯乐在线网站所有文章的基本数据,但我们没有做存储操作,本篇,我们就好好讲讲怎么利用Scrapy框架知识进行存储–Item做数据结构+Pipeline操作数据库。

二、你不得不知道的 Knowledge

1. 本篇涉及到的英文单词
1. item
英 [ˈaɪtəm] 美 [ˈaɪtəm]
n.项目;条,条款;一则;一件商品(或物品)
adv.又,同上
2.crawl
英 [krɔ:l] 美 [krɔl]
vi.爬行;缓慢行进;巴结
n.缓慢的爬行;〈美俚〉跳舞,自由式游泳;养鱼(龟)池
3.pipeline
英 [ˈpaɪplaɪn] 美 [ˈpaɪpˌlaɪn]
n.管道;输油管道;渠道,传递途径
vt.(通过管道)运输,传递;为…安装管道
4.meta
英 ['metə] 美 ['metə]
abbr.(Greek=after or beyond) (希腊语)在…之后或超出;[辨证法]元语言
2.Item作用

Item主要用于定义爬取的数据结构,自己指定字段存储数据,统一处理,创建Item需要继承scrapy.Item类,并且定义类型为scrapy.Field,不用区分数据类型,数据类型取决于赋值时原始数据的数据类型,它的使用方法和字典类似。

3.Pipeline作用

当Item在Spider中被收集之后,它将会被传递到Item Pipeline,Pipeline主要作用是将return的items写入到数据库、文件等持久化模块。

4.Scrapy中Request函数的mate参数作用

Request中meta参数的作用是传递信息给下一个函数,使用过程可以理解成把需要传递的信息赋值给这个叫meta的变量,但meta只接受字典类型的赋值,因此要把待传递的信息改成"字典”的形式,如果想在下一个函数中取出 value,只需得到上一个函数的meta[key]即可。

三、看代码,边学边敲边记Scrapy Item和Pipeline应用

1. 目前项目目录

项目目录

2.前情回顾

实在是本系列上一篇(Scrapy系统爬取伯乐在线)距离现在太远久了,简单和大家提醒一下上一篇我们做了什么吧:

1.批量、翻页爬取
2.已经爬取到数据基本介绍,见下面数据表
数据表
变量中文名 变量名 值类型
文章标题 title str
发布日期 create_time str
文章分类 article_type str
点赞数 praise_number int
收藏数 collection_number int
评论数 comment_number int

3.在Item.py中新建一个JobboleArticleItem类,用来存放文章信息

class JobboleArticleItem(scrapy.Item):
	front_img = scrapy.Field() # 封面图
	title = scrapy.Field()   # 标题
	create_time = scrapy.Field()  # 发布时间
	url = scrapy.Field()  # 当前页url
	article_type =scrapy.Field()  # 文章分类
	praise_number = scrapy.Field() # 点赞数
	collection_number = scrapy.Field() # 收藏数
	comment_number = scrapy.Field() # 评论数

4.增加文章封面图获取

(1)页面分析
封面图url
(2)jobbole.py中修改parse函数
我们通过Request函数的mate参数传递获取到的image_url

	def parse(self, response):
		# 1.获取单页面a标签内容,返回Selector对象
		post_urls = response.xpath('//*[@id="archive"]/div/div[1]/a')
		# 2.获取文章url、封面图url、下载页面内容和图片
		for post_node in post_urls:
			# 2.1 获取单页面文章url
			image_url = post_node.css("img::attr(src)").extract_first("")
			# 2.2 获取单页面文章url
			post_url = post_node.css("::attr(href)").extract_first("")
			# 2.3 提交下载
			yield Request(url= parse.urljoin(response.url,post_url),meta={
     "front_img":image_url},callback= self.parse_detail)
		# 3.获取翻页url和翻页下载
		next_url = response.css(".next::attr(href)").extract()
		if next_url != []:
			next_url = next_url[0]
			yield Request(url= parse.urljoin(response.url,next_url),callback= self.parse)

(3)Debug调试
Debug
Debug结果我们可以看出,mate的值成功随response传入到parse_detail函数中,那么我们就可以在parse_detail函数中解析获取到front_img

(4)补全parse_detail函数代码

# 初始化一个item对象
article_item = JobboleArticleItem()
# 文章封面图
front_img = response.mate.get("front_img","")
	·
	·
	·
# 数据存储到Item中
article_item['title'] = title
article_item['create_time'] = create_time
article_item['article_type'] = article_type
article_item['praise_number'] = praise_number
article_item['collection_number'] = collection_number
article_item['comment_number'] = comment_number
article_item['front_img'] = front_img
article_item['url'] = response.url
# 将item传递到Pipeline中
yield article_item

至此Item相关代码功能就写好了,后面我们对在Pipeline中进行实际数据存储操作。
(5)激活Pipeline
修改setting.py,激活Pipeline
在setting.py文件下找到第67-69行,去除注释即可。(或者直接Ctrl+F 搜索ITEM_PIPELINES,找到相应位置,去除注释即可)

ITEM_PIPELINES = {
     
key : value
}
key : 表示pipeline中定义的类路径
value : 表示这个pipeline执行的优先级,
        value值越小,从jobbole.py传过
        来的Item越先进入这个Pipeline。

激活Pipeline
上面操作我们就激活了Pipeline,接下来我们可以Debug一下,看看效果:
Debug测试
果然,Debug后Item传入了Pipeline,后面我们可以处理数据、存储数据。
(6)在Pipeline 中进行数据存储操作(MySql)

  • 创建表格
CREATE TABLE `bole_db`.`article` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `title` VARCHAR(100) NULL,
  `create_time` VARCHAR(45) NULL,
  `article_type` VARCHAR(50) NULL,
  `praise_number` INT NULL,
  `collection_number` INT NULL,
  `comment_number` INT NULL,
  `url` VARCHAR(100) NULL,
  `front_img` VARCHAR(150) NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COMMENT = '伯乐在线文章信息';
  • 存储数据
    在Pipelien中创建一个数据库操作类,并配置到setting中。
    pipeline.py中:
class MysqlPipeline(object):
	def __init__(self):
		# 数据库连接
		self.conn = pymysql.connect(host="localhost", port=3306, user="root", password="root", charset="utf8",
		                       database="bole_db")
		self.cur = self.conn.cursor()
	# 插入数据
	def sql_insert(self,sql):
		self.cur.execute(sql)
		self.conn.commit()
	
	def process_item(self, item, spider):
		# 存入mysql数据库
		sql_word = "insert into article (title,create_time,article_type,praise_number,collection_number,comment_number,url,front_img) values ('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}')".format(item["title"],item["create_time"],item["article_type"],item["praise_number"],item["collection_number"],item["comment_number"],item["url"],item["front_img"])
		self.sql_insert(sql_word)
		return item

setting.py中:

# 第67行开始
ITEM_PIPELINES = {
     
   'spider_bole_blog.pipelines.SpiderBoleBlogPipeline': 300,
	'spider_bole_blog.pipelines.MysqlPipeline':100
}
  • 运行结果
    运行结果

我仅仅运行了1分钟,就爬下来并存储了1000条数据,而且没有被反爬掉,可以看出Scrapy框架的强大。

四、后言

这个系列的确是太久没更新了,给大家回顾一下之前讲了些什么吧
Scrapy学习专栏

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_39241986/article/details/82844362

智能推荐

android service_shuai_wen的博客-程序员秘密

最近遇到startService运行异常、foregoundService有通知、是否可以使用bindService等问题。目的是解决这些疑问service是什么?为什么需要它?A Service is an application component that can perform long-running operations in the background, and it do...

Ubuntu Server 16.04 安装并用两块硬盘做RAID1_寰宇001的博客-程序员秘密

公司为了集中管理项目数据,要求搭建一台文件服务器,通过多次尝试终于搭建完成,在此将Ubuntu Server 16.04安装过程并用两块硬盘做RAID1分享给大家。特别提示:尽量用英文安装,因为中文在安装时会报错1、进入界面后选择语言: English 然后回车2、进入安装界面后,按F6 ,接着在按esc,右下角 删除 quiet,用all_generic_ide 替换,回车3、选择一...

树莓派学习笔记——GPIO功能学习_考古队码老板的博客-程序员秘密

0.前言树莓派现在越来越火,网上树莓派的资料也越来越多。树莓派源自英国,国外嵌入式开源领域具有良好的分享精神,树莓派各种集成库也层出不穷,下面推荐几个。【python GPIO】 【开发语言】——python 【简单介绍】——该库更确切的名称为raspberry-gpio-python,树莓派官方资料中推荐且容易上手。python GPIO是一个小型的python库,可以帮助用户完

软件工程:第二章作业_weixin_34187862的博客-程序员秘密

1.软件工程和程序大作业的调查根据程序的难易程度和学生的个人程度不同代码的数量和时间都是不同的,程序根据年级不同程序有难到易由多到少,程序设计大多是团队合作,自己无法独立完成,能够独立完成的同学很少,程序是否能够解决实际问题有的程序可能是写着有趣,有的可能为解决实际而写的,所交作业版本少证明只有少部分同学自己思考程序大部分同学无法独立完成。计本和软工的同学完成一个大的程序几百行代码大概三四天可...

随便推点

兄弟组件传值_小芒果咩咩的博客-程序员秘密

1、main.js// 通过事件总线bus传值Vue.prototype.$bus = new Vue()2.要传值的子组件的传值方法中:this.$bus.$emit('toCurrentLocation', obj)// $emit用来传值,第一个参数是传值的方法名,第二个参数是要传的参数3.要接收值的子组件中:$on用来接收兄弟组件的值,第一个参数是接受值的方法名,与传值的方法名相同,第二个参数是个方法,value就是接收到的值,data() { retur.

javaweb文件上传中文乱码_leonhoou的博客-程序员秘密

文件上传小例子: 问题: 前提:response.setContentType(“text/html;charset=UTF-8”); request.setCharacterEncoding(“UTF-8”); 利用servletFileUpload.parseRequest(request)解析了之后,输出的普通表单项的值有中文乱码问题。 解决方法:

持续交付 devops_使用Bluemix DevOps交付管道自动化服务器推送_cusi77914的博客-程序员秘密

本教程演示了如何使用WebSphereLiberty(一种快速,易于使用的JavaEE应用程序服务器)和IBM Bluemix DevOps Services自动执行服务器目录推送。 使用Bluemix DevOps Services Build&Deploy功能,您可以配置作业,这些作业同时执行来自Maven,Cloud Foundry和UNIX的命令,以自动执行Bluemix中的服务器...

5G新机难救董明珠“手机梦”_程序员的店小二的博客-程序员秘密

本文转载自 锋科技许久没有消息的格力手机,近日又有新动向。日前,格力电器在其官方商城及格力董明珠店悄然上架了一款5G手机。相比于以前的高调造势,这次还真是相当低调,既没有发布会和社交媒体预热宣传,也没有以“格力第几代手机”来命名,而是改名为“大松”。距离格力上一次推出手机新品已经过去了两年多的时间,虽然这款大松手机在配置和性能方面都有了不小的提升,骁龙765G的处理器也让它算得上是一款中端手机。但它的售价依旧太高,6+128G与8+256G版本的售价分别为2699元、2999元,与同配置的竞品相比大松

V8底层运行机制之执行上下文及堆栈内存原理刨析_v8 运行时 上下文_唯爱伊vae的博客-程序员秘密

##1、理论讲解:我们编写的JS代码都是执行在一个环境里的,例如:浏览器(引擎)node(基于v8渲染js)webview(v8引擎)Execution Context Stack:执行环境栈,栈内存(从内存中分配出的一个)EC Execution Context 执行上下文AO Active Object 私有对象VO Variable Object 变量对象GO Global Object 全局对象SCOPE 作用域:创建函数的时候就赋予的SCOPE-CHAIN 作用链域

二维标签在三维里显示 ---------------osg与qt_osg 文字标签_房桥公司的博客-程序员秘密

讲师微信号:osg与qt配置环境的讲解:http://blog.csdn.net/sadasasdasd/article/details/44573637 osg与qt百度贴吧:  http://tieba.baidu.com/f?ie=utf-8&kw=osg%E4%B8%8Eqt&fr=search配置环境第一讲试看地址:链接:http://pa...

推荐文章

热门文章

相关标签