笔记-scrapy-辅助功能

1.      scrapy爬虫管理

爬虫主体写完了,要部署运行,还有一些工程性问题;

  1. 限频
  2. 爬取深度限制
  3. 按条件停止,例如爬取次数,错误次数;
  4. 资源使用限制,例如内存限制;
  5. 状态报告,邮件
  6. 性能问题。

2.      限频

CONCURRENT_ITEMS # item队列最大容量

Default: 100

Maximum number of concurrent items (per response) to process in parallel in the Item Processor (also known as the Item Pipeline).

CONCURRENT_REQUESTS

Default: 16

The maximum number of concurrent (ie. simultaneous) requests that will be performed by the Scrapy downloader.

实现原理:

next_request中while循环,调用needs_back,如果len(self.active)>它,则继续空循环,否则下一步;

核心还是engine.py,会查询downloader,slot等是否需要等待

CONCURRENT_REQUESTS_PER_DOMAIN

Default: 8

The maximum number of concurrent (ie. simultaneous) requests that will be performed to any single domain.

See also: AutoThrottle extension and its AUTOTHROTTLE_TARGET_CONCURRENCY option.

CONCURRENT_REQUESTS_PER_IP

Default: 0

The maximum number of concurrent (ie. simultaneous) requests that will be performed to any single IP. If non-zero, the CONCURRENT_REQUESTS_PER_DOMAIN setting is ignored, and this one is used instead. In other words, concurrency limits will be applied per IP, not per domain.

This setting also affects DOWNLOAD_DELAY and AutoThrottle extension: if CONCURRENT_REQUESTS_PER_IP is non-zero, download delay is enforced per IP, not per domain.

DOWNLOAD_DELAY 下载间隔时间

3.      爬取深度限制

DEPTH_LIMIT

4.      按条件停止爬虫

首先,scrapy自带关闭扩展,可以在setting中设置自动关闭条件。

python3.6.4\Lib\site-packages\scrapy\extensions

CLOSESPIDER_TIMEOUT

CLOSESPIDER_ITEMCOUNT

CLOSESPIDER_PAGECOUNT

CLOSESPIDER_ERRORCOUNT

核心就这么四句

crawler.signals.connect(self.error_count, signal=signals.spider_error)

crawler.signals.connect(self.page_count, signal=signals.response_received)

crawler.signals.connect(self.spider_opened, signal=signals.spider_opened)

crawler.signals.connect(self.item_scraped, signal=signals.item_scraped)

把信号connect到方法,每次达到条件就触发相应信号,到这里调用相应函数,完成操作。

操作函数示例:

def error_count(self, failure, response, spider):

self.counter['errorcount'] += 1

if self.counter['errorcount'] == self.close_on['errorcount']:

self.crawler.engine.close_spider(spider, 'closespider_errorcount')

当然,也可以自行判断然后抛出异常,调用已有关闭方法;

在spider中:raise CloseSpider(‘bandwidth_exceeded’)

在其它组件中(middlewares, pipeline, etc):

crawler.engine.close_spider(self, ‘log message’)

5.      资源使用限制

主要是内存

MEMDEBUG_ENABLED

Default: False

Whether to enable memory debugging.

MEMDEBUG_NOTIFY

Default: []

When memory debugging is enabled a memory report will be sent to the specified addresses if this setting is not empty, otherwise the report will be written to the log.

Example:MEMDEBUG_NOTIFY = ['user@example.com']

MEMUSAGE_LIMIT_MB

Default: 0

Scope: scrapy.extensions.memusage

The maximum amount of memory to allow (in megabytes) before shutting down Scrapy (if MEMUSAGE_ENABLED is True). If zero, no check will be performed.

MEMUSAGE_CHECK_INTERVAL_SECONDS

New in version 1.1.

Default: 60.0

Scope: scrapy.extensions.memusage

MEMUSAGE_NOTIFY_MAIL

Default: False

