Scrapy 入门教程
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-get install 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.cfgmySpider/__init__.pyitems.pypipelines.pysettings.pyspiders/__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 网站里的所有讲师的姓名、职称和个人信息。
接下来,创建一个 ItcastItem 类,和构建 item 模型(model)。
import scrapyclass ItcastItem(scrapy.Item):name = scrapy.Field()title = scrapy.Field()info = scrapy.Field()
打开 mySpider 目录下的 items.py。
Item 定义结构化数据字段,用来保存爬取到的数据,有点像 Python 中的 dict,但是提供了一些额外的保护减少错误。
可以通过创建一个 scrapy.Item 类, 并且定义类型为 scrapy.Field 的类属性来定义一个 Item(可以理解成类似于 ORM 的映射关系)。
三、制作爬虫 (spiders/itcastSpider.py)
爬虫功能要分两步:
1. 爬数据
在当前目录下输入命令,将在mySpider/spider目录下创建一个名为itcast的爬虫,并指定爬取域的范围:
scrapy genspider itcast "itcast.cn"
打开 mySpider/spider目录里的 itcast.py,默认增加了下列代码:
import scrapyclass ItcastSpider(scrapy.Spider):name = "itcast"allowed_domains = ["itcast.cn"]start_urls = ('http://www.itcast.cn/',)def parse(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()方法
def parse(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,当和取回的数据编码格式不一致时,可能会造成乱码;我们可以指定保存内容的编码格式,一般情况下,我们可以在代码最上方添加
import sys reload(sys) sys.setdefaultencoding("utf-8")
这三行代码是 Python2.x 里解决中文编码的万能钥匙,经过这么多年的吐槽后 Python3 学乖了,默认编码是Unicode了...(祝大家早日拥抱Python3)
2. 取数据
爬取整个网页完毕,接下来的就是的取过程了,首先观察页面源码:
<div class="li_txt"><h3> xxx </h3><h4> xxxxx </h4><p> xxxxxxxx </p>
是不是一目了然?直接上 XPath 开始提取数据吧。
xpath 方法,我们只需要输入的 xpath 规则就可以定位到相应 html 标签节点,详细内容可以查看 xpath 教程。
不会 xpath 语法没关系,Chrome 给我们提供了一键获取 xpath 地址的方法(右键->检查->copy->copy xpath),如下图:
这里给出一些 XPath 表达式的例子及对应的含义:
/html/head/title
: 选择HTML文档中<head>
标签内的<title>
元素/html/head/title/text()
: 选择上面提到的<title>
元素的文字//td
: 选择所有的<td>
元素//div[@class="mine"]
: 选择所有具有class="mine"
属性的div
元素
举例我们读取网站 http://www.itcast.cn/ 的网站标题,修改 itcast.py 文件代码如下::
# -*- coding: utf-8 -*- import scrapy# 以下三行是在 Python2.x版本中解决乱码问题,Python3.x 版本的可以去掉 import sys reload(sys) sys.setdefaultencoding("utf-8")class Opp2Spider(scrapy.Spider):name = 'itcast'allowed_domains = ['itcast.com']start_urls = ['http://www.itcast.cn/']def parse(self, response):# 获取网站标题context = response.xpath('/html/head/title/text()') # 提取网站标题title = context.extract_first() print(title) pass
执行以下命令:
$ scrapy crawl itcast ... ... 传智播客官网-好口碑IT培训机构,一样的教育,不一样的品质 ... ...
我们之前在 mySpider/items.py 里定义了一个 ItcastItem 类。 这里引入进来:
from mySpider.items import ItcastItem
然后将我们得到的数据封装到一个 ItcastItem 对象中,可以保存每个老师的属性:
from mySpider.items import ItcastItemdef parse(self, response):#open("teacher.html","wb").write(response.body).close()# 存放老师信息的集合items = []for each in response.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)# 直接返回最后数据return items
我们暂时先不处理管道,后面会详细介绍。
保存数据
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 -*- import scrapy from mySpider.items import ItcastItem# 以下三行是在 Python2.x版本中解决乱码问题,Python3.x 版本的可以去掉 import sys reload(sys) sys.setdefaultencoding("utf-8")class Opp2Spider(scrapy.Spider):name = 'itcast'allowed_domains = ['itcast.com']start_urls = ("http://www.itcast.cn/channel/teacher.shtml",)def parse(self, response):#open("teacher.html","wb").write(response.body).close()# 存放老师信息的集合items = []for each in response.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)# 直接返回最后数据return items
Scrapy 入门教程相关推荐
- python scrapy 简单教程_python之scrapy入门教程
看这篇文章的人,我假设你们都已经学会了python(派森),然后下面的知识都是python的扩展(框架). 在这篇入门教程中,我们假定你已经安装了Scrapy.如果你还没有安装,那么请参考安装指南. ...
- Scrapy入门教程
本文参考Scrapy Tutorial里面的文档,翻译出来加上自己的理解,供大家学习. 在本文中,我们将学会如何使用Scrapy建立一个爬虫程序,并爬取指定网站上的内容,这一切在Scrapy框架内实现 ...
- Scrapy入门教程(2)——保存数据
爬取股票名称.每股利润和净利润 完整项目已上传至github 链接:https://github.com/yinhaox/02_scrapy 数据爬取 可以接着之间的项目改,也可以重建一个 图一网页截 ...
- Scrapy入门教程实例
Scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. scrapy的整体框架如下所示: Scrapy主要 ...
- Scrapy爬取P2P新闻入门教程
文章目录 安装Scrapy 建立Scrapy项目 修改配置文件 定义Item 编写Spider类 运行爬虫 参考链接 本博客不介绍具体细节,详细入门教程可以看最下方的参考链接,本博客只介绍如何实现一个 ...
- Scrapy爬虫入门教程五 Selectors(选择器)
Scrapy爬虫入门教程一 安装和基本使用 Scrapy爬虫入门教程二 官方提供Demo Scrapy爬虫入门教程三 命令行工具介绍和示例 Scrapy爬虫入门教程四 Spider(爬虫) Scrap ...
- Python Scrapy中文教程,Scrapy框架快速入门!
谈起爬虫必然要提起 Scrapy 框架,因为它能够帮助提升爬虫的效率,从而更好地实现爬虫. Scrapy 是一个为了抓取网页数据.提取结构性数据而编写的应用框架,该框架是封装的,包含 request ...
- python scrapy教程实例_爬虫框架Scrapy的第一个爬虫示例入门教程
原标题:爬虫框架Scrapy的第一个爬虫示例入门教程 我们使用dmoz.org这个网站来作为小抓抓一展身手的对象. 首先先要回答一个问题. 问:把网站装进爬虫里,总共分几步? 答案很简单,四步: 新建 ...
- python爬虫框架教程_Python爬虫实战(十二):爬虫框架Scrapy的第一个爬虫示例入门教程...
本文主要向大家介绍了Python爬虫实战的爬虫框架Scrapy的第一个爬虫示例入门教程,通过具体的内容向大家展现,希望对大家学习Python爬虫实战有所帮助. 我们使用dmoz.org这个网站来作为小 ...
- python scrapy框架爬虫_Scrapy爬虫框架教程(一)-- Scrapy入门
前言 转行做python程序员已经有三个月了,这三个月用Scrapy爬虫框架写了将近两百个爬虫,不能说精通了Scrapy,但是已经对Scrapy有了一定的熟悉.准备写一个系列的Scrapy爬虫教程,一 ...
最新文章
- 开发了个 Flipper 调试工具的 Flutter 版本 SDK,让 Flutter 应用调试起来更容易
- 在robotframework中连接数据库进行操作
- eclipse插件开发_开发Eclipse插件
- Django 【认证系统】auth
- 全连接层的输入和输出_理解Web应用程序的本质,网络数据流处理与基础网络连接...
- centos 低版本出现fatal: unable to access 'https://github.com/XXXX': SSL connect error
- 新基建浪潮下,看边缘计算+5G如何乘风破浪
- 深度学习_目标检测 R-CNN 论文笔记
- 144显示器只有60_3199元34寸144Hz高刷新曲面带鱼屏显示器咋样?用过才知道
- 京东面试撞上重感冒(纯粹面试之感)。。。。。。
- lib、dll文件的中函数的查看与lib、dll、pdb文件的介绍
- 教育类产品 竞品分析
- 包含了6种不同格式的10种不同的Code 39条形码字体样式的工具包Code 39 Font Advantage Package
- Python画樱花树~
- python多进程传递参数_Python进程,多进程,获取进程id,给子进程传递参数操作示例...
- 项目经理考PMP,薪资会提高吗?
- jQuery添加插入元素技巧
- C语言运算符优先级口诀
- 微信小程序管理客服微信号
- 果蔬超市管理系统的设计与实现
热门文章
- HBuilderX配置自动格式化,统一代码规范
- NetLogo的下载安装过程
- 智能一代云平台(十六):解决Linux服务器被植入木马总结
- 油菜花系统服务器能删除内容吗,油菜花期蜂群管理要点
- golang 求差集和并集算法
- 记录一次pre环境OOM异常解决过程
- java如何重命名class_java – 如何重命名XStream列表元素?
- 电子计算机的指法,键盘指法图/电脑键盘指法练习
- php根据键值排序,数组根据某个键值排序
- MacOS Catalina 10.15.1 (19B88) — 苹果操作系统