手把手带你入门Python爬虫Scrapy
导读:Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。
作者 / 来源:无量测试之道
01 Scrapy工作流程是怎么样的
下图是从网络上找的一张Scrapy的工作流程图,并且标注了相应的中文说明信息:
02 Scrapy框架的六大组件
它们分别是:
- 调度器(Scheduler)
- 下载器(Downloader)
- 爬虫(Spider)
- 中间件(Middleware)
- 实体管道(Item Pipeline)
- Scrapy引擎(Scrapy Engine)
03 工作流程如下
Step1. 当爬虫(Spider)要爬取某URL地址的页面时,使用该URL初始化Request对象提交给引擎(Scrapy Engine),并设置回调函数,Spider中初始的Request是通过调用start_requests() 来获取的。start_requests() 读取start_urls 中的URL,并以parse为回调函数生成Request 。
备注:你所创建的项目名.py 文件里面有一个列表:start_urls=[‘http://lab.scrapyd.cn/page/1/‘] (这是我的示例),这里的start_requests() 读取的start_urls 就是来自于这里,这个文件在大家创建爬虫项目时会自动新建。parse()这个回调函数也是自动创建的。只是简单的定义了一下,如下所示:
def parse(self, response):
pass
Step2. Request对象进入调度器(Scheduler) 按某种算法进行排队,之后的每个时刻调度器将其出列,送往下载器。
备注:Scheduler的作用就是对请求的调度,包括过滤,请求的入队和出队操作。
Step3. 下载器(Downloader)根据Request对象中的URL地址发送一次HTTP请求到网络服务器把资源下载下来,并封装成应答包(Response)。
备注:相当于就是将获取的页面资源数据信息转化为Response实例,以便传递给Spider 的Parse() 函数继续处理。
Step4. 应答包Response对象最终会被递送给爬虫(Spider)的页面解析函数进行处理。
备注:这个页面解析函数就是步骤一里面提到的parse() 函数,它是创建项目时自动生成的。
Step5. 若是解析出实体(Item),则交给实体管道(Item Pipeline)进行进一步的处理。
由Spider返回的Item将被存到数据库(由某些Item Pipeline处理)或使用Feed exports存入到文件中。
备注:实体(Item) 实际上就是指我们要获取的数据
Step6. 若是解析出的是链接(URL),则把URL交给调度器(Scheduler)等待抓取。
备注:这里有一种循环调用的感觉,解析的item如果是url就重复整个工作流程。
04 如何安装与简单使用
1. 安装就很简单了,一条命令搞定
python3 -m pip install scrapy #这个可能需要花掉一段时间,如果你的网络快可能就比较快,如果你出现超时导致没有安装成功可以继续执行这个命令
检验是否安装成功:进入python3 的命令行,输入import scrapy 如果没有报错就表示安装成功了。
2. 简单使用说明
Step1. 开始创建一个Scrapy 项目,我这里以爬取lab为示例
scrapy startproject lab #创建新的Scrapy项目,注意一下,如果此命令没有你就需要配置一下Scrapy 的环境变量
cd lab #进入创建的项目目录
scrapy genspider labs http://lab.scrapyd.cn/page/1/ # 生成spider 代码
Step2. 定义提取的Item
class LabItem(scrapy.Item):
title = scrapy.Field()
author = scrapy.Field()
Step3. 编写解析Parse函数
def parse(self, response):
items=LabItem() #实例化一个数据对象,用于返回
for sel in response.xpath('//div[@class="col-mb-12 col-8"]'):
print(sel)
for i in range(len(sel.xpath('//div[@class="quote post"]//span[@class="text"]/text()'))):
title = sel.xpath('//div[@class="quote post"]//span[@class="text"]/text()')[i].get()
author = sel.xpath('//div[@class="quote post"]//small[@class="author"]/text()')[i].get()
items["title"]=title
items["author"] = author
yield items #返回提出来的每一个数据对象
Step4. 编写Pipeline 来提取Item数据
from itemadapter import ItemAdapter
import json
class FilePipeline(object):
def open_spider(self, spider):
print("当爬虫执行开始的时候回调:open_spider")
def __init__(self):
print("创建爬虫数据存储文件")
self.file = open('test.json',"w", encoding="utf-8")
def process_item(self, item, spider):
print("开始处理每一条提取出来的数据")
content = json.dumps(dict(item),ensure_ascii=False)+"n"
self.file.write(content)
return item
def close_spider(self, spider):
print("当爬虫执行结束的时候回调:close_spider")
self.file.close()
这里是自定义的一个pipeline,所以还需要在setting.py 文件里面把它配置上,如下:
ITEM_PIPELINES = {
'lab.pipelines.FilePipeline': 300,
}
最终提取到文件的结果如下图所示:
总结
今天的分享主要是从整体上讲了一下Scrapy 的工作流程,算是一个入门的学习,如果把这个流程中的一些概念性的内容能够掌握好理解到位,那么接下来的学习会更容易一些,同时基于理解的学习会更深刻。
- OpenDaylight Lithium-SR2 Cluster集群搭建
- Linux | CentOS7下会玩JDK不?你确定?
- Linux | 不懂Linux的码神,不是真正的菜鸟
- 初体验Spring Boot 2支持的HikariCP连接池
- 快来了解JDK10中引入的全新JIT编译器:Graal
- 基于Ryu打造自定义控制器
- Junit 5新特性全集
- 深入了解浏览器的重绘与重排
- 自己动手写区块链(Java版)
- 自己动手写区块链-发起一笔交易(Java版)
- 详解JavaScript跨域问题
- OpenStack Magnum及Liberty新功能简介
- JDK10要来了:下一代 Java 有哪些新特性?
- 是时候忘掉finalize方法了
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP实现简单用户登录界面
- 使用python批量修改XML文件中图像的depth值
- PHP数组对象与Json转换操作实例分析
- PHP防止sql注入小技巧之sql预处理原理与实现方法分析
- php实现微信公众号企业转账功能
- 实例分析10个PHP常见安全问题
- laravel清除视图缓存的代码
- Smarty模板类内部原理实例分析
- laravel框架与其他框架的详细对比
- ThinkPHP like模糊查询,like多匹配查询,between查询,in查询,一般查询书写办法
- PHP设计模式之数据访问对象模式(DAO)原理与用法实例分析
- PHP实现简单登录界面
- PHP创建XML接口示例
- PHP设计模式之单例模式入门与应用详解
- Laravel框架实现定时Task Scheduling例子