103

scrapy通用爬虫及反爬技巧

 6 years ago
source link: http://mp.weixin.qq.com/s/ig1m-5plTN6uQ8hhbJ9g8A
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

scrapy通用爬虫及反爬技巧

大邓 大邓和他的Python 2017-12-30 01:38 Posted on

一、通用爬虫

通用爬虫一般有以下通用特性:

  • 爬取大量(一般来说是无限)的网站而不是特定的一些网站。

  • 不会将整个网站都爬取完毕,因为这十分不实际(或者说是不可能)完成的。相反,其会限制爬取的时间及数量。

  • 在逻辑上十分简单(相较于具有很多提取规则的复杂的spider),数据会在另外的阶段进行后处理(post-processed)

  • 并行爬取大量网站以避免被某个网站的限制所限制爬取的速度(为表示尊重,每个站点爬取速度很慢但同时爬取很多站点)。

Scrapy默认设置是对特定爬虫做了优化,而不是通用爬虫。不过, 鉴于scrapy使用了异步架构,其对通用爬虫也十分适用。 

本篇文章总结了一些将Scrapy作为通用爬虫所需要的技巧, 以及相应针对通用爬虫的Scrapy设定的一些建议。

1.1 增加并发

并发是指同时处理的request的数量。其有全局限制和局部(每个网站)的限制。

Scrapy并发增加的程度取决于您的爬虫能占用多少CPU。 一般开始可以设置为 100 。不过最好的方式是做一些测试,获得Scrapy进程占取CPU与并发数的关系。 为了优化性能,您应该选择一个能使CPU占用率在80%-90%的并发数。

增加全局并发数:

CONCURRENT_REQUESTS = 100

1.2 降低log级别

当进行通用爬取时,一般您所注意的仅仅是爬取的速率以及遇到的错误。 Scrapy使用 INFO log级别来报告这些信息。为了减少CPU使用率(及记录log存储的要求), 在进行通用爬取时应该使用 INFO log级别。 不过在开发的时候使用 DEBUG 应该还能接受。

设置Log级别:

LOG_LEVEL = 'INFO'

1.3 禁止cookies

除非您 真的 需要,否则请禁止cookies。在进行通用爬取时cookies并不需要, (搜索引擎则忽略cookies)。禁止cookies能减少CPU使用率及Scrapy爬虫在内存中记录的踪迹,提高性能。

禁止cookies:

COOKIES_ENABLED = False

1.4 禁止重试

对失败的HTTP请求进行重试会减慢爬取的效率,尤其是当站点响应很慢(甚至失败)时, 访问这样的站点会造成超时并重试多次。这是不必要的,同时也占用了爬虫爬取其他站点的能力。

禁止重试:

RETRY_ENABLED = False

1.5 减小下载超时

如果您对一个非常慢的连接进行爬取(一般对通用爬虫来说并不重要), 减小下载超时能让卡住的连接能被快速的放弃并解放处理其他站点的能力。

减小下载超时:

DOWNLOAD_TIMEOUT = 15

1.6 禁止重定向

除非您对跟进重定向感兴趣,否则请考虑关闭重定向。 当进行通用爬取时,一般的做法是保存重定向的地址,并在之后的爬取进行解析。 这保证了每批爬取的request数目在一定的数量, 否则重定向循环可能会导致爬虫在某个站点耗费过多资源。

关闭重定向:

REDIRECT_ENABLED = False

二、scrapy反爬技巧

有些网站实现了特定的机制,以一定规则来避免被爬虫爬取。 与这些规则打交道并不容易,需要技巧,有时候也需要些特别的基础。 如果有疑问请考虑联系 商业支持。

下面是些处理这些站点的建议(tips):

  • 使用user-agent池,轮流或随机选择来作为user-agent。

  • 禁止cookies(参考 COOKIES_ENABLED),有些站点会使用cookies来发现爬虫的轨迹。

  • 设置下载延迟(2或更高)。参考 DOWNLOAD_DELAY 设置。

  • 如果可行,使用 Google cache 来爬取数据,而不是直接访问站点。

  • 使用IP池。例如免费的 Tor项目 或付费服务(ProxyMesh)。

  • 使用高度分布式的下载器(downloader)来绕过禁止(ban),您就只需要专注分析处理页面。这样的例子有: Crawlera

