Python请求库限制api调用

Python请求库限制api调用,python,api,url,python-requests,Python,Api,Url,Python Requests,我正在用OpenStreetMap数据建立一个数据库。我成功地提取了我所在国家(意大利)的所有兴趣点,但现在我想为它们添加一个地址。1/2的点不包含在节点的方式列表中,并且它也没有和地址属性,所以我必须依赖于Namingm api。他们的限制是,我不能每秒调用超过一个api:必须解析200000个poi地址,这需要很多时间,所以我实现了一个多线程脚本,但我不想破坏Namingm规则。有什么方法可以在请求中设置一些随机代理和头来绕过它?在我的多线程脚本中,有一种方法可以告诉请求限制调用 def w

我正在用OpenStreetMap数据建立一个数据库。我成功地提取了我所在国家(意大利)的所有兴趣点,但现在我想为它们添加一个地址。1/2的点不包含在节点的方式列表中,并且它也没有和地址属性,所以我必须依赖于Namingm api。他们的限制是,我不能每秒调用超过一个api:必须解析200000个poi地址,这需要很多时间,所以我实现了一个多线程脚本,但我不想破坏Namingm规则。有什么方法可以在请求中设置一些随机代理和头来绕过它?在我的多线程脚本中,有一种方法可以告诉请求限制调用

def writePoiToFile():
types = dict()
addresses = dict()
no_named = 0
with open('streets.json') as j:
    ways = json.load(j)['Way']
    for key, value in ways.items():
        try:
            name = value['tags']['name']
            for code in value['refs']:
                addresses[str(code)] = name
        except KeyError:
            no_named = no_named + 1
            continue
print('Loaded streets')
with open('poi_types.csv') as poi_types:
    csv_reader = csv.reader(poi_types, delimiter=',')
    for row in csv_reader:
        types[row[1]] = row[0].lower().replace('_', ' ').capitalize()
print('Loaded types')
with open('italy-latest.csv') as csv_file:
    csv_reader = csv.reader(csv_file, delimiter='|')
    tasks = []
    with concurrent.futures.ThreadPoolExecutor(max_workers=400) as executor:
        for row in csv_reader:
            if len(row) < 5:
                continue
            else:
                place_type = types[row[0]]
                place_id = row[1]
                latitude = row[2]
                longitude = row[3]
                name = unidecode.unidecode(row[4]).replace('"', '')
                address = 'None'
                town = 'None'
                if row[5]:
                    address = unidecode.unidecode(row[5]).replace('"', '')
                if row[6]:
                    town = unidecode.unidecode(row[6]).replace('"', '')
                if address == 'None':
                    if place_id[1:] in addresses:
                        address = addresses[place_id[1:]]
                tasks.append(executor.submit(build_poi, place_id, latitude, longitude, name, place_type, address, town))
        print('Loaded poi')
        with open('pois.json', 'a') as poi_file:
            for future in futures.as_completed(tasks):
                poi_file.write(future.result() + '\n')


def reverseGeoApi(latitude, longitude):
try:
    r = requests.get(
        'https://nominatim.openstreetmap.org/reverse?lat=' + latitude + '&lon=' + longitude + '&format=json')
    address = r.json()
    result = []
    if address['address']['road']:
        result.append(address['address']['road'])
    else:
        result.append('None')
    if address['address']['town']:
        result.append(address['address']['town'])
    else:
        result.append('None')
    return result
except KeyError:
    return ['None', 'None']
def writePoiToFile():
类型=dict()
地址=dict()
没有命名的\u=0
以open('streets.json')作为j:
ways=json.load(j)['Way']
对于键,使用ways.items()表示值:
尝试:
名称=值['tags']['name']
对于值['refs']中的代码:
地址[str(代码)]=姓名
除KeyError外:
未命名=未命名+1
持续
打印(“加载的街道”)
以open('poi_types.csv')作为poi_类型:
csv_reader=csv.reader(poi_类型,分隔符=',')
对于csv_读取器中的行:
类型[行[1]]=行[0].lower().replace(“”,“”).capitalize()
打印('加载的类型')
打开('意大利语-latest.csv')作为csv\u文件:
csv_reader=csv.reader(csv_文件,分隔符=“|”)
任务=[]
以并发.futures.ThreadPoolExecutor(max_workers=400)作为执行器:
对于csv_读取器中的行:
如果长度(世界其他地区)<5:
持续
其他:
地点类型=类型[行[0]]
place_id=行[1]
纬度=第[2]行
经度=行[3]
name=unidecode.unidecode(第[4]行)。替换(“,”)
地址='无'
城镇=‘无’
如果第[5]行:
地址=unidecode.unidecode(第[5]行)。替换(“,”)
如果第[6]行:
town=unidecode.unidecode(第[6]行)。替换(“,”)
如果地址==“无”:
如果在地址中放置[1:]
地址=地址[place_id[1:]
tasks.append(executor.submit(构建poi、地点id、纬度、经度、名称、地点类型、地址、城镇))
打印('加载的poi')
打开('pois.json','a')作为poi_文件:
对于未来。完成时(任务):
poi_file.write(future.result()+'\n')
def reverseGeoApi(纬度、经度):
尝试:
r=requests.get(
'https://nominatim.openstreetmap.org/reverse?lat=“+纬度+”&lon=“+经度+”&format=json')
地址=r.json()
结果=[]
如果地址['address']['road']:
结果.追加(地址['address']['road'])
其他:
result.append('None'))
如果地址['address']['town']:
结果.追加(地址['address']['town'])
其他:
result.append('None'))
返回结果
除KeyError外:
返回['None','None']
谢谢