如何在 Python 中快速从 IP 地址列表中查找纬度/经度?

Posted

技术标签:

【中文标题】如何在 Python 中快速从 IP 地址列表中查找纬度/经度?【英文标题】:How to look-up Latitude/Longitude from list of IP addresses quickly in Python? 【发布时间】:2021-06-11 16:58:12 【问题描述】:

我目前有一列 IP 地址,我想将其与对应的纬度/经度列连接起来。

我目前正在使用以下方法,但速度非常慢:

def getting_ip(row,latlong):
    url = r'https://freegeoip.app/json/'+row
    headers = 
        'accept': "application/json",
        'content-type': "application/json"
        
    response = requests.request("GET", url, headers=headers)
    respond = json.loads(response.text)
    if respond[latlong]:
      return respond[latlong]
    else:
      return None

df['Latitude'] = [getting_ip(i,'latitude') if i else None for i in df['IP']]
df['Longitude'] = [getting_ip(i,'longitude') if i else None for i in df['IP']]

将 .apply 与定义一起使用并不能节省我太多时间,我大部分时间都花在了获取请求上。有没有一种免费、简单的方法可以从 IP 地址获取纬度/经度(在几次请求后不会过期?)。

【问题讨论】:

我指的是这种类似类型的question with answers in stack overflow。我认为它会让你摆脱这个问题。 【参考方案1】:

为此,如果您更喜欢 python,那么我会找到这些包:

ip2geotools

ip2geotools可以从IP地址中提取经纬度。

ip2geotools 是一个简单的工具,用于从各种地理位置数据库中获取给定 IP 地址的地理位置信息。这个包为几个地理定位数据库提供了一个 API。

一个例子如下:

>>> response = DbIpCity.get('147.229.2.90', api_key='free')
>>> response.ip_address
'147.229.2.90'
>>> response.city
'Brno (Brno střed)'
>>> response.region
'South Moravian'
>>> response.country
'CZ'
>>> response.latitude
49.1926824
>>> response.longitude
16.6182105
>>> response.to_json()
'"ip_address": "147.229.2.90", "city": "Brno (Brno střed)", "region": "South Moravian", "country": "CZ", "latitude": 49.1926824, "longitude": 16.6182105'
>>> response.to_xml()
'<?xml version="1.0" encoding="UTF-8" ?><ip_location><ip_address>147.229.2.90</ip_address><city>Brno (Brno střed)</city><region>South Moravian</region><country>CZ</country><latitude>49.1926824</latitude><longitude>16.6182105</longitude></ip_location>'
>>> response.to_csv(',')
'147.229.2.90,Brno (Brno střed),South Moravian,CZ,49.1926824,16.6182105'

Geoip2

另一个包geoip2 也可用,它与此包类似,但具有异步请求处理支持和单独的数据库搜索选项。

如果需要,您可以查看他们的网站以获取同步和异步 Web 服务示例。

IP2位置

由于这个 API 大部分是付费的,我尝试找到一个免费版本,我找到了这个名为 Ip2location Python 的库,它可以在一个月内为您提供 30000 次免费查找。

【讨论】:

谢谢,但是 ip2geotools 在免费计划下只允许在设定的时间内进行一些请求,而 geoip2 只允许在付费计划下进行异步调用,但如果没有免费计划允许我正在寻找。 哦,我尝试搜索更多带有免费计划的软件包并将其添加到列表中。 但是现在你可以使用这篇文章来建立一个free iplookup script。它使用免费的 api 来查看位置。【参考方案2】:

您可以使用 IP2Location Python 库获取 IP 地址的纬度和经度。例如,

import os
import IP2Location

database = IP2Location.IP2Location(os.path.join("data", "IP2LOCATION-LITE-DB5.BIN"))

rec = database.get_all("19.5.10.1")

print(rec.country_short)
print(rec.country_long)
print(rec.region)
print(rec.city)
print(rec.latitude)
print(rec.longitude)

上面的示例代码使用了IP2Location LITE DB5 database。您可以在此处免费注册并获取数据库:https://lite.ip2location.com/sign-up。

【讨论】:

以上是关于如何在 Python 中快速从 IP 地址列表中查找纬度/经度?的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中 Ping 一个 IP 地址的 CSV 文件

在 QNetworkAccessManager 中,何时从解析 DNS 的 IP 列表中选择 IP?

如何从 linux 上的 python 脚本获取我的本地 IP 地址? [复制]

如何在 Python 中根据 IP 地址获取服务器的位置

如何从字典中的键 "消息 "中提取第一个IP地址,然后用提取的IP地址添加一个名为 "IP "的新键?

在带有 selenium 的 python 中,如何轮换 IP 地址?