scrapy简介:
scrapy是一个基于Twisted的异步处理框架,是纯python实现的爬虫框架,其架构清晰,模块之间的耦合程度低,可扩展性极强。可以灵活的完成各种需求。我们只要定制开发几个模块就可以轻松的实现一个爬虫!
!!!扩展:
Twisted是用Python实现的基于事件驱动的网络引擎框架,Twisted支持许多常见的传输及应用层协议,包括TCP、UDP、SSL/TLS、HTTP、IMAP、SSH、IRC以及FTP。就像Python一样,Twisted也具有“内置电池”(batteries-included)的特点。Twisted对于其支持的所有协议都带有客户端和服务器实现,同时附带有基于命令行的工具,使得配置和部署产品级的Twisted应用变得非常方便。
scrapy的架构介绍:
engine:引擎,处理整个系统的数据流处理,触发事务、是整个框架的核心。
item:项目,它定义了爬取结果的数据结构,爬取的数据结构会被赋值成Item对象
Scheduler:调度器,接受引擎发过来的请求并将其加入队列当中,在引擎再次请求的时候将请求提供给引擎
Downloader:下载器, 下载网页内容返回给蜘蛛(spiders)。
Spider(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器),
Item Pipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方.
Downloader Middlewares(下载中间件):你可以当作是一个可以自定义扩展下载功能的组件。
Spider Middlewares(Spider中间件):你可以理解为是一个可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests)
scrapy框架的使用
#创建一个爬虫项目
scrapy startproject 项目名称
#在项目中创建爬虫文件
scrapy genspider 爬虫文件名称 爬取网站域名
#例: scrapy genspider baidu baidu.com
1.scrapy中的解析方法
xpath选择器和css选择器:
在scrapy 中我们可以直接通过response.xpath('') 和 response.css('')直接调用,并通过extract()方法,将取到的selector对象转换为字符串(在一个列表中)
2.scrapy shell
我们可以在终端scrapy shell http://xxxx.xxx.xxx 命令进入到scrapy shell 模式 进行调试
3.scrapy spider
Spider类定义了如何爬取某个(或某些)网站。包括了爬取的动作(例如:是否跟进链接)以及如何从网页的内容中提取结构化数据(爬取item)。 换句话说,Spider就是您定义爬取的动作及分析某个网页(或者是有些网页)的地方。
class scrapy.Spider是最基本的类,所有编写的爬虫必须继承这个类。
主要用到的函数及调用顺序为:
init() : 初始化爬虫名字和start_urls列表
start_requests() 调用make_requests_from url():生成Requests对象交给Scrapy下载并返回response
parse():
解析response,并返回Item或Requests(需指定回调函数)。
Item传给Item pipline持久化 , 而Requests交由Scrapy下载,并由指定的回调函数处理(默认parse()),一直进行循环,直到处理完所有的数据为止。
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
缓存保存路径
HTTPCACHE_DIR = 'httpcache'
缓存忽略的Http状态码
HTTPCACHE_IGNORE_HTTP_CODES = []
缓存存储的插件
HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'
关于日志信息的设置
LOG_ENABLED
默认: True
是否启用logging。
LOG_ENCODING
默认: 'utf-8'
logging使用的编码。
LOG_LEVEL
默认: 'DEBUG'
log的最低级别。可选的级别有: CRITICAL、 ERROR、WARNING、INFO、DEBUG 。
- CRITICAL - 严重错误(critical)
- ERROR - 一般错误(regular errors)
- WARNING - 警告信息(warning messages)
- INFO - 一般信息(informational messages)
- DEBUG - 调试信息(debugging messages)
LOG_FILE
默认: None
logging输出的文件名。如果为None,则使用标准错误输出(standard error)。
Logging使用
Scrapy提供了log功能,可以通过 logging 模块使用。
可以修改配置文件settings.py,任意位置添加下面两行,效果会清爽很多。
LOG_FILE = "TencentSpider.log"
LOG_LEVEL = "INFO"
Scrapy 的暂停和恢复
有些情况下,例如爬取大的站点,我们希望能暂停爬取,之后再恢复运行。
Scrapy通过如下工具支持这个功能:
一个把调度请求保存在磁盘的调度器
一个把访问请求保存在磁盘的副本过滤器[duplicates filter]
一个能持续保持爬虫状态(键/值对)的扩展
Job 路径:
要启用持久化支持,你只需要通过 JOBDIR 设置 job directory 选项。
这个路径将会存储 所有的请求数据来保持一个单独任务的状态(例如:一次
spider爬取(a spider run))。必须要注意的是,这个目录不允许被不同的
spider 共享,甚至是同一个spider的不同jobs/runs也不行。也就是说,
这个目录就是存储一个 单独 job的状态信息。
怎么使用??? 要启用一个爬虫的持久化,运行以下命令:
scrapy crawl somespider -s JOBDIR=crawls/somespider-1