欢迎来到站圈网!

java numpy线性方程组KEY_Oc36cfac82e3python线性插值pygameselenium

投稿中心

Python

当前位置: 主页 > 编程语言 > Python

使用Python获取免费IP地理位置信息

时间:2022-11-12|作者:佚名|点击:

具体不表我今天要做的工作就是: 需要将数据库中大量ip查询出起归属地

刚开始感觉好简单啊毕竟只需要从百度找个免费接口然后来个python脚本跑一晚上就ok了嘛~但是网上免费接口要么限制访问频率(淘宝的)要么限制访问次数(百度及其他)

没辙了从百度找到了几个在线查询的接口要么不够准确(或者说她们的数据库太旧了)要么就是速度太慢了跟限制访问似的(没办法,小规模人家的服务器的确不够好)

于是乎就想到了百度首页的ip接口就这货:

使用Python获取免费IP地理位置信息(图1)

为了防止泄露隐私其中ip地址信息已经在控制台稍作修改

随便输入一个ip点击查询

使用Python获取免费IP地理位置信息(图2)

没想到,百度的接口竟然就这么暴露出来了如此简单试试能不能直接用

ip00.py

from pprint import pprintimport requests
res = requests.get(    'https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?query=112.53.65.12&co=&resource_id=6006&t=1551419352431&ie=utf8&oe=gbk&cb=op_aladdin_callback&format=json&tn=baidu&cb=jQuery110200929818675063574_1551418734860&_=1551418734868')
pprint(res.text)

返回结果:

('/**/jQuery110200929818675063574_1551418734860({"status":"0","t":"1551419352431","set_cache_time":"","data":[{"location":"山东省青岛市 '
 '移动","titlecont":"IP地址查询","origip":"112.53.65.12","origipquery":"112.53.65.12","showlamp":"1","showLikeShare":1,"shareImage":1,"ExtendedLocation":"","OriginQuery":"112.53.65.12","tplt":"ip","resourceid":"6006","fetchkey":"112.53.65.12","appinfo":"","role_id":0,"disp_type":0}]});')

与浏览器访问返回结果一样,这个太出乎意料了,好吧,b厂还是留了点情面的,可是他们家的接口只能按年来买,大概要999RMB/年

再测试一下换个 ip 地址继续查询还能不能查到结果(防止后面的数据是加密的)

这个呢,其实最好的办法是在浏览器中进行测试,换个ip看一下控制台的url会不会有变化(主要是后面的参数),可能会存在加密数据,其实这个我测试了,会有一个参数变化 ,但是我重复提交时没发生改变一样能够请求数据,几乎就可以说明这个参数是迷惑用的(也可能是时间戳吧,我忘了具体什么参数了.时间戳的话就更好了,为了防止浏览器有缓存的)

ip01.py

from pprint import pprintimport requests
res = requests.get(    'https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?query=112.53.54.12&co=&resource_id=6006&t=1551419352431&ie=utf8&oe=gbk&cb=op_aladdin_callback&format=json&tn=baidu&cb=jQuery110200929818675063574_1551418734860&_=1551418734868')
pprint(res.text)

返回结果:

('/**/jQuery110200929818675063574_1551418734860({"status":"0","t":"1551419352431","set_cache_time":"","data":[{"location":"广东省 '
 '移动","titlecont":"IP地址查询","origip":"112.53.54.12","origipquery":"112.53.54.12","showlamp":"1","showLikeShare":1,"shareImage":1,"ExtendedLocation":"","OriginQuery":"112.53.54.12","tplt":"ip","resourceid":"6006","fetchkey":"112.53.54.12","appinfo":"","role_id":0,"disp_type":0}]});')

ok数据更换ip也是没有问题的也不需要伪装agent

那么我们来尝试一下访问频率有没有限制:

这里先为大家介绍一个库:faker

这是一个python造假用的库可以生成很多测试数据姓名地址电话等等信息

这里推荐一位陌生老哥的博客:https://www.cnblogs.com/blueteer/p/10277725.html 如果不知道这个库可以看一眼下面的小demo:

faker_test.py

from faker import Faker
f = Faker('zh-CN')print(f.ipv4())

返回结果:

101.208.5.200

这段代码就这点功能就是可以生成随机ip地址

ip02.py

from pprint import pprintimport requestsfrom faker import Faker
f = Faker('zh-CN')for i in range(100):
    ip = f.ipv4()
    res = requests.get('https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?query=' + ip + '&co=&resource_id=6006&t'
        '=1551419352431&ie=utf8&oe=gbk&cb=op_aladdin_callback&format=json&tn=baidu&cb'
        '=jQuery110200929818675063574_1551418734860&_=1551418734868')
    pprint(res.text)

这里稍微整理了一下url就是换了个行而已

返回结果(太多了截个图意思意思)

使用Python获取免费IP地理位置信息(图3)

速度挺快待会儿再测试一下它的耗时到底有多少

数据杂乱不好整理直接来个简单粗暴的分割字符串吧:

稍作修改后:

ip03.py

import requestsfrom faker import Faker

f = Faker('zh-CN')for i in range(100):
    ip = f.ipv4()
    res = requests.get('https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?query=' + ip + '&co=&resource_id=6006&t'
        '=1551419352431&ie=utf8&oe=gbk&cb=op_aladdin_callback&format=json&tn=baidu&cb'
        '=jQuery110200929818675063574_1551418734860&_=1551418734868')
    text = res.text
    location = text.split('location":"')[1].split('","titlecont')[0]    print(location)

吓死我了刚才断网了我还以为百度的这条路只能走这么远了呢毕竟我上午已经弄了不少数据了下午就不行的话,我这一上午岂不是白瞎了。

返回结果

澳大利亚
澳大利亚
广东省 电信
韩国
美国
美国
美国
比利时
美国
美国
...后面的不发了,太长了

最后来计个时

ip04.py

from time import timeimport requestsfrom faker import Faker# 获取当前秒级时间戳t1 = int(time())
f = Faker('zh-CN')for i in range(100):
    ip = f.ipv4()
    res = requests.get(        'https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?query=' + ip +        '&co=&resource_id=6006&t'
        '=1551419352431&ie=utf8&oe=gbk&cb=op_aladdin_callback&format=json&tn=baidu&cb'
        '=jQuery110200929818675063574_1551418734860&_=1551418734868')
    text = res.text
    location = text.split('location":"')[1].split('","titlecont')[0]    print(location)
t2 = int(time())print(t2 - t1)

返回结果:

...美国
美国
美国
荷兰
美国
美国
澳大利亚
澳大利亚
19

还不错吧100个耗时19秒想要更快可以试试java或者多线程吧,反证我就用这一次,而且也不赶时间估计今晚就把我那些数据搞定了

最后娱乐一下缩减一下代码行数(计时就去掉了反正对我也没什么实际用途)

import requests;from faker import Faker;f = Faker('zh-CN');print([requests.get('https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?query=' + f.ipv4() +'&resource_id=6006&_='+str(i)).text.split('ation":"')[1].split('","tit')[0] for i in range(10)])

这里主要是精简了一部分url,不知道修改后还好不好使了


版权声明:本文内容由小编收集网络,均来自网络用户自发贡献,版权归原作者所有,Web前端、电脑编程学习类网站不拥有其著作权,亦不承担相应法律责任。具体规则请查看《Web前端、电脑编程学习类网站用户服务协议》和《Web前端、电脑编程学习类网站知识产权保护指引》。如果您发现本站中有涉嫌抄袭的内容,填写联系本站管理员,一经查实,管理员将立刻删除涉嫌侵权内容。

上一篇:python中windows链接linux执行命令并获取执行

下一篇:Python实现打印九九乘法表的不同方法总结

本文标题:使用Python获取免费IP地理位置信息

本文地址:https://www.zhano.cn/python/67863.html

AD300

广告投放 | 联系我们 | 版权申明 | SiteMap

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:15234109 | 邮箱:15234109#qq.com(#换成@)

Copyright © 2019-2023 豫ICP备19001789号