步骤/目录:
1.settings的指定方法
2.setting中的常用设置与默认值
    (1)爬虫效率相关
    (2)字典类设置
    (3)log相关
    (4)其他的重要设置
    (5)其他的不重要设置

本文首发于个人博客https://lisper517.top/index.php/archives/49/,转载请注明出处。
本文的目的是介绍scrapy的settings的可选项及使用方法。
本文写作日期为2022年9月14日,主要参考了 scrapy官方文档

爬虫写的好,牢房进的早。使用爬虫时不要占用服务器太多流量,否则可能惹祸上身。

笔者的能力有限,也并非CS从业人员,很多地方难免有纰漏或者不符合代码原则的地方,请在评论中指出。

1.settings的指定方法

一共有5种指定settings的方法:
(1)爬虫单独指定,就是在爬虫类下面用 custom_settings 数据成员指定,如:

class MySpider(scrapy.Spider):
    name = 'myspider'

    custom_settings = {
        'CONCURRENT_REQUESTS': 1,
        'DOWNLOAD_DELAY': 10,
        'CONCURRENT_REQUESTS_PER_DOMAIN': 1
    }

这种方法适合有多个爬虫、多个网站,但有些网站需要调整设置的时候,比较常用。
(2)命令行指定,即 scrapy crawl myspider -s LOG_FILE=scrapy.log 这样的格式,缺点是能指定的项比较少,只能用来覆盖部分settings.py里的设置。

另外的三种方法比较进阶,这里就不介绍了。

最后,在爬虫类里,可以通过 self.settings 调出爬虫的设置。

2.setting中的常用设置与默认值

这里提到的settings可选项只是很少一部分,其他的要不就是更加进阶,要不就是一般不会用到。

(1)爬虫效率相关

CONCURRENT_ITEMS=100 ,设置每个响应拿到后有多少个item pipeline同时运行。由于爬虫的瓶颈一般在网络,这个设置没有太大用处。
CONCURRENT_REQUESTS=16 ,下载器最多能同时发送多少个请求。对于一些封ip的网站,需要用这个设置。
CONCURRENT_REQUESTS_PER_DOMAIN=8 ,对一个域名最多发送多少请求。对于一些封ip的网站,可以用这个设置。
CONCURRENT_REQUESTS_PER_IP=0 ,对一个ip最多发送多少请求。如果设置了这个,则 CONCURRENT_REQUESTS_PER_DOMAIN 会失效。
DOWNLOAD_DELAY=0 ,用于设置从同一网站爬取连续页面时的等待时间,单位为秒(可以用浮点数)。对于一些封ip的网站,需要用这个设置。这个等待时间不是定死的,实际的时间会在0.5倍~1.5倍 DOWNLOAD_DELAY 之间浮动(若不想浮动,用 RANDOMIZE_DOWNLOAD_DELAY=False 来指定,但一般不要这样做,因为有些网站通过分析请求间隔来判别爬虫)。除了在爬虫类中用 custom_settings 指定、在 settings.py 里指定,还可以通过爬虫的 download_delay 属性来指定。

总结一下,如果有些网站会封访问频繁的ip,可以在爬虫类里使用:

    custom_settings = {
        'CONCURRENT_REQUESTS': 1,
        'DOWNLOAD_DELAY': 10,
        'CONCURRENT_REQUESTS_PER_DOMAIN': 1
    }

这样的设置来限制访问频率。

(2)字典类设置

这些设置一般都是指定中间件等类,和它们的优先级(或者顺序),一般越小优先级越高。
DOWNLOADER_MIDDLEWARES ,用于设置下载中间件及其优先级。
EXTENSIONS ,类似 DOWNLOADER_MIDDLEWARES ,用于指定扩展及其优先级。
ITEM_PIPELINES ,用于指定item pipelines及其优先级。

(3)log相关

