Python,爬虫与深度学习(11)——scrapy中settings的可选项
步骤/目录:
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。