Scrapy 框架
Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛。
框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非常之方便。
Scrapy 使用了 Twisted['twɪstɪd] 异步网络框架来处理网络通讯,可以加快我们的下载速度,不用自己去实现异步框架,并且包含了各种中间件接口,可以灵活的完成各种需求。
框架流程中的各个部分:
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(下载中间件): 可以自定义扩展下载功能的组件(代理、cokies等)。
Spider Middlewares(Spider中间件): 可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests)
Scrapy的安装
Scrapy框架官方网址:http://doc.scrapy.org/en/latest
Scrapy中文维护站点:http://scrapy-chs.readthedocs.io/zh_CN/latest/index.html
Windows 安装方式: pip3 install Scrapy
Ubuntu 安装方式: sudo pip3 install scrapy
注意:如果Windows安装,不上因为你的电脑上没有安装 Microsoft Visual C++ 14.0,造成编译安装失败,解决方法:
根据这个网站找到对应的win版本下载即可: https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
然后安装 在命令窗口输入命令即可 : Twisted-18.7.0-cp36-cp36m-win_amd64.whl
安装非Python的依赖
sudo apt-get install python3-dev python-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev
创建项目
创建爬虫项目:scrapy startproject 爬虫项目名称
新建爬虫文件:scrapy genspider 爬虫文件名称 要爬的地址:如.csdn.net、.baidu.com等
文件作用:
scrapy.cfg :它是Scrapy 项目的配置文件,其内定义了项目的配置文件路径、部署相关信息等内容。
items.py :它定义Item 数据结构,所有的Item 的定义都可以放这里。
pipelines.py :它定义Item Pipeline的实现,所有的Item Pipeline的实现都可以放这里。
settings.py :它定义项目的全局配置。
middlewares.py :它定义Spider Middlewares 和Downloader Middlewares 的实现。
spiders:其内包含一个个Spider 的实现,每个Spider 都有一个文件。
根据目标网站分析需要提取的数据,在item.py文件中添加字段
打开jobboleproject文件下的item.py文件
item 定义结构化数据字段,用来保存爬取到的数据,有点像Python中的dict,但是提供了一些额外的保护减少错误。
可以通过创建一个 scrapy.Item 类, 并且定义类型为 scrapy.Field的类属性来定义一个Item(可以理解成类似于ORM的映射关系)
要建立一个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)的值修改为需要爬取的第一个url
yeild函数介绍:
简单地讲,yield 的作用就是把一个函数变成一个 generator(生成器),带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,带有yeild的函数遇到yeild的时候就返回一个迭代值,下次迭代时,
代码从 yield 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,
直到再次遇到 yield。
通俗的讲就是:在一个函数中,程序执行到yield语句的时候,程序暂停,返回yield后面表达式的值,在下一次调用的时候,从yield语句暂停的地方继续执行,如此循环,直到函数执行完。
数据持久化
方式一:数据存入mongodb数据库
settings.py文件:设置文件,在这里设置User-Agent,激活管道文件等...
'douban.pipelines.DoubanPipeline': 300,
}
MONGODB_HOST = '127.0.0.1' #MONGODB 主机名
MONGODB_PORT= 27017 #MONGODB 端口号
MONGODB_DBNAME = "Douban" #数据库名称
MONGODB_SHEETNAME= "doubanmovies" #存储数据的表名称
pipelines.py管道:这里进行数据的清洗和持久化