Python中Scrapy框架的性能问题如何优化?

爬取同 1 目标站

看起来是加载了 CF

法国的 OL 服务器 CZ2750 8G 128G SSD 可以跑到 100M 1W P/S 美国的渣渣服务器 AMD 1853 8G 5TB HDD 只能跑到 6M 500 P/S

到底是什么原因


Python中Scrapy框架的性能问题如何优化?
20 回复

规则什么都一样的。

看 ping 的时间也差不多。


对于Scrapy的性能优化,核心在于调整并发参数和合理利用中间件。我通常从这几个方面入手:

  1. 调整并发设置(在settings.py中):
CONCURRENT_REQUESTS = 32  # 默认16,根据机器性能调整
CONCURRENT_REQUESTS_PER_DOMAIN = 8  # 每个域名的并发数
DOWNLOAD_DELAY = 0.25  # 下载延迟,避免被封
  1. 启用缓存减少重复请求:
HTTPCACHE_ENABLED = True
HTTPCACHE_EXPIRATION_SECS = 0  # 永久缓存
  1. 调整下载器中间件,比如用随机User-Agent:
class RandomUserAgentMiddleware:
    def process_request(self, request, spider):
        request.headers['User-Agent'] = random.choice(user_agent_list)
  1. 使用合适的调度器,比如scrapy-redis做分布式爬取。

  2. 监控和日志要精简,避免I/O成为瓶颈。

关键是根据实际场景测试调整,没有一套参数适合所有情况。

两台都是独服

美国这台 CPU 始终只能跑到 2%左右
而法国这台 CPU 可以跑到 40%左右

我给美国开的线程数远远大于法国

法国的系统是 Centos7

美国的系统是 Centos6.9

Python 系统都是 3.61

我是哪里配置的问题么?

两边都是 1G 带宽。

而且带宽质量都还不错。

我现在排查问题 认为唯一的可能性就是 Centos 6.9 是不是有什么并发限制。

否则差距也太大了。 即便 CPU 内存 硬盘的性能上有差距

但是 CPU 怎么都应该跑起来吧。

线程数少一点试一试?

默认我是从法国那台机器复制过来的配置文件就是 32 线程。 结果不理想我才加倍到 64 线程的。

15 packets transmitted, 15 received, 0% packet loss, time 14335ms
rtt min/avg/max/mdev = 8.771/8.809/8.910/0.058 ms

9 packets transmitted, 9 received, 0% packet loss, time 8009ms
rtt min/avg/max/mdev = 0.980/1.047/1.122/0.047 ms

一个是 8ms
一个是 1ms

我觉得网络速度不是问题。

有没有大佬来给带带路呀

换成 centos 7 试试看

那台美国的做不成 CENTOS7

测一下两台机器的 io

IO 没问题。 奇怪了。 我在 LA 的独服开了一台 VPS。

竟然也只有 4MS

真是奇怪了。 是不是因为法国的是源服务器? 所以速度就比较快?

相同配置、目标站,出现这种问题应该不是 scrapy 的问题
服务器限速?
目标站对不同区域 IP 限速?

反复尝试。单一进程抓取速度只有 4mbps 好奇怪。

目标站是挂在 CF 的 CDN 上的。 对不同 IP 限速。 真的可能么?

有没有牛人给分析一下什么问题?

找到原因了。。。 还真是 CPU 的原因。
我的 LA 那台 VPS 开启 8 个 CPU 就可以跑到 100M 了。。

真是见鬼了。。

难道是 AMD 的 CPU 调度太差了?

NFS 挂载以后 只能跑到 7mbps。

与本地磁盘可以跑满 100M 简直差距巨大

回到顶部