scrapy设置问题

一, 并发

    并发性是并行处理的请求数。 存在全局限制和每个域限制。Scrapy中默认的全局并发限制不适合并行爬行许多不同的域,因此您需要增加它。 增加多少将取决于您的爬虫有多少CPU可用。 一个好的起点是100,但找出最好的方法是通过做一些试验并确定Scrapy过程在哪些并发情况下使CPU受到限制。 为了获得最佳性能,您应该选择CPU使用率为80-90%的并发性。

要增加全局并发使用:

CONCURRENT_REQUESTS = 100

二, 增加Twisted IO线程池的最大大小

    目前,Scrapy以使用线程池的阻塞方式进行DNS解析。 在并发级别较高的情况下,爬网速度可能会很慢,甚至会导致DNS解析器超时失败。 增加处理DNS查询的线程数的可能解决方案。 DNS队列的处理速度将更快,加快建立连接和整体爬行。

要增加最大线程池大小,请使用:

REACTOR_THREADPOOL_MAXSIZE = 20

三, 设置你自己的DNS

    如果您有多个爬网流程和单个中央DNS,它可能会像DNS服务器上的DoS攻击一样,从而导致整个网络变慢甚至阻塞您的计算机。 为了避免这种情况,您可以使用本地缓存设置您自己的DNS服务器,并将其上传到OpenDNS或Verizon等大型DNS。

四, 降低日志等级

    在进行广泛的抓取时,您通常只对抓取的抓取率和发现的任何错误感兴趣。 Scrapy在使用INFO日志级别时报告这些统计信息。 为了节省CPU(以及日志存储需求),在预生成大量广泛爬网时,不应使用DEBUG日志级别。 在开发(广泛)爬虫程序时使用DEBUG级别可能没问题。

设置日志级别使用:

LOG_LEVEL = 'INFO'

五, 禁用cookies

    

除非你真的需要,否则禁用cookies。 进行广泛抓取时通常不需要Cookie(搜索引擎抓取工具忽略它们),它们通过节省一些CPU周期并减少Scrapy抓取工具的内存占用量来提高性能。

要禁用Cookie,请使用:

COOKIES_ENABLED = False

六, 禁用重试

    重试失败的HTTP请求可能会显着减慢抓取速度,尤其是当站点导致响应非常缓慢(或失败)时,这会导致超时错误,导致多次重试,从而不必要地阻止爬网程序的容量重用于其他域。

要禁用重试,请使用:

RETRY_ENABLED = False

七,减少下载超时

    除非您从非常慢的连接抓取(对于大量抓取,这不应该是这种情况),请减少下载超时,以便快速丢弃停滞的请求并释放处理下一个请求的容量。

要减少下载超时使用:

DOWNLOAD_TIMEOUT = 15

八, 禁止重定向

    考虑禁用重定向,除非您有兴趣follow它们。 在进行广泛抓取时,通常会保存重定向并在之后的抓取中重新访问网站以解决它们。 这也有助于保持每个爬取批次的请求数量不变,否则重定向循环可能会导致爬虫对某个特定域上的资源投入过多。

要禁用重定向,请使用:

REDIRECT_ENABLED = False

九, 启用“Ajax可抓取页面”的抓取    

  1. by using #! in URL - this is the default way;
  2. by using a special meta tag - this way is used on “main”, “index” website pages.

Scrapy handles (1) automatically; to handle (2) enable AjaxCrawlMiddleware:

AJAXCRAWL_ENABLED = True




<think>我们正在讨论如何在Scrapy设置请求头。根据用户提供的引用,有几种不同的方法可以设置请求头。下面我将总结这些方法,并给出示例代码。 ### 方法1:在单个请求中设置headers(适用于特定请求) 在`scrapy.Request`或`scrapy.FormRequest`中直接设置`headers`参数。 ```python import scrapy class MySpider(scrapy.Spider): name = 'example_spider' start_urls = ['http://example.com'] def start_requests(self): for url in self.start_urls: yield scrapy.Request( url=url, callback=self.parse, headers={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', 'Referer': 'http://example.com', # 其他自定义请求头 } ) def parse(self, response): # 解析响应 pass ``` ### 方法2:在Spider中设置默认请求头(适用于该Spider的所有请求) 在Spider类中定义`custom_settings`,设置`DEFAULT_REQUEST_HEADERS`。 ```python import scrapy class MySpider(scrapy.Spider): name = 'example_spider' start_urls = ['http://example.com'] custom_settings = { 'DEFAULT_REQUEST_HEADERS': { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'en', # 其他默认请求头 } } def parse(self, response): # 解析响应 pass ``` ### 方法3:通过中间件设置请求头(全局或随机User-Agent) 创建一个下载中间件来设置请求头。这种方法可以设置全局的请求头,或者实现随机User-Agent。 #### 步骤1:创建中间件 在`middlewares.py`文件中添加一个中间件类: ```python import random class RandomUserAgentMiddleware: def __init__(self, user_agents): self.user_agents = user_agents @classmethod def from_crawler(cls, crawler): # 从设置中获取USER_AGENT_LIST user_agents = crawler.settings.get('USER_AGENT_LIST', []) if not user_agents: # 默认提供一些User-Agent user_agents = [ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Safari/605.1.15', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.0' ] return cls(user_agents) def process_request(self, request, spider): # 随机选择一个User-Agent request.headers['User-Agent'] = random.choice(self.user_agents) # 也可以设置其他固定请求头 # request.headers['Referer'] = 'http://example.com' ``` #### 步骤2:启用中间件 在`settings.py`中启用该中间件,并可以设置`USER_AGENT_LIST`(可选): ```python DOWNLOADER_MIDDLEWARES = { 'myproject.middlewares.RandomUserAgentMiddleware': 400, # 数字代表中间件的顺序,一般400-500之间 } # 可选:自定义USER_AGENT_LIST USER_AGENT_LIST = [ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...', # 更多User-Agent ] ``` ### 注意事项: 1. **优先级**:单个请求中设置的headers优先级最高,其次是中间件,最后是`DEFAULT_REQUEST_HEADERS`。 2. **User-Agent**:为了避免被网站封禁,建议使用随机User-Agent中间件。 3. **其他请求头**:如Referer、Cookie等也可以类似设置。 ### 调试请求头 可以使用`scrapy shell`来查看请求头是否设置成功: ```bash scrapy shell 'http://example.com' >>> view(response.request) # 查看请求头 ``` ### 总结 - 对于单个请求,直接在`Request`中设置`headers`。 - 对于整个Spider,使用`custom_settings`中的`DEFAULT_REQUEST_HEADERS`。 - 对于全局且需要动态变化(如随机User-Agent),使用下载中间件。 [^1][^2][^3][^4][^5] §§相关问题§§ 1. Scrapy中如何设置动态变化的User-Agent? 2. 如何为Scrapy中的所有请求添加相同的请求头? 3. Scrapy中间件设置请求头的原理是什么? 4. 在Scrapy中如何管理多个不同的请求头? 5. Scrapy请求头设置中如何避免被目标网站反爬?</think>### Scrapy设置请求头的完整指南 在Scrapy设置请求头主要有以下几种方法,根据需求选择合适的方式: #### 方法1:在单个请求中设置(推荐) ```python import scrapy class MySpider(scrapy.Spider): name = 'header_example' def start_requests(self): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', 'Referer': 'https://example.com', 'Accept-Language': 'zh-CN,zh;q=0.9', 'X-Custom-Header': 'value' } yield scrapy.Request( url='https://example.com', callback=self.parse, headers=headers # 直接设置请求头 ) def parse(self, response): # 处理响应 ``` **特点**: - 最灵活的方式,可为不同请求设置不同请求头 - 适合需要动态设置头信息(如CSRF令牌)的场景 - 优先级最高,会覆盖其他设置[^1][^4] #### 方法2:设置默认请求头(全局生效) ```python class MySpider(scrapy.Spider): name = 'global_header' custom_settings = { 'DEFAULT_REQUEST_HEADERS': { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)', 'Accept': 'text/html,application/xhtml+xml', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'keep-alive' } } def parse(self, response): # 所有请求都会自动使用这些请求头 ``` **特点**: - 影响该爬虫的所有请求 - 在`settings.py`中设置会全局生效 - 优先级低于单个请求的设置[^3] #### 方法3:使用中间件设置随机User-Agent(防封禁推荐) 1. 创建中间件文件`middlewares.py`: ```python import random class RandomUserAgentMiddleware: USER_AGENTS = [ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Safari/605.1.15', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.0' ] def process_request(self, request, spider): request.headers['User-Agent'] = random.choice(self.USER_AGENTS) ``` 2. 在`settings.py`中启用中间件: ```python DOWNLOADER_MIDDLEWARES = { 'myproject.middlewares.RandomUserAgentMiddleware': 400, } ``` **特点**: - 自动为每个请求设置随机User-Agent - 有效避免因固定User-Agent被封禁 - 可扩展为设置其他动态头信息[^5] #### 方法4:通过Scrapy项目设置 在`settings.py`中全局设置: ```python DEFAULT_REQUEST_HEADERS = { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'en', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } ``` #### 最佳实践建议: 1. **优先使用随机User-Agent中间件**,防止被目标网站封禁[^2][^5] 2. **敏感头信息通过环境变量管理**: ```python import os headers = {'Authorization': f'Bearer {os.getenv("API_TOKEN")}'} ``` 3. **动态设置CSRF令牌**: ```python def parse(self, response): token = response.css('meta[name="csrf-token"]::attr(content)').get() yield FormRequest(..., headers={'X-CSRF-Token': token}) ``` 4. **调试技巧**: ```bash scrapy shell --nolog 'https://example.com' >>> req = scrapy.Request(url, headers={...}) >>> fetch(req) # 查看实际发送的请求头 ``` [^1][^2][^3][^4][^5]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值