三、自动限速扩展

该扩展能根据Scrapy服务器及您爬取的网站的负载自动限制爬取速度。

3.1 设计目标

  • 更友好的对待网站,而不使用默认的下载延迟0。

  • 自动调整scrapy来优化下载速度,使得用户不用调节下载延迟及并发请求数来找到优化的值。 用户只需指定允许的最大并发请求数,剩下的都交给扩展来完成。

3.2 扩展是如何实现的

在Scrapy中,下载延迟是通过计算建立TCP连接到接收到HTTP包头(header)之间的时间来测量的。

注意,由于Scrapy可能在忙着处理spider的回调函数或者无法下载,因此在合作的多任务环境下准确测量这些延迟是十分苦难的。 不过,这些延迟仍然是对Scrapy(甚至是服务器)繁忙程度的合理测量,而这扩展就是以此为前提进行编写的。

3.3 限速算法

算法根据以下规则调整下载延迟及并发数:

spider永远以1个并发请求数及 AUTOTHROTTLESTARTDELAY 中指定的下载延迟启动。 当接收到响应时,下载延迟会调整到该响应延迟与之前下载延迟之间的平均值。

AutoThrottle扩展尊重标准Scrapy设置中的并发数及延迟。这意味着其永远不会设置一个比 DOWNLOADDELAY 更低的下载延迟或者比 CONCURRENTREQUESTSPERDOMAIN 更高的并发数 (或 CONCURRENTREQUESTSPER_IP ,取决于您使用哪一个)。

3.4 自动限速扩展参数

下面是控制AutoThrottle扩展的设置:

AUTOTHROTTLE_ENABLED 默认False
AUTOTHROTTLE_START_DELAY 默认5.0
AUTOTHROTTLE_MAX_DELAY 默认60
AUTOTHROTTLE_DEBUG 默认False
CONCURRENT_REQUESTS_PER_DOMAIN
CONCURRENT_REQUESTS_PER_IP
DOWNLOAD_DELAY

【视频教程】用python批量抓取简书用户信息

【视频讲解】Scrapy递归抓取简书用户信息

【视频讲解】在scrapy框架中如何使用selenium?

【实战视频】使用scrapy写爬虫-爬知乎live

美团商家信息采集神器

使用gevent实现高效异步请求

selenium驱动器配置详解

爬虫神器PyQuery的使用方法

pyquery爬取豆瓣读书

pyquery一些自定义的用法

【视频】猫途鹰网站评论数据抓取

简易SQLite3数据库学习

【视频教程】对视频进行基本操作

【视频】抓包小练习-B站评论数据抓取

【视频】爬取饿了么平台上的门店信息

如何抓取视频资源-以头条视频为例

当爬虫遭遇验证码,怎么办

【视频】手把手教你抓美女~

【视频】有了selenium,小白也可以自豪的说:“去TMD的抓包、cookie”

北邮人论坛爬虫实操:session代替cookies

【视频】快来get新技能--抓包+cookie,爬微博不再是梦

文本处理分析

gensim:用Word2Vec进行文本分析

RAKE:快速自动抽取关键词算法

对于中文,nltk能做哪些事情

如何对csv文件中的文本数据进行分析处理

复杂网络分析数据准备篇

文本分析之网络关系

用词云图解读“于欢案”

基于共现发现人物关系的python实现

用pyecharts制作词云图

图片数据处理

OpenCV:快速入门图片人脸识别

好玩的OpenCV:图片操作的基本知识(1)

好玩的OpenCV:图像操作的基本知识(2)

OpenCV:计算图片有多色

如何对数据进行各种排序?

迅雷不给力,我DIY了个下载器

【视频】初学者必看:python环境配置

开扒皮自己微信的秘密

初识装饰器函数

计算运行时间-装饰器实现

花十分钟,给爱机安装个MongoDB

chardet库:轻松识别文件的编码格式

使用Python登录QQ邮箱发送QQ邮件

WTF Python: 开启你的懵逼模式

8行代码实现微信聊天机器人

使用Python+OpenCV进行面部合成

优雅简洁的列表推导式

【资源帖】简单易懂的机器学习视频教程

Image

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK