符合道德且经济高效地扩展数据报废


13

生活中很少有什么能让我高兴的,例如从Internet上抓取结构化和非结构化数据,并在我的模型中使用它们。

例如,数据科学工具包(或RDSTKR程序员)允许我使用IP或地址提取大量基于位置的良好数据,tm.webmining.plugin而R的tm软件包使抓取金融和新闻数据变得直截了当。当超越此类(半)结构化数据时,我倾向于使用XPath

但是,我一直在不断受到您允许进行的查询数量限制的限制。我认为Google将我限制为每24小时大约50,000个请求,这对于大数据是个问题。

技术角度来看,解决这些限制很容易-只需切换IP地址并清除环境中的其他标识符即可。但是,这同时引起了道德和财务方面的关注(我认为?)。

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

Answers:


6

对于许多API(我见过最多),速率限制是您的API密钥或OAuth凭据的功能。(Google,Twitter,NOAA,Yahoo,Facebook等)。好消息是您不需要欺骗IP,只需要交换凭据即可,因为它们达到了速率限制。

这里有点自我羞辱的自我提升,但我专门编写了一个python软件包来处理此问题。

https://github.com/rawkintrevo/angemilner

https://pypi.python.org/pypi/angemilner/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


0

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

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

眼下,价格为t2.nano实例$ 0.0058每小时AWS的俄亥俄区域。一千年的情况下,这只是$每小时5.8。但是您不需要整个小时。在不到200秒的时间内完成了100,000页的工作。添加一些额外的时间来设置脚本,安装所需的软件包,压缩结果并将其下载到您的服务器/ PC,并且每个实例您最多仍会花费服务器10分钟的时间。

或大约一美元。200美元可在100,000页中花费1美元。不错。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.