使用并行化的 wget/curl 命令进行抓取

使用并行化的 wget/curl 命令进行抓取

我创建了一个脚本,它尝试对 URL 的哈希值(数字)进行所有可能的组合,这些 URL 代表指向某些社交媒体文件(视频或音频)的链接,例如https://www.youtube.com/watch?v={hash}或者https://ok.ru/video/{数字}或等等。该脚本并行运行数千个 wget 命令来确定 URL 是否有效(代表现有媒体),如果为真,则将其写入日志。

目的:创建一个包含所有有效链接的大型哈希图(哈希 -> 标题),并离线使用它进行完整搜索。为什么?因为我确信几乎所有社交网络的搜索机制都不完整:某些东西被复杂的算法跳过(取决于位置等),某些东西确实只输出有限数量的出现。此外,它从来都不是精确搜索(只有整个单词,没有特殊字符)等等。我想要一个像“grep”这样的愚蠢且有保证的子字符串搜索,它可以搜索所有数据量并且绝不会错过。此外,我的方法还提供了按精确持续时间搜索的可能性。

我通过实践确信,如果脚本在 100 多个并行实例中同时在多台 PC 上运行,它会变得非常高效,根据我的测量,如果我有 20-25 台以上的 PC,我只需要几个月的时间就可以传递某个大型社交网络的所有 URL 组合。但我家里没有这样的资源。

问题:

  1. 在哪里可以找到这样的 Web 服务,为我的实验提供足够数量的 PC,并且每台 PC 都有不同的 IP?AWS 是这方面的好选择吗?
  2. 按照我的意愿做会不会有法律风险?我的意思是,会不会有比 IP 封禁更严重的威胁?我确实知道我测试的每个 URL 都是公开的,所以理论上应该没有问题,但如果可能的话,我更愿意感到安全。

答案1

为了访问某些隐藏对象而枚举顺序 ID 的过程称为不安全的直接对象引用(IDOR)。如果这些对象不打算公开,则在某些司法管辖区内访问它们可能被视为非法(IANAL)。

主要的社交平台都很清楚 IDOR,并采取了适当的措施 - 随机 ID、适当的身份验证检查等。他们也不喜欢抓取工具,并应用请求速率限制。我预计,以 100 rps 的请求速率进行抓取的尝试将在几分钟内以 429 结束。我的印象是,抓取工具花费了大部分精力来寻找和管理代理以绕过速率限制。绕过限制肯定会违反 ToS,在某些司法管辖区也可能被视为非法(IANAL)。

从技术角度来看,这个想法严重低估了所需的资源量。有数十亿个网站,Google 索引包含数千亿个文档。即使我们将任务简化为现有的 YouTube 视频,也有 200 亿个。curl对 YouTube 视频获取标题将返回大约 700-800 KB,相当于所有视频的 14 PBytes。这将需要 14 GBits/秒,持续 3 个月。time curl显示大约 0.1-0.2s 的用户+系统时间,这意味着我们可以每秒每个 CPU 核心执行大约 5 个请求(没有任何调度和后处理开销)。要在 3 个月内处理 200 亿个请求,需要 400 个 CPU 核心。要存储带有哈希和视频标题的 200 亿个条目(例如 100 字节),我们需要大约 2 TB 的存储空间,没有任何索引。简单的grep2 TB 文件从 SSD 中读取大约需要 10 分钟,如果在内存中则需要 2 分钟。为了获得合理的搜索响应时间(<5 秒),我们需要将搜索分散到至少 25 个实例上,总共 2 TB RAM,每个实例需要 80 GB RAM。为了获得总共 400 个 CPU 核心,每个实例至少需要 16 个 vCPU。最便宜的实例符合要求,r6g.4xlarge按需每月费用为 588 美元。25 个实例的总成本为每月 14700 美元。

相关内容