Scope: scrapy.extensions.memusage

A list of emails to notify if the memory limit has been reached.

Example:

MEMUSAGE_NOTIFY_MAIL = ['user@example.com']

See Memory usage extension.

MEMUSAGE_WARNING_MB

Default: 0

Scope: scrapy.extensions.memusage

The maximum amount of memory to allow (in megabytes) before sending a warning email notifying about it. If zero, no warning will be produced.

6.      状态监控及控制

这个得结合一般爬虫分布爬取任务划分状态来说,

大部分一定规模的爬虫框架都是一个主爬虫+多个子爬虫,主爬虫负责爬取列表页并从列表页中获取子页地址,生成二级请求队列;子爬虫负责从二级请求队列中读取请求,完成爬取。

爬虫监控信息及作用主要包括三种:

  1. 爬虫状态:包括爬虫已运行时间,已下载网页数,已下载目标数,请求队列大小,已发生错误数;

用于判断当前爬虫进度

  1. 爬虫进程状态:

进程监控:爬虫进程挂了,需要重启;

资源监控:爬虫使用资源超标,需要重启释放;

  1. 其它爬虫异常状态异常;

主要是异常停止或被ban,需要人工干预;

总体来说,监控日志监控是比较方便的方法,把日志写入数据库或使用sockethandler,

然后另写功能模块负责完成监控,展示,处理功能,可以使爬虫主体功能简单化,另一方面可以避开多进程写日志调度这个麻烦。

7.      邮件

from scrapy.mail import MailSender

mailer = MailSender(

smtphost = "smtp.163.com",  # 发送邮件的服务器

mailfrom = "***********@163.com",   # 邮件发送者

smtpuser = "***********@163.com",   # 用户名

smtppass = "***********",  # 发送密码不是登陆密码,而是授权码!

smtpport = 25   # 端口号

)

body = u"""发送的邮件内容"""

subject = u'发送的邮件标题'

# 如果发送的内容太过简单的话,很可能会部分邮箱的反垃圾设置给禁止

mailer.send(to=["****@qq.com", "****@qq.com"], subject = subject.encode("utf-8"), body = body.encode("utf-8"))能会被当做垃圾邮件给禁止发送。

8.       性能问题

性能问题有原因有多种:

  1. 并发数太小,未充分使用CPU,网络及IO,扩大并发数就可以了;把单IP或单域名的并发数改大;
  2. 网络,磁盘io,这个只能升级或分布式;一般够得上这种问题的爬虫规模小不了,也只能分布式了;不过这样也太嚣张了,容易被反爬;
  3. CPU

在爬虫中,CPU最容易出现瓶颈的地方是解析,

纵向扩展是提高解析效率,使用更高效率的库,或条件允许直接上正则;另外scrapy在解析时是单线程的,可以考虑使用gevent;

横向扩展是多进程,在一台服务器上同时运行多个爬虫;

笔记-scrapy-辅助功能的更多相关文章

  1. 笔记-scrapy与twisted

    笔记-scrapy与twisted Scrapy使用了Twisted作为框架,Twisted有些特殊的地方是它是事件驱动的,并且比较适合异步的代码. 在任何情况下,都不要写阻塞的代码.阻塞的代码包括: ...

  2. Scrapy 初体验

    开发笔记 Scrapy 初体验 scrapy startproject project_name 创建工程 scrapy genspider -t basic spider_name website. ...

  3. Python Scrapy环境配置教程+使用Scrapy爬取李毅吧内容

    Python爬虫框架Scrapy Scrapy框架 1.Scrapy框架安装 直接通过这里安装scrapy会提示报错: error: Microsoft Visual C++ 14.0 is requ ...

  4. kindle使用参考

    转载链接:http://blog.sina.com.cn/nuanfengjia 今天买的kindle499刚刚到货了,体验略差,还有一个就是无按键,完全不会玩,只能自己慢慢摸索了. [新Kindle ...

  5. python数据类

    前言 之前有写过一篇python元类的笔记,元类主要作用就是在要创建的类中使用参数metaclass=YourMetaclass调用自定义的元类,这样就可以为所有调用了这个元类的类添加相同的属性了. ...

  6. python内置装饰器

    前言 接着上一篇笔记,我们来看看内置装饰器property.staticmethod.classmethod 一.property装饰器 1. 普通方式修改属性值 code class Celsius ...

  7. scrapy-redis debug视频

    前言 在上一篇笔记说过会录个视频帮助理解里面的类方法,现在视频来了.只录了debug scheduler.py里面的类方法,还有spiders.py里面的类方法差不多,就不说了,自己动手丰衣足食.限于 ...

  8. scrapy-redis源码浅析

    原文链接 前言 分析这个项目的源码原因是需要有去重过滤,增量爬取两个功能,而scrapy-redis项目已经帮我们实现了,想看看他是怎么实现的.这里只贴出部分主要代码,查看时请打开源码对照,笔记有点长 ...

  9. scrapy爬虫笔记(一)------环境配置

    前言: 本系列文章是对爬虫的简单介绍,以及教你如何用简单的方法爬取网站上的内容. 需要阅读者对html语言及python语言有基本的了解. (本系列文章也是我在学习爬虫过程中的学习笔记,随着学习的深入 ...

  10. Learning Scrapy笔记(六)- Scrapy处理JSON API和AJAX页面

    摘要:介绍了使用Scrapy处理JSON API和AJAX页面的方法 有时候,你会发现你要爬取的页面并不存在HTML源码,譬如,在浏览器打开http://localhost:9312/static/, ...

随机推荐

  1. 【起航计划 003】2015 起航计划 Android APIDemo的魔鬼步伐 02 SimpleAdapter,ListActivity,PackageManager参考

    01 API Demos ApiDemos 详细介绍了Android平台主要的 API,android 5.0主要包括下图几个大类,涵盖了数百api示例:

  2. html和java的交互,利用jsBridge开源框架

    html中,js注册监听和回调 function connectWebViewJavascriptBridge(callback) { if (window.WebViewJavascriptBrid ...

  3. mongdb增加字段和删除字段

    增加字段 db.xxx.update({},{"$set":{"column1":1,"column2":0}},false,true); ...

  4. 笨办法学Python(十七)

    习题 17: 更多文件操作 现在让我们再学习几种文件操作.我们将编写一个 Python 脚本,将一个文件中的内容拷贝到另外一个文件中.这个脚本很短,不过它会让你对于文件操作有更多的了解. from s ...

  5. framework7对日历的一些效果处理

    现在的要求是日历中要区分已打卡和未打卡的显示,并且当月只显示当月的日历状态,其他月份不显示状态,并且打卡的日期不能大于当日 实现代码(精确到天): HTML: <div class=" ...

  6. java对字符串进行加密和解密(以下是来自其他博主)

    背景:需要对读取数据库配置的文件进行加密,防止他人拿到数据,而对自己的代码,有要实现进行解密,网上给的加密方式,什么MD5,base64,还有等等,都太复杂,而且有些是单向的,只加密不解密,以下代码, ...

  7. NutDao配置多数据源

    首先,我必须声明,这是一个非常简单的方法,很多小菜没做出来,是因为把nutz想得太复杂 数据源(或者是数据库连接池),在Nutz.Ioc看来,是一个普通的Bean,没任何特别之处. 再强调一点,除了$ ...

  8. 2018.7.3 JS实现增删改查没有连接数据库

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  9. 今天 小小收获, 看了 sam Xiao 的好帖子 明白了 泛型委托 的 意思。

    Func<int,int,int> cAdd1 = (int x, int y) => { return x + y; }; int result= aAdd1(1,2); cons ...

  10. input的类型为number,限制输入的数字位数

    <input type="text"  maxlength="5" />   效果ok,当 <input type="number& ...