合乎道德且经济高效地扩展数据抓取

数据挖掘 文本挖掘
2021-09-25 03:38:03

生活中很少有事情能像从 Internet 上抓取结构化和非结构化数据并在我的模型中使用它们一样让我感到愉悦。

例如,Data Science Toolkit(或RDSTK用于 R 程序员)允许我使用 IP 或地址提取大量基于位置的良好数据,而tm.webmining.pluginfor R 的tm包使抓取财务和新闻数据变得简单。当超越这种(半)结构化数据时,我倾向于使用XPath.

但是,我经常受到您允许进行的查询数量的限制。我认为 Google 将我限制为每 24 小时约 50,000 个请求,这对大数据来说是个问题。

技术角度来看,绕过这些限制很容易——只需切换 IP 地址并从您的环境中清除其他标识符。然而,这提出了道德和财务问题(我认为?)。

有没有我忽略的解决方案?

2个回答

对于许多 API(我见过的大多数),速率限制是您的 API 密钥或 OAuth 凭据的功能。(Google、Twitter、NOAA、Yahoo、Facebook 等)好消息是您不需要欺骗您的 IP,您只需要在它们达到速率限制时更换凭证。

这里有点无耻的自我宣传,但我写了一个专门用于处理这个问题的python包。

https://github.com/rawkintrevo/angelmilner

https://pypi.python.org/pypi/angelmilner/0.2.0

它需要一个 mongodb 守护进程,基本上你为每个键创建一个页面。因此,您有 4 个电子邮件地址,每个地址都分配了一个单独的密钥。当您加载密钥时,您指定每天的最大调用次数和使用之间的最短时间。

加载键:

from angemilner import APIKeyLibrarian
l= APIKeyLibrarian()
l.new_api_key("your_assigned_key1", 'noaa', 1000, .2)
l.new_api_key("your_assigned_key2", 'noaa', 1000, .2)

然后,当您运行刮板时,例如 NOAA api:

url= 'http://www.ncdc.noaa.gov/cdo-web/api/v2/stations' 
payload= {  'limit': 1000,
        'datasetid':  'GHCND', 
        'startdate': '1999-01-01' }

r = requests.get(url, params=payload, headers= {'token': 'your_assigned_key'})

变成:

url= 'http://www.ncdc.noaa.gov/cdo-web/api/v2/stations'
payload= {  'limit': 1000,
            'datasetid':  'GHCND',
            'startdate': '1999-01-01' }

r = requests.get(url, params=payload, headers= {'token': l.check_out_api_key('noaa')['key']})

因此,如果您有 5 个密钥,则l.check_out_api_key返回使用最少的密钥,并等待足够的时间再次使用它。

最后查看您的密钥的使用频率/剩余使用量:

pprint(l.summary())

我没有为 R 写这个,因为大多数抓取是在 python 中完成的(我的大部分抓取)。它可以很容易地移植。

这就是你如何在技术上绕过速率限制。 道德上...

更新示例在此处使用 Google Places API

我发现绕过 IP 地址块的绝妙方法是 Amazon AWS(或 Azure 或任何其他类似的按需服务)。AWS 的 t2.nano 实例的成本几乎与高质量代理相同,并且能够很好地处理速率受限的请求。

例如,假设您需要抓取 100,000 个页面。使用 AWS CLI,您的程序可以自动启动 1,000 个实例。即使您需要在请求之间等待 2 秒,您仍然可以在 200 秒内完成。你付多少钱?

目前,在AWS 的俄亥俄地区,一个 t2.nano 实例的价格为每小时0.0058美元。对于一千个实例,每小时只需 5.8 美元但你不需要整个小时。您的 100,000 页作业在 200 秒内完成。添加一些额外的时间来设置脚本、安装所需的包、压缩结果并将它们下载到您的服务器/PC,并且每个实例最多仍然使用 10 分钟的服务器时间。

或者大约一美元。1 美元可在 200 秒内打印 100,000 页。不错。

注意:当像这样缩放时,你必须非常小心不要意外地使抓取目标过载。如果您在单个网站上释放这么多火力,那么每隔一秒就有大约 1,000 个请求访问服务器。足以杀死大多数网络服务器。因此,如果您拥有多样化的站点列表,则 1,000 台服务器选项可能是一个好主意,但如果您访问单个站点,您可能最多需要使用 10-20 台服务器。