Python 爬虫并发极限是多少呢?

2020-03-14 04:24:44 +08:00
 Cy86

模块介绍: 爬取网上很多公开的代理 IP 网址, HTTP HTTPS Sock5 , 去重后, 访问自己域名(返回 Json, 小于 300 字节), 用来测试匿名程度后保存

  不使用代理,仅本地网络测试
  设备:  联通光纤宽带(我一个人用) 下行 300M 上行 30    CPU: I7 7700HQ 4 核 8 逻辑处理器 内存: 16G 
  国内的服务器: 阿里云  1 核 2 内  1M

  单进程 + 异步: 
      URL 500 个
      asyncio.Semaphore(500)   
      aiohttp 设置超时时间为 1 秒

  结果: 并发 500 的成功率为 97%左右(偶尔抽风)
      每秒并发个数: 485

  多进程 + 异步:
      URL 500 个
      5 个进程 (每个进程平均 100 个 URL)
      asyncio.Semaphore(100)   
      aiohttp 设置超时时间为 1 秒

  结果:并发 500 的成功率为 99%左右(偶尔抽风)
      每秒并发个数: 495

  多进程 + 异步:
      URL 1600 个
      8 个进程 (每个进程平均 200 个 URL)
      asyncio.Semaphore(200)   
      aiohttp 设置超时时间为 1 秒

  结果:并发 1600 的成功率为 4% ~ 75%左右(大概率低于 30%)
      每秒并发个数: 64 ~ 1200

当前遇到的问题: 超过 500 并发后极其不稳定

  目前猜测之所以 500 是临界点, 可能联通限制连接数 1000 导致 或是  Windows 平台 select 限制

当前策略每三秒对所有 代理 IP 访问自己服务器进行测试 测试代理 IP 超时时间为 3 秒 通过超时次数,和响应时间(使用) 对每个 IP 分配权重来筛选,排序, 所以要很大程度上减少自身网络或程序的错误, 才尽可能保证代理 IP 的准确性于可用性, 毕竟能用的 IP 太少, 误封就太可惜了

  电脑性能和上行带宽没跑满, 多加几个服务器太浪费了

请问各位, 有什么方式能提高并发量, 或容错(误封可用 IP)的策略呢,

3448 次点击
所在节点    Python
35 条回复
lithbitren
2020-03-16 20:49:34 +08:00
@black11black 没懂,grequests 用的 gevent 应该和之后的官方协程算另一套体系吧。。
lithbitren
2020-03-16 20:55:53 +08:00
@black11black grequests 的问题应该是解析数据占用了线程资源导致的效率瓶颈吧
black11black
2020-03-17 00:11:22 +08:00
@lithbitren 我一直不支持用猴子补丁,我不知道 grequests 的具体实现方式。但是你应该知道多线程是多线程,IO 复用是 IO 复用,你用线程的思考方式考虑 IO 复用是风马牛不相及的两码事。windows 下线程切换的默认时间片是十毫秒还是多少记不住了,linux 应该是几十微秒,基于线程模型理所当然是浪费大部分 IO 性能的,无所谓什么解析数据占用线程资源,就像 select 有监控上限,他不是 py 的并发极限,只是单纯你用了错误的方式而已
lithbitren
2020-03-17 01:17:10 +08:00
@black11black 不是,不推荐归不推荐,grequests 就是单纯的 gevent+request 的封装,并发爬虫几行写完了就是图个方便,协程是原理,但用 grequests 根本不需要懂协程,而且印象中是 3.5 之前就有了。单独 request 发送回收数据是需要解析时间解析的,从数据返回到数据解析成 request 对象也是需要时间的,是需要占用 GIL 资源的,切协程这个时间在解析数据这里是可以忽略不计的,但最后接收数据的时候阻塞的,如果任意一个请求的响应变慢或超时,整体的统计时间也会大幅增加。
我这里 win10 开线程的应该是不到 1ms 左右,协程应该也是几十微妙。
grequests 的核心代码就是一行 grequests.map(request_list),计时函数只能放在这行代码的前后,实质统计到的是所有请求完整生命周期的时间。
lithbitren
2020-03-17 01:34:29 +08:00
@black11black 不过我之前说的确实也不对,grequests 的发送时间统计里包括了所有 request 对象的构建,request 发送接受,对返回内容解析几个过程,并不算是实质从第一个对象发出到最后一个对象发出的时间。
chengxiao
7 天前
爬虫的极限是 代理池和账户号,其他都是浮云
Cy86
7 天前
@chengxiao #26 日常监控 30 万个网站的更新, 每 5 分钟跑一次, 不需要账号和风控, 单站点请求一分钟一次都没有
chengxiao
7 天前
@Cy86 #27 舆情?蜜度?
macaodoll
7 天前
并发够用就行,别一味想着把你服务器性能全部打满,这样就离进去不远了。
bug123
7 天前
我对付那种并发高的爬虫也简单,不封禁,只是偶尔返回政治敏感数据
shanyaoxingtong
7 天前
代理池不够用多高的并发也没用啊,全被风控掉了
seedai
5 天前
@chizuo 老哥,能利用爬虫做流量吗
Cy86
2 天前
@chengxiao #28 每错是舆情
Cy86
2 天前
@shanyaoxingtong #31 后面接了 5 家的代理池, 每天的总请求 13 亿, qps 能达到 15K, 咱们先讨论技术再讨论代理
Cy86
2 天前
@macaodoll #29 感谢建议, 目前只是突然想到了技术上的问题, 在纠结 Python 为啥并发上不去, 卡点在哪

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/652669

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX