爬虫框架Scrapy 之(四) --- scrapy运行原理(管道)
解析后返回可迭代对象
- 这个对象返回以后就会被爬虫重新接收,然后进行迭代
- 通过scrapy crawl budejie -o xx.josn/xx.xml/xx.csv 将迭代数据输出到json、xml或者csv格式的外部文件中
- 如果管道开启,则每迭代一次数据就会将其输入到管道中(在settings文件中可以开启管道)
1. budejie.py 文件
def parse(self, response):
# 这个函数是解析函数,它是通过下载来回调,下载器下载完成一个url数据以后就会回调这个函数并且把下载的响应对象通过response参数传递过来
print(response)
# 解析response
contents = response.xpath("//div[@class='j-r-list']/ul/li") # scrapy中自带xpath和css两种解析方法
# print(contents)
for content in contents:
item = {}
item["author"] = content.xpath(".//a[@class='u-user-name']/text()").extract()[0]
# scrapy的xpath和css方法中返回出来的是一个Selector对象列表,我们需要用extract函数将内容从这个对象中提取出来
item["authorImg"] = content.xpath(".//img[@class='u-logo lazy']/@data-original").extract()[0]
item["content"] = content.xpath(".//div[@class='j-r-list-c-desc']/a/text()").extract()[0]
item["imgSrc"] = content.xpath(".//img[@class='lazy']/@data-original").extract()[0]
# print(item)
yield item # 每一个解析函数最后都要返回出去一个可迭代的对象
# 这个对象返回以后就会被爬虫重新接收,然后进行迭代
# 通过scrapy crawl budejie -o xx.josn/xx.xml/xx.csv 将迭代数据输出到json、xml或者csv格式的外部文件中
# 如果管道开启,则每迭代一次数据就会将其输入到管道中(在settings文件中可以开启管道)
开启管道,将迭代的对象传入管道
- 在setting.py 文件中开启管道(67--69行)
ITEM_PIPELINES = {
'MyFirstScrapy.pipelines.MyfirstscrapyPipeline': 300,
# settings文件中可以配置相关的组件,其中ITEM_PIPELINES就是其中的一种组件(即管道组件),管道组件的值是一个字典,代表可以设置多个值
# 字典中的一个键值对就代表着一个管道组件,键代表当前管道组件的位置,值代表当前管道组件的优先级(数字越小优先级越大)
# 数据会按照管道优先级,从高向低传递
'MyFirstScrapy.pipelines.CSVPipeline': 200
}
MyfirstscrapyPipeline 管道类
- 在pipelines.py 文件中 声明、设置管道类
class MyfirstscrapyPipeline(object):
# 这个类集成自一个普通类,但是如果我们把它加入到管道组件中就变成了一个管道类
# 一个管道类有以下三个生命周期函数
def open_spider(self,spider):
print("爬虫开启")
print("当前开启的爬虫为:",spider)
# 创建一个redis链接
self.rds = redis.StrictRedis(host="www.fanjianbo.com",port=6379,db=8)
def process_item(self, item, spider):
# 当爬虫解析完数据以后,这个方法去迭代返回到管道中数据
print("爬虫正在迭代数据...")
print("当前正在%s爬虫迭代的数据是:%s"%(spider,item))
# 向redis数据库中存入数据
self.rds.lpush("budejie",item)
return item
# 每迭代一次以后,一定将迭代过的数据return出去
def close_spider(self,spider):
print("爬虫%s关闭!"%spider)
# 声明一个管道类,用于写csv数据
class CSVPipeline(object):
def open_spider(self,spider):
# 打开csv文件
self.csvfile = open("data.csv","a+",newline='',encoding="utf-8")
self.writer = csv.writer(self.csvfile)
self.writer.writerow(["author","authorImg","content","imgSrc"])
def process_item(self,item,spider):
vals = []
for k,v in item.items():
vals.append(v)
self.writer.writerow(vals)
return item
# 如果优先级高的管道跌打完数据以后不返回出去,
# 这个数据就会销毁,后面的管道就无法使用该数据
def close_spider(self,spider):
self.csvfile.close()
爬虫框架Scrapy 之(四) --- scrapy运行原理(管道)的更多相关文章
- Golang 网络爬虫框架gocolly/colly 四
Golang 网络爬虫框架gocolly/colly 四 爬虫靠演技,表演得越像浏览器,抓取数据越容易,这是我多年爬虫经验的感悟.回顾下个人的爬虫经历,共分三个阶段:第一阶段,09年左右开始接触爬虫, ...
- Scrapy爬虫框架教程(四)-- 抓取AJAX异步加载网页
欢迎关注博主主页,学习python视频资源,还有大量免费python经典文章 sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction ...
- Scrapy基础(四)————Scrapy的使用Pycharm进行Debuge设置
好比Django的Debuge 与前端进行交互时的方便,但是Scrapy 不自带,所以我们写一个main文件来debuge 作用:通过cmd 命令启动爬虫 #-*-coding:utf-8 -*- # ...
- python爬虫框架(3)--Scrapy框架安装配置
1.安装python并将scripts配置进环境变量中 2.安装pywin32 在windows下,必须安装pywin32,安装地址:http://sourceforge.net/projects/p ...
- 【网络爬虫】【python】网络爬虫(四):scrapy爬虫框架(架构、win/linux安装、文件结构)
scrapy框架的学习,目前个人觉得比较详尽的资料主要有两个: 1.官方教程文档.scrapy的github wiki: 2.一个很好的scrapy中文文档:http://scrapy-chs.rea ...
- 一篇文章教会你理解Scrapy网络爬虫框架的工作原理和数据采集过程
今天小编给大家详细的讲解一下Scrapy爬虫框架,希望对大家的学习有帮助. 1.Scrapy爬虫框架 Scrapy是一个使用Python编程语言编写的爬虫框架,任何人都可以根据自己的需求进行修改,并且 ...
- 四: scrapy爬虫框架
5.爬虫系列之scrapy框架 一 scrapy框架简介 1 介绍 (1) 什么是Scrapy? Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍.所谓的框架 ...
- 小白学 Python 爬虫(36):爬虫框架 Scrapy 入门基础(四) Downloader Middleware
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
- 爬虫入门(四)——Scrapy框架入门:使用Scrapy框架爬取全书网小说数据
为了入门scrapy框架,昨天写了一个爬取静态小说网站的小程序 下面我们尝试爬取全书网中网游动漫类小说的书籍信息. 一.准备阶段 明确一下爬虫页面分析的思路: 对于书籍列表页:我们需要知道打开单本书籍 ...
随机推荐
- js判断浏览器是否支持webGL
起因是我之前开发的网页,用到了three.js制作了一个3d的旋转球体效果. 在各种浏览器上运行都没问题,在IE上也做了兼容代码. 但是今天接电话,老板说你这网页在xp上不显示啊.IE上好使.goog ...
- linux如何批量关闭进程
碰到需要杀掉某一类进程的时候,如何批量杀掉这些进程,使用awk命令是很好的选择. 代码: ps -ef|grep aaa|grep -v grep|awk '{print "kill -9 ...
- mysql 导出数据报错: row must be in range 0-65535
数据导出时,出现错误: 一脸懵逼,百度了下,是导出数量有格式有限制.一开始导出为excel表格式,后改为文本格式,不会报错.
- 【转】手把手教你读取Android版微信和手Q的聊天记录(仅作技术研究学习)
1.引言 特别说明:本文内容仅用于即时通讯技术研究和学习之用,请勿用于非法用途.如本文内容有不妥之处,请联系JackJiang进行处理! 我司有关部门为了获取黑产群的动态,有同事潜伏在大量的黑产群 ...
- 前端架构师 摘自《前端架构设计》-micah godbolt
作为前端架构师,你经常需要制定,或至少能够掌握以上所列的每一项内容.流程中的任何一个环节出现问题,都会迅速演变为开发人员的痛苦,或者导致网站无法持续满足用户要求,甚至崩溃. 前端架构师的用户是开发人 ...
- Data Protection - how to manage expired key?(转载)
问 According to ASP.NET Key Management: Deleting a key is truly destructive behavior, and consequentl ...
- xml错误之cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'mvc:annotation-driven'.
今天从svn导入项目的时候,一个xml文件里面报错:‘cvc-complex-type.2.4.c: The matching wildcard is strict, but no declarati ...
- Struts2+Spring+Hibernate3整合
这几天正在复习三大框架的知识,特意把写出来,如有错误,希望大家多指教! 代码地址:https://git.coding.net/puchenglin/SSHDemo.git 1. 引入jar包 Str ...
- 转载泡泡机器人——IMU预积分总结与公式推导1
IMU预积分技术最早由T Lupton于12年提出[1],C Forster于15年[2][3][4]将其进一步拓展到李代数上,形成了一套优雅的理论体系.Forster将IMU预积分在开源因子图优化库 ...
- 了解Vue.js
一.了解Vue (1)Vue.js在设计上采用MVVM(Model-View-ViewModel)模式 当View变化时,会自动更新到ViewModel,反之亦然.View与ViewModel通过双向 ...