一、Scrapy框架的介绍
Scrapy是一个基于Twisted 的异步处理框架,是纯 Python 实现的爬虫框架,其架构清晰,模块之间的耦合程度低,可扩展性极强,可以灵活完成各种需求。
1.1架构介绍
- 1.Engine:引擎,处理整个系统的数据流处理、触发事物
- Item:项目,它定义了怕去结果的数据结构,爬取的数据会被赋值成该Item对象
- Scheduler:调度器,接受引擎发过来的请求并将其加入队列中,在引擎再次请求的时候即哪个请求提供给引擎
- Downloader:下载器,下载网页内容,并将网页内容返回给蜘蛛
- Spider:蜘蛛,定义了爬虫的逻辑和网页的解析规则,他主要负责解析响应并生成提取结果和新的请求
- Item Pipeline:项目管道,负责处理由蜘蛛从网页中抽取的项目,它的主要任务是清洗、验证和存储数据
- Downloader Middlewares:下载器中间件,位于引擎和下载器之间的钩子框架,主要处理引擎与下载器之间的请求及相应
- Spider Middlewares:蜘蛛的中间件,位于引擎和蜘蛛之间的钩子框架,主要处理蜘蛛输入的响应和输出的结果以及新的请求
1.2.数据流
Scrapy中的数据流由引擎控制,通过多个组件的相互协作、不同完成工作的不同、组件对异步处理的支持,Scrapy最大限度也利用了网络宽带,大大提高了数据爬取和处理的效率。数据流的过程如下:
- 1.Engine首先打开一个网站,找到处理该网站的Spider,并向该Spider请求第一个要爬取的URL
- 2.Engine从Spider中获取到第一个要爬取的URL,并通过Scheduler以Request的形式调度
- 3.Engine向Scheduler请求下一个要爬取的URL
- 4.Scheduler返回下一个要爬取的URL给Engine,Engine将URL通过Downloader
- 5.一旦页面下载完毕,Downloader生成页面的Response,并将其通过Downloader Middlewares
- 6.Engine从下载器中接收到Response,并将其通过Spider Middlewares发送给Spider处理
- 7.Spider处理Response,并返回爬取到的Item及新的Request给Engine
- 8.Engine将Spider返回的Item给Item Pipeline,将新的Request给Scheduler
- 9.重复(2)-(8)的步骤,直到Scheduler中没有更多的Request,Engine关闭该网站,爬取结束
二、Scrapy安装
Scrapy 一个十分强大的爬虫框架 ,依赖的库比较多 ,至少需要依赖的库有 Twisted 14.0、lxml 3.4、pyOpenSSL0.14。在不同的平台环境下,它所依赖的库也各不相同,所以在安装之前,最好确保把这些基本库安装好。
- 1.首先我们安装好Anaconda,此前我有些过关于关于conda的使用博客可以参考
- 2.安装好conda,就可以直接通过命令安装Scrapy
pip install Scrapy
2.1.验证安装
安装之后,在命令行下输入scrapy,出现类似如下图,就证明Scrapy安装完成
三、Scrapy入门
3.1创建项目
- 1.我们在终端中输入此命令,这个命令可以在任意文件夹运行
- 2.这个命令将会创建一个名为once的文件夹
- 3.如果提示权限问题,可以加sudo运行该命令
scrapy startproject once
-
文件夹结构如下所示:
- scrapy.cfg Scrapy部署时的配置文件
- once 项目的模块,需要从这里引入
- __ init__.py
- item.py Item的定义,定义爬取的数据结构
- middlewares.py Middlewares的定义,定义爬取时的中间件
- pipelines.py Pipelines的定义,定义数据管道
- settings.py 配置文件
- spiders 配置文件
3.2创建Spider
Spider是自己定义的类,Scrapy 用它来从网页里抓取内容,并解析抓取的结果。不过这个类必须继承 Scrapy 提供的Spider类scrapy.Spider ,还要定义 Spider 的名称和起始请求,以及怎样处理爬取的结果的方法
- 1.首先进入scrapy爬虫
cd once
- 2.然后在执行如下命令(生成一个名称为baidutieba的spider),生成的baidutieba.py在文件once文件里面的spiders目录下
scrapy genspider baidutieba baidu.com
这里有三个属性 — name、allowed_domains、start_urls还有一个方法parse
- name:它是每个项目唯一的名字,用来区分不同的Spider
- allowed_domains:它是允许爬取的域名,如果初始或后续的请求链接不是这个域名下的,则请求链接会被过滤掉
- start_urls:它包含了Spider在启动时爬去的url列表,初始请求是由它来定义的
- parse:它是Spider的一个方法。默认情况下,被调用时start_urls里面的链接构成的请求完成下载执行后,返回的响应就会作为唯一的参数传递给这个函数。该方法负责解析返回的响应、提取数据或者进一步生成要处理的请求
三、项目文件详情
- BOT_NAME:项目名
- SPIDER_MODULES:Scrapy搜索spider的模块列表 默认: [xxx.spiders]
- NEWSPIDER_MODULE:使用 genspider 命令创建新spider的模块。默认: ‘xxx.spiders’
- USER_AGENT:默认是注释的,如果不写很容易被判断为电脑USER_AGENT = ‘Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36’
- ROBOTSTXT_OBEY:如果启用,Scrapy将会采用 robots.txt策略
- CONCURRENT_REQUESTS:Scrapy downloader 并发请求(concurrent requests)的最大值,默认: 16
- DOWNLOAD_DELAY:下载器在下载同一个网站下一个页面前需要等待的时间,该选项可以用来限制爬取速度,减轻服务器压力。同时也支持小数:0.25 以秒为单位
- 下载延迟设置只有一个有效
- CONCURRENT_REQUESTS_PER_DOMAIN:对单个网站进行并发请求的最大值。
- CONCURRENT_REQUESTS_PER_IP = 16:对单个IP进行并发请求的最大值。如果非0,则忽略 CONCURRENT_REQUESTS_PER_DOMAIN 设定,使用该设定。 也就是说,并发限制将针对IP,而不是网站。该设定也影响 DOWNLOAD_DELAY: 如果 CONCURRENT_REQUESTS_PER_IP 非0,下载延迟应用在IP而不是网站上。
- COOKIES_ENABLED :禁用Cookie(默认情况下启用)
- TELNETCONSOLE_ENABLED:禁用Telnet控制台(默认启用)
- DEFAULT_REQUEST_HEADERS:覆盖默认请求标头
- SPIDER_MIDDLEWARES:启用或禁用蜘蛛中间件
- DOWNLOADER_MIDDLEWARES:启用或禁用下载器中间件
- EXTENSIONS:启用或禁用扩展程序
- ITEM_PIPELINES:配置项目管道
- AUTOTHROTTLE_ENABLED:启用和配置AutoThrottle扩展(默认情况下禁用)
- AUTOTHROTTLE_START_DELAY:初始下载延迟
- AUTOTHROTTLE_MAX_DELAY:在高延迟的情况下设置的最大下载延迟
- AUTOTHROTTLE_TARGET_CONCURRENCY:Scrapy请求的平均数量应该并行发送每个远程服务器
- AUTOTHROTTLE_DEBUG:启用显示所收到的每个响应的调节统计信息
- 启用和配置HTTP缓存(默认情况下禁用):
- #HTTPCACHE_ENABLED
- HTTPCACHE_EXPIRATION_SECS
- HTTPCACHE_DIR
- HTTPCACHE_IGNORE_HTTP_CODES
- HTTPCACHE_STORAGE
四、实战 - Scrapy爬取百度贴吧页面
- 1.首先,我们打开项目中刚才生成的baidutieba.py文件编写爬取代码
- 2.进入spiders,执行以下命令
cd spiders
scrapy crawl baidutieba
- 3.回车运行,我们可以发现once目录下生成了一个hello.txt的文件,里面就是百度贴吧网页源码