scrapy使用的是python自带的logging模块,所以有些设置需要参考logging。
LOG_ENABLED=True ,是否允许记录log。
LOG_ENCODING='utf-8' ,log的字符集。
LOG_FILE=None ,logging输出的文件名。为None时,使用standard error。
LOG_FILE_APPEND=True ,如果为False,每次运行时会覆盖 LOG_FILE 指定的log文件。
LOG_FORMAT='%(asctime)s [%(name)s] %(levelname)s: %(message)s' ,指定每条log的格式。想自己设置格式请参考logging模块的格式说明。
LOG_DATEFORMAT='%Y-%m-%d %H:%M:%S' ,用于指定 LOG_FORMAT 设置中 %(asctime)s 的输出格式。
LOG_LEVEL='DEBUG' ,设置log显示的最低级别。从高到低为CRITICAL, ERROR, WARNING, INFO, DEBUG。
LOG_STDOUT=False ,如果为True,会将所有输出重定向到log,比如python的print函数。

(4)其他的重要设置

DEFAULT_REQUEST_HEADERS 设置请求头,默认为:

{
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'en',
}

这里可以设置一些固定的项。如果想设置user-agent,一般在middlrewares.py的下载中间件里设置;这里不能设置cookies,而应该在下载中间件的子类CookiesMiddleware中对 request.cookies 赋值来进行设置,例子可参考 这篇文章
ROBOTSTXT_OBEY=True ,如果为False,则scrapy不会遵守网站的robots.txt文件(这个文件是网站发出的声明,用于指导爬虫的行为,但只是声明、没有实际约束作用)。
TEMPLATES_DIR ,用于指定startproject时的项目模板、genspider时的爬虫模板。这个文件夹默认是scrapy库路径下的templates目录。
USER_AGENT="Scrapy/VERSION (+https://scrapy.org)" ,settings.py里设置UA的地方。但一般都是在下载中间件里设置,那里的设置会覆盖掉settings.py里的UA设置。

(5)其他的不重要设置

DEPTH_LIMIT=0 ,爬取网页的深度,0表示无限制。
DEPTH_PRIORITY=0 ,用于调整不同深度的请求的优先级。优先级的算法为 request.priority = request.priority - ( depth * DEPTH_PRIORITY ) ,也就是 DEPTH_PRIORITY 为正时越深的请求优先级越低(广度优先遍历,BFO),负时相反(深度优先遍历,DFO)。scrapy默认是DFO,这在大多数情况下效率更高,如果你实在需要改成BFO,可以在settings.py中如下设置:

DEPTH_PRIORITY = 1
SCHEDULER_DISK_QUEUE = 'scrapy.squeues.PickleFifoDiskQueue'
SCHEDULER_MEMORY_QUEUE = 'scrapy.squeues.FifoMemoryQueue'

DOWNLOAD_TIMEOUT=180 ,下载器的超时时间,单位为秒。还可以通过爬虫的 download_timeout 属性,和请求的 download_timeout 属性来指定。
DOWNLOAD_MAXSIZE=1073741824 ,下载器最多下载的响应大小,单位为Byte,默认的大小为1024MB。同样,还能通过爬虫的 download_maxsize 或请求的 download_maxsize 属性指定。
DOWNLOAD_WARNSIZE=33554432 ,当响应大小达到这个值后下载器会发出警告,默认值为32MB。爬虫、请求的 download_warnsize 属性也可以设置。
JOBDIR='' ,指定一个路径,该路径用于保存爬虫状态。与爬虫的暂停、继续有关。
REDIRECT_PRIORITY_ADJUST=+2 ,如果请求被重定向,这个选项用来设置重定向后的请求与原来请求的优先级关系,正表示重定向请求的优先级更高。
URLLENGTH_LIMIT=2083 ,爬取的URL最大长度。这个是在发出请求的时候过滤url用的,因为有时网页服务器或者你自己的scrapy项目代码错误,会出现很长的url。如果想去掉这个限制,把它设置为0。

标签: python, scrapy

添加新评论