Scrapy 是用 Python 实现的一个为了爬取网站数据、提取结构性数据而编写的应用框架。

Scrapy 常应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。

通常我们可以很简单的通过 Scrapy 框架实现一个爬虫,抓取指定网站的内容或图片。

Scrapy架构图(绿线是数据流向)

Scrapy Engine(引擎): 负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。

Scheduler(调度器): 它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。

Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理,

Spider(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器).

Item Pipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方。

Downloader Middlewares(下载中间件):你可以当作是一个可以自定义扩展下载功能的组件。

Spider Middlewares(Spider中间件):你可以理解为是一个可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests)

Scrapy的运作流程

代码写好,程序开始运行...

1 引擎:Hi!Spider, 你要处理哪一个网站?

2 Spider:老大要我处理xxxx.com。

3 引擎:你把第一个需要处理的URL给我吧。

4 Spider:给你,第一个URL是xxxxxxx.com。

5 引擎:Hi!调度器,我这有request请求你帮我排序入队一下。

6 调度器:好的,正在处理你等一下。

7 引擎:Hi!调度器,把你处理好的request请求给我。

8 调度器:给你,这是我处理好的request

9 引擎:Hi!下载器,你按照老大的下载中间件的设置帮我下载一下这个request请求

10 下载器:好的!给你,这是下载好的东西。(如果失败:sorry,这个request下载失败了。然后引擎告诉调度器,这个request下载失败了,你记录一下,我们待会儿再下载)

11 引擎:Hi!Spider,这是下载好的东西,并且已经按照老大的下载中间件处理过了,你自己处理一下(注意!这儿responses默认是交给def parse()这个函数处理的)

12 Spider:(处理完毕数据之后对于需要跟进的URL),Hi!引擎,我这里有两个结果,这个是我需要跟进的URL,还有这个是我获取到的Item数据。

13 引擎:Hi !管道 我这儿有个item你帮我处理一下!调度器!这是需要跟进URL你帮我处理下。然后从第四步开始循环,直到获取完老大需要全部信息。

14 管道调度器:好的,现在就做!

注意!只有当调度器中不存在任何request了,整个程序才会停止,(也就是说,对于下载失败的URL,Scrapy也会重新下载。)

制作 Scrapy 爬虫 一共需要4步:

新建项目 (scrapy startproject xxx):新建一个新的爬虫项目

明确目标 (编写items.py):明确你想要抓取的目标

制作爬虫 (spiders/xxspider.py):制作爬虫开始爬取网页

存储内容 (pipelines.py):设计管道存储爬取内容

安装

Windows 安装方式

升级 pip 版本:

pip install --upgrade pip

通过 pip 安装 Scrapy 框架:

pip install Scrapy

Ubuntu 安装方式

安装非 Python 的依赖:

sudo apt-getinstall python-dev python-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev

通过 pip 安装 Scrapy 框架:

sudo pip install scrapy

Mac OS 安装方式

对于Mac OS系统来说,由于系统本身会引用自带的python2.x的库,因此默认安装的包是不能被删除的,但是你用python2.x来安装Scrapy会报错,用python3.x来安装也是报错,我最终没有找到直接安装Scrapy的方法,所以我用另一种安装方式来说一下安装步骤,解决的方式是就是使用virtualenv来安装。

$ sudo pip install virtualenv

$ virtualenv scrapyenv

$ cd scrapyenv

$ source bin/activate

$ pip install Scrapy

安装后,只要在命令终端输入 scrapy,提示类似以下结果,代表已经安装成功。

入门案例

学习目标

创建一个Scrapy项目

定义提取的结构化数据(Item)

编写爬取网站的 Spider 并提取出结构化数据(Item)

编写 Item Pipelines 来存储提取到的Item(即结构化数据)

一. 新建项目(scrapy startproject)

在开始爬取之前,必须创建一个新的Scrapy项目。进入自定义的项目目录中,运行下列命令:

scrapy startproject mySpider

其中, mySpider 为项目名称,可以看到将会创建一个 mySpider 文件夹,目录结构大致如下:

下面来简单介绍一下各个主要文件的作用:

mySpider/scrapy.cfg

mySpider/__init__.py

items.py

pipelines.py

settings.py

spiders/__init__.py

...

这些文件分别是:

scrapy.cfg: 项目的配置文件。

mySpider/: 项目的Python模块,将会从这里引用代码。

mySpider/items.py: 项目的目标文件。

mySpider/pipelines.py: 项目的管道文件。

mySpider/settings.py: 项目的设置文件。

mySpider/spiders/: 存储爬虫代码目录。

二、明确目标(mySpider/items.py)

我们打算抓取 http://www.itcast.cn/channel/teacher.shtml 网站里的所有讲师的姓名、职称和个人信息。

打开 mySpider 目录下的 items.py。

Item 定义结构化数据字段,用来保存爬取到的数据,有点像 Python 中的 dict,但是提供了一些额外的保护减少错误。

可以通过创建一个 scrapy.Item 类, 并且定义类型为 scrapy.Field 的类属性来定义一个 Item(可以理解成类似于 ORM 的映射关系)。

接下来,创建一个 ItcastItem 类,和构建 item 模型(model)。

importscrapy

classItcastItem(scrapy.Item):name =scrapy.Field()title =scrapy.Field()info =scrapy.Field()

三、制作爬虫 (spiders/itcastSpider.py)

爬虫功能要分两步:

1. 爬数据

在当前目录下输入命令,将在mySpider/spider目录下创建一个名为itcast的爬虫,并指定爬取域的范围:

scrapy genspider itcast "itcast.cn"

打开 mySpider/spider目录里的 itcast.py,默认增加了下列代码:

importscrapy

classItcastSpider(scrapy.Spider):name ="itcast"allowed_domains =["itcast.cn"]start_urls =('http://www.itcast.cn/',)defparse(self,response):pass

其实也可以由我们自行创建itcast.py并编写上面的代码,只不过使用命令可以免去编写固定代码的麻烦

要建立一个Spider, 你必须用scrapy.Spider类创建一个子类,并确定了三个强制的属性 和 一个方法。

name = "" :这个爬虫的识别名称,必须是唯一的,在不同的爬虫必须定义不同的名字。

allow_domains = [] 是搜索的域名范围,也就是爬虫的约束区域,规定爬虫只爬取这个域名下的网页,不存在的URL会被忽略。

start_urls = () :爬取的URL元祖/列表。爬虫从这里开始抓取数据,所以,第一次下载的数据将会从这些urls开始。其他子URL将会从这些起始URL中继承性生成。

parse(self, response) :解析的方法,每个初始URL完成下载后将被调用,调用的时候传入从每一个URL传回的Response对象来作为唯一参数,主要作用如下:

负责解析返回的网页数据(response.body),提取结构化数据(生成item)

生成需要下一页的URL请求。

将start_urls的值修改为需要爬取的第一个url

start_urls =("http://www.itcast.cn/channel/teacher.shtml",)

修改parse()方法

defparse(self,response):filename ="teacher.html"open(filename,'w').write(response.body)

然后运行一下看看,在mySpider目录下执行:

scrapy crawl itcast

是的,就是 itcast,看上面代码,它是 ItcastSpider 类的 name 属性,也就是使用 scrapy genspider命令的唯一爬虫名。

运行之后,如果打印的日志出现 [scrapy] INFO: Spider closed (finished),代表执行完成。 之后当前文件夹中就出现了一个 teacher.html 文件,里面就是我们刚刚要爬取的网页的全部源代码信息。

注意:Python2.x默认编码环境是ASCII,当和取回的数据编码格式不一致时,可能会造成乱码;我们可以指定保存内容的编码格式,一般情况下,我们可以在代码最上方添加

importsys

reload(sys)sys.setdefaultencoding("utf-8")

这三行代码是 Python2.x 里解决中文编码的万能钥匙,经过这么多年的吐槽后 Python3 学乖了,默认编码是Unicode了...(祝大家早日拥抱Python3)

2. 取数据

爬取整个网页完毕,接下来的就是的取过程了,首先观察页面源码:

xxx

xxxxx

xxxxxxxx

是不是一目了然?直接上 XPath 开始提取数据吧。

xpath 方法,我们只需要输入的 xpath 规则就可以定位到相应 html 标签节点,详细内容可以查看 xpath 教程。

