文章目录
前言
Scrapy框架中的settings.py文件是用于配置爬取相关设置的文件,通过修改该文件可以自定义爬虫的行为。以下是settings.py文件中一些常见参数的详细说明以及使用方法,并附带相关案例。
一、全局变量设置
1、
BOT_NAME
:Scrapy项目的名称,用于构造默认的User-Agent,同时也用于日志记录。
- 说明:当使用startproject命令创建项目时,BOT_NAME会被自动赋值。
- 示例:BOT_NAME = ‘my_spider’
2、
USER_AGENT
:定义Scrapy下载器在发送HTTP请求时使用的User-Agent。
- 说明:User-Agent是一个HTTP头部字段,用于标识发出请求的客户端的类型和版本信息,如操作系统、浏览器等。服务器可以根据User-Agent来决定返回什么样的内容或进行什么样的处理。
- 示例:USER_AGENT = ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3’
3、
SPIDER_MODULES
:包含项目中所有spider的模块列表。
- 示例:SPIDER_MODULES = [‘my_project.spiders’]。
4、
NEWSPIDER_MODULE
:当使用scrapy genspider命令创建新spider时,spider将会放在这个模块下。
- 示例:NEWSPIDER_MODULE = ‘my_project.spiders’。
5、
TELNETCONSOLE_ENABLED
:是否启用Telnet控制台,用于查看当前爬虫的信息和操作爬虫。
- 示例:TELNETCONSOLE_ENABLED = True。还可以配置TELNETCONSOLE_HOST和TELNETCONSOLE_PORT来指定Telnet控制台的主机和端口。
二、爬取行为设置
1、
ROBOTSTXT_OBEY
:是否遵循robots.txt规则。
- 说明:robots.txt是一个网站的根目录下的文本文件,用于告诉爬虫哪些页面可以爬取,哪些页面不可以爬取。如果设置为True,Scrapy会尊重robots.txt规则;如果设置为False,Scrapy将不会考虑robots.txt规则。
- 示例:ROBOTSTXT_OBEY = False
2、
DOWNLOAD_DELAY
:定义两个连续请求之间的延迟时间,以控制爬取速度。
- 说明:单位是秒,可以设置为1或更大的值,用于控制爬取速度,减轻服务器压力。
- 示例:DOWNLOAD_DELAY = 3
3、
CONCURRENT_REQUESTS
:下载器总共最大处理的并发请求数。默认值通常为16,但可以根据需要进行调整。
- 说明:通过并发发送请求可以提高爬取效率。
- 示例:CONCURRENT_REQUESTS = 10
4、
CONCURRENT_REQUESTS_PER_DOMAIN
:每个域名能够被执行的最大并发请求数目,默认值通常为8。
- 示例:CONCURRENT_REQUESTS_PER_DOMAIN = 16。
5、
CONCURRENT_REQUESTS_PER_IP
:能够被单个IP处理的并发请求数。
- 说明:默认值通常为0,代表无限制。如果不为零,则
CONCURRENT_REQUESTS_PER_DOMAIN
将被忽略,并发数的限制将按照每个IP来计算。此外,该设置也影响DOWNLOAD_DELAY
,如果该值不为零,那么DOWNLOAD_DELAY
下载延迟是限制每个IP而不是每个域。 - 示例:CONCURRENT_REQUESTS_PER_IP = 16。
6、
DEPTH_LIMIT
:允许为任何站点爬行的最大深度。
- 说明:如果为0,则无深度限制。
- 示例:DEPTH_LIMIT = 3
7、
DEPTH_PRIORITY
和 SCHEDULER(调度器) 相关设置:用于控制爬取时的深度优先或广度优先策略。
- 示例:深度优先时,可以设置DEPTH_PRIORITY = 0,并配置相应的调度器队列。
8、
DUPEFILTER_CLASS
:用于访问URL去重的类。可以自定义一个类来实现更复杂的去重逻辑。
三、中间件和扩展使用
1、
DOWNLOADER_MIDDLEWARES
:定义启用的下载器中间件及其顺序。
- 说明:下载器中间件位于Scrapy的请求/响应处理的中心位置,可以在Scrapy发送请求到网站服务器之前或从服务器接收到响应之后执行自定义的代码。数字越小,中间件越早执行。
- 示例:
DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 400,
'my_project.middlewares.ProxyMiddleware': 410,
}
2、
SPIDER_MIDDLEWARES
:定义启用的爬虫中间件及其顺序。
- 说明:爬虫中间件可以对爬虫的输入和输出进行处理。数字越小,中间件越早执行。
- 示例:
SPIDER_MIDDLEWARES = {
'myproject.middlewares.MySpiderMiddleware': 543,
}
3、
EXTENSIONS
:启用和配置自定义的扩展。
- 说明:Scrapy框架允许开发者编写自定义的扩展来增强爬虫的功能。
- 示例:
EXTENSIONS = {
'myextension.MyExtension': 500,
}
四、数据处理设置
ITEM_PIPELINES
:定义数据处理管道的设置。
- 说明:通过设置数字来指定管道的优先级,数字越小,优先级越高。
- 示例:
ITEM_PIPELINES = {
'myproject.pipelines.MyPipeline': 300,
}
五、日志输出和异常处理设置
1、
LOG_LEVEL
:设置日志的最低级别。
- 说明:可选的级别有CRITICAL、ERROR、WARNING、INFO、DEBUG。
- 示例:LOG_LEVEL = ‘INFO’
2、
LOG_FORMAT
:设置日志的数据格式。
- 示例:LOG_FORMAT = ‘%(asctime)s [%(name)s] %(levelname)s: %(message)s’。
3、
LOG_DATEFORMAT
:设置日志的日期格式。
- 示例:LOG_DATEFORMAT = ‘%Y-%m-%d %H:%M:%S’。
4、
FEED_EXPORT_ENCODING
:设置导出时文件的编码。
- 示例:FEED_EXPORT_ENCODING = ‘utf-8’。
5、
RETRY_TIMES 和 RETRY_HTTP_CODES
:控制自动重试的次数和HTTP响应状态码。
- 说明:当请求失败时,可以根据这些设置进行重试。
- 示例:
RETRY_TIMES = 3
RETRY_HTTP_CODES = [500, 502]
六、智能限速/自动节流(AutoThrottle extension)
1、
AUTOTHROTTLE_ENABLED
:是否启用AutoThrottle扩展,用于自动调整Scrapy到最佳的爬取速度。
- 示例:AUTOTHROTTLE_ENABLED = True。
2、
AUTOTHROTTLE_START_DELAY
:起始的延迟。
- 示例:AUTOTHROTTLE_START_DELAY = 5。
3、
DOWNLOAD_DELAY
(在AutoThrottle中):最小延迟。
- 说明:在启用AutoThrottle时,这个值将作为下载延迟的起始值。
- 示例:DOWNLOAD_DELAY = 3 ;注意,这与上面的DOWNLOAD_DELAY含义不同,在AutoThrottle上下文中,它仅作为最小延迟)。
4、
AUTOTHROTTLE_MAX_DELAY
:最大延迟。
- 示例:AUTOTHROTTLE_MAX_DELAY = 10。
5、
AUTOTHROTTLE_TARGET_CONCURRENCY
:每秒并发请求数的平均值。
- 说明:这个值不能高于
CONCURRENT_REQUESTS_PER_DOMAIN
或CONCURRENT_REQUESTS_PER_IP
。 - 示例:AUTOTHROTTLE_TARGET_CONCURRENCY = 16
6、
AUTOTHROTTLE_DEBUG
:是否启用AutoThrottle的调试模式。
- 示例:AUTOTHROTTLE_DEBUG = True。
七、其它设置
1、
COOKIES_ENABLED
:是否启用cookies中间件。
- 说明:如果关闭,请求将不携带cookies。
- 示例:COOKIES_ENABLED = False
2、
DEFAULT_REQUEST_HEADERS
:设置默认的请求头信息。
- 说明:一些网站可能需要特定的请求头进行访问。
- 示例:
DEFAULT_REQUEST_HEADERS = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
}
3、
USER_AGENT_POOL
:设置User-Agent池。
- 说明:让每个请求随机选择一个User-Agent进行发送,以避免被目标网站封禁。
- 示例:USER_AGENT_POOL = […](包含多个User-Agent字符串的列表)。
4、缓存相关配置:
HTTPCACHE_ENABLED
:是否启用缓存。
HTTPCACHE_EXPIRATION_SECS
:设置缓存过期时间。
HTTPCACHE_DIR
:设置缓存存储路径。
HTTPCACHE_STORAGE
:设置缓存存储方式。
- 示例:
HTTPCACHE_ENABLED = True。
HTTPCACHE_EXPIRATION_SECS = 0(表示永不过期)。
HTTPCACHE_DIR = 'httpcache'。
HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'。
八、使用示例
示例1:使用代理IP进行网络爬取
1、在settings.py中添加如下配置项:
PROXY_LIST = [
'http://123.45.67.89:8080',
'http://123.45.67.90:8080',
]
DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 400,
'my_project.middlewares.ProxyMiddleware': 410,
}
2、在项目目录下创建一个新的Python脚本middlewares.py,定义ProxyMiddleware类:
import random
class ProxyMiddleware(object):
def __init__(self, proxy_list):
self.proxies = proxy_list
@classmethod
def from_crawler(cls, crawler):
return cls(
proxy_list=crawler.settings.getlist('PROXY_LIST')
)
def process_request(self, request, spider):
proxy = random.choice(self.proxies)
request.meta['proxy'] = proxy
print('Use proxy: ', proxy)
3、在爬虫启动前指定运行命令时使用的设置文件和代理池地址,例如:
scrapy crawl my_spider -s PROXY_LIST='proxy_list.txt'
其中proxy_list.txt文件包含了代理服务器地址,每一行一个,例如:
http://123.45.67.89:8080
http://123.45.67.90:8080
这样,在进行网络请求时就可以自动使用随机的代理地址发送请求,提高爬虫数据抓取的效率和可靠性。
示例2:随机选择User-Agent或代理
在Spider中,可以通过get_project_settings()方法获取settings.py文件中的配置参数,并根据需要进行使用。例如,在start_requests方法中,可以随机选择一个User-Agent或代理进行请求发送。
from scrapy import Spider
from scrapy.utils.project import get_project_settings
import random
class MySpider(Spider):
name = 'my_spider'
def __init__(self, name=None, **kwargs):
self.settings = get_project_settings()
def start_requests(self):
url = 'http://example.com'
# 随机选择一个User-Agent
user_agent = random.choice(self.settings.get('USER_AGENT_POOL'))
# 或者随机选择一个代理
# proxy = random.choice(self.settings.get('PROXY_POOL'))
yield scrapy.Request(url, headers={'User-Agent': user_agent})
# 如果使用代理,则需要在meta中设置'proxy'
# yield scrapy.Request(url, meta={'proxy': proxy})
综上所述,settings.py文件是Scrapy框架中非常重要的配置文件,通过灵活配置其中的参数,可以自定义爬虫的行为,优化爬虫的性能,并避免被目标网站封禁。
注意:
以上参数和案例仅涵盖了Scrapy框架中settings.py文件的一部分内容。在实际应用中,可能还需要根据具体需求进行更详细的配置和调整。建议参考Scrapy的官方文档以获取更全面和准确的信息。
Scrapy文档地址
:http://scrapy-chs.readthedocs.io/zh_CN/1.0/intro/overview.html
想学习爬虫技术请关注专栏:爬虫系统教学
带你从零开始学习爬虫,轻松抓取各大网站!!!