1. Scrapy 框架
- Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛。
- 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非常之方便。
- Scrapy 使用了 Twisted['twɪstɪd] 异步网络框架来处理网络通讯,可以加快我们的下载速度,不用自己去实现异步框架,并且包含了各种中间件接口,可以灵活的完成各种需求。
2.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)
Ubuntu的安装方式
- 通过pip3安装Scrapy框架
sudo pip3 install scrapy
- 新建项目
scrapy startproject 项目名称
- 新建爬虫文件
scrapy genspider 爬虫文件名 爬虫文件的网络地址
爬虫文件一般如下所示:
# -*- coding: utf-8 -*-
import scrapy
class JobboleSpider(scrapy.Spider):
name = 'jobbole'
allowed_domains = ['jobbole.com']
start_urls = ['http://blog.jobbole.com/all-posts/']
def parse(self, response):
pass
########这里的三个属性和一个方法都是必须有的
- name = "" :这个爬虫的识别名称,必须是唯一的,在不同的爬虫必须定义不同的名字。
- allow_domains = [] 是搜索的域名范围,也就是爬虫的约束区域,规定爬虫只爬取这个域名下的网页,不存在的URL会被忽略。
- start_urls = () :爬取的URL元祖/列表。爬虫从这里开始抓取数据,所以,第一次下载的数据将会从这些urls开始。其他子URL将会从这些起始URL中继承性生成。
- parse(self, response) :解析的方法,每个初始URL完成下载后将被调用,调用的时候传入从每一个URL传回的Response对象来作为唯一参数,主要作用如下:
- 负责解析返回的网页数据(response.body),提取结构化数据(生成item)
- 生成需要下一页的URL请求。
Scrapy Shell的使用
Scrapy终端是一个交互终端,我们可以在未启动spider的情况下尝试及调试代码,也可以用来测试XPath或CSS表达式,查看他们的工作方式,方便我们爬取的网页中提取的数据。(ipython的界面显示更友好)
启动Scrapy Shell
scrapy shell "http://hr.tencent.com/position.php?&start=0#a"
scrapy shell -s USER_AGENT="Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36" "http://hr.tencent.com/position.php?&start=0#a"
__*在Scrapy Shell 中,可以使用xpath语法或者css语法
如:response.xpath('//title').extract(),
当然Scrapy 的commend不仅仅如此,但是不属于我们课程重点,不做详细介绍。 例如:
- scrapy -h 查看所有可用的命令:
- scrapy view -h 查看view命令的详细内容:
- scrapy list列出当前项目中所有可用的spider
- scrapy runspider xxxx.py在未创建项目的情况下,运行一个编写在Python文件中的spider。
- scrapy version输出Scrapy版本
官方文档详细作用讲解和使用: http://scrapy-chs.readthedocs.io/zh_CN/latest/topics/shell.html
Scrapy Settings.py文件配置
Scrapy设置(settings)提供了定制Scrapy组件的方法。可以控制包括核心(core),插件(extension),pipeline及spider组件。比如 设置 Pipeliine、LOG_LEVEL等。
BOT_NAME
(也是项目名称)。
使用 startproject 命令创建项目时会被自动赋值。
SPIDER_MODULES = ['ziruproject.spiders'] NEWSPIDER_MODULE = 'ziruproject.spiders'
爬虫的文件路径
USER_AGENT
用户代理,一般设置这个参数用来伪装浏览器请求
ROBOTSTXT_OBEY
是否遵守ROBOT协议,为False时,表示不遵守,
为True时表示遵守(默认为True)
CONCURRENT_REQUESTS
默认: 16
Scrapy downloader(下载器) 处理的最大的并发请求数量。
DOWNLOAD_DELAY
下载延迟的秒数,用来限制访问的频率
CONCURRENT_REQUESTS_PER_DOMAIN
每个域名下能够被执行的最大的并发请求数据量,
默认为8
CONCURRENT_REQUESTS_PER_IP
默认: 0
对单个IP进行并发请求的最大值。
1.如果非0,则忽略CONCURRENT_REQUESTS_PER_DOMAIN
设定,使用该设定。
也就是说,并发限制将针对IP,而不是网站。
2.该设定也影响 DOWNLOAD_DELAY: 如果
CONCURRENT_REQUESTS_PER_IP 非0,
下载延迟应用在IP而不是网站上。
COOKIES_ENABLED
是否要携带cookies,一般情况下,不是必须要携带
cookies的请求,我们将这个参数设置为False,(默认为True)
TELNETCONSOLE_ENABLED
默认: True
表明 telnet 终端 (及其插件)是否启用的布尔值。
通过Telnet可以监听当前爬虫的状态、信息,
操作爬虫等...。
DEFAULT_REQUEST_HEADERS
默认: 如下
{
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8',
'Accept-Language': 'en',
}
用于Scrapy HTTP请求的默认标头
EXTENSIONS
我们可以在这个参数下自定义扩展
ITEM_PIPELINES
设置并激活管道文件,为了存储数据使用,
后面的数字表示优先级,数字越小,优先级越高
DOWNLOAD_TIMEOUT
默认: 180
下载器超时时间(单位: 秒)。
自动限速(AutoThrottle)扩展
该扩展能根据Scrapy服务器及您爬取的网站的负载自动限制爬取速度。
设计目标
更友好的对待网站,而不使用默认的下载延迟0。 自动调整scrapy来优化下载速度,使得用户不用调节下载延迟及并发请求数来找到优化的值。 用户只需指定允许的最大并发请求数,剩下的都交给扩展来完成.
数据缓存:
目的:用来将已经发送的请求缓存下来,一遍后续使用
是否启用缓存策略
HTTPCACHE_ENABLED = True
缓存超时时间
HTTPCACHE_EXPIRATION_SECS = 0
缓存保存路径