不会 xpath 语法没关系,Chrome 给我们提供了一键获取 xpath 地址的方法(右键->检查->copy->copy xpath),如下图:

这里给出一些 XPath 表达式的例子及对应的含义:

/html/head/title: 选择HTML文档中

标签内的 元素

/html/head/title/text(): 选择上面提到的

元素的文字

//td: 选择所有的

元素

//div[@class="mine"]: 选择所有具有 class="mine" 属性的 div 元素

举例我们读取网站 http://www.itcast.cn/ 的网站标题,修改 itcast.py 文件代码如下::

# -*- coding: utf-8 -*-importscrapy

# 以下三行是在 Python2.x版本中解决乱码问题,Python3.x 版本的可以去掉importsys

reload(sys)sys.setdefaultencoding("utf-8")classOpp2Spider(scrapy.Spider):name ='itcast'allowed_domains =['itcast.com']start_urls =['http://www.itcast.cn/']defparse(self,response):# 获取网站标题context =response.xpath('/html/head/title/text()')# 提取网站标题title =context.extract_first()print(title)pass

执行以下命令:

$ scrapy crawl itcast

......传智播客官网-好口碑IT培训机构,一样的教育,不一样的品质......

我们之前在 mySpider/items.py 里定义了一个 ItcastItem 类。 这里引入进来:

frommySpider.items importItcastItem

然后将我们得到的数据封装到一个 ItcastItem 对象中,可以保存每个老师的属性:

frommySpider.items importItcastItemdefparse(self,response):#open("teacher.html","wb").write(response.body).close()# 存放老师信息的集合items =[]foreach inresponse.xpath("//div[@class='li_txt']"):# 将我们得到的数据封装到一个 `ItcastItem` 对象item =ItcastItem()#extract()方法返回的都是unicode字符串name =each.xpath("h3/text()").extract()title =each.xpath("h4/text()").extract()info =each.xpath("p/text()").extract()#xpath返回的是包含一个元素的列表item['name']=name[0]item['title']=title[0]item['info']=info[0]items.append(item)# 直接返回最后数据returnitems

我们暂时先不处理管道,后面会详细介绍。

保存数据

scrapy保存信息的最简单的方法主要有四种,-o 输出指定格式的文件,命令如下:

scrapy crawl itcast -o teachers.json

json lines格式,默认为Unicode编码

scrapy crawl itcast -o teachers.jsonl

csv 逗号表达式,可用Excel打开

scrapy crawl itcast -o teachers.csv

xml格式

scrapy crawl itcast -o teachers.xml

思考

如果将代码改成下面形式,结果完全一样。

请思考 yield 在这里的作用(Python yield 使用浅析):

# -*- coding: utf-8 -*-importscrapy

frommySpider.items importItcastItem# 以下三行是在 Python2.x版本中解决乱码问题,Python3.x 版本的可以去掉importsys

reload(sys)sys.setdefaultencoding("utf-8")classOpp2Spider(scrapy.Spider):name ='itcast'allowed_domains =['itcast.com']start_urls =("http://www.itcast.cn/channel/teacher.shtml",)defparse(self,response):#open("teacher.html","wb").write(response.body).close()# 存放老师信息的集合items =[]foreach inresponse.xpath("//div[@class='li_txt']"):# 将我们得到的数据封装到一个 `ItcastItem` 对象item =ItcastItem()#extract()方法返回的都是unicode字符串name =each.xpath("h3/text()").extract()title =each.xpath("h4/text()").extract()info =each.xpath("p/text()").extract()#xpath返回的是包含一个元素的列表item['name']=name[0]item['title']=title[0]item['info']=info[0]items.append(item)# 直接返回最后数据returnitems

python3 scrapy 教程_Scrapy 入门教程相关推荐

  1. TensorFlow 中文资源精选,官方网站,安装教程,入门教程,实战项目,学习路径。

    转载至:http://www.nanjixiong.com/thread-122211-1-1.html Awesome-TensorFlow-Chinese TensorFlow 中文资源全集,学习 ...

  2. extjs form java_[Java教程]ExtJS入门教程02,form也可以很优雅

    [Java教程]ExtJS入门教程02,form也可以很优雅 0 2014-03-28 12:00:40 在上一篇<Extjs window 入门>中,我们已经看到了如何将一个form组件 ...

  3. Python3数据分析——NumPy快速入门教程(官网教程翻译)

    目录 一.基础篇 1.创建数组 2.打印数组 3.基本运算 4.通用函数(ufunc) 5.索引,切片和迭代 二.形状操作 1.更改数组的形状 2.组合(stack)不同的数组 3.将一个数组分割(s ...

  4. python入门语言教程_Python入门教程(1)

    人生苦短,我用Python! Python(英语发音:/ˈpaɪθən/), 是一种面向对象.解释型计算机程序设计语言,由Guido van Rossum于1989年底发明,第一个公开发行版发行于19 ...

  5. django mysql 教程_Django 入门教程

    简介:本课程使用的开发环境为 Python 3.x .Django 1.8.13.课程中将对 Django 的环境搭建.视图.链接路由.模板.模型.数据库操作以及表单进行简单介绍,并结合简单实验示例加 ...

  6. python tensorflow教程_TensorFlow入门教程TensorFlow 基本使用T

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 TensorFlow入门教程 TensorFlow 基本使用 TensorFlow官方中文教程 TensorFlow 的特点: 使用图 (graph) 来 ...

  7. python第一次使用教程-python入门教程第一日

    python 官方下载地址:https://www.python.org/downloads/ 根据系统的不同安装包也不同,但是开发的程序兼容各个操作系统,这点是python能吃得开的原因之一. py ...

  8. linux terminal教程,Linux入门教程 - 如何记录和重放Linux终端会话

    原标题:Linux入门教程 - 如何记录和重放Linux终端会话 来自:https://www.linuxmi.com/replay-linux.html 使用命令,我们可以在type文件中记录终端会 ...

  9. 计算机linux入门教程,Turbolinux入门教程1

    原标题:Turbolinux入门教程1 第一课:什么是Linux 简单地说, Linux 是一套免费使用和自由传播的类 Unix 操作系统,它主要用于基于 Intel x86 系列 CPU 的计算机上 ...

最新文章

  1. pyhon制作word、excel、ppt转pdf转换器大作战
  2. UA MATH523A 实分析3 积分理论16 截口与单调类、特征函数的Fubini定理
  3. openssl 证书生成手册
  4. 深度学习在遥感图像目标检测中的应用综述
  5. Linux的centos永久关闭防火墙的命令
  6. Java进阶之光!mysql安装包安装教程
  7. 验证码一(验证码生成)
  8. 十堰市人民小学一年级在计算机学校,我上一年级啦!
  9. Android运行时修改Manifest,Android如何动态修改Manifest文件
  10. 拓端tecdat|R语言在不同样本量下的Little‘s MCAR检验
  11. 专业化分类服务,引领IDC行业发展新模式
  12. 海康威视多路播放开发步骤及参考代码
  13. 缺少计算机所需的介质驱动程序6,缺少计算机所需的介质驱动程序解决办法
  14. blob和clob类型数据怎么插入数据库
  15. eclipse没有Java EE透视图!
  16. html打造动画【系列2】- 可爱的蛙蛙表情
  17. 单片机语音模块JQ8900-16P的几种触发方式与源码配置
  18. 亚马逊——不一样的电商公司
  19. python案例教程钱毅湘_Python案例教程 清华大学出版社 钱毅湘等 高等学校通识教育系列教材 软件工具 程序设计Python...
  20. 学计算机专业 要画素描吗,你是怎样开始学画画的?毕业后在做什么?艺术生讲述亲身经历...

热门文章

  1. nexus安装详细过程(附安装包和下载地址)与nexus简介
  2. 视觉SLAM--直接法
  3. Azure学习笔记2.——六种虚拟网络连接
  4. sso单点登录的PHP实现(Laravel框架)
  5. FleaPHP 开发指南 - 6. 访问数据库
  6. FleaPHP 学习笔记2
  7. ES 实现数据库or查询效果
  8. golang前后端分离框架
  9. shiro使用md5salt哈希散列加密
  10. HTML5+CSS3小实例:3D旋转木马相册