昨天有一个朋友找到我说,”仙草哥哥,最近,我看微博,抖音,公众号等网站平台都上线了显示IP属地这个功能了,他们说,显示IP属地,可以说是网络平台落实信息内容管理主体责任的一项重要举措。我的网站上也想赶紧跟进这一项功能,可是我不会做,你能不能教教我,这个应该怎么做呢?“
我说,”这个不是很容易吗,别人在上你网站的时候,你肯定能收到请求啊,里面就记录了IP地址,有了这个IP地址,不就能查到属地了吗,然后你就选择其中的国家或者地区部分,显示一下,不就可以了吗?“
朋友说,”请求的IP地址我可以拿到,但是问题是,拿到了IP地址以后,怎么才能知道归属地呢?我不认识啊,这可如何是好?“
我说,”其实啊,这个功能特别简单,只要通过python的爬虫就可以实现了。“
因此呢,今天就来研究一下,通过IP查属地这个功能,到底是如何通过程序实现的。
查看本机IP归属地查看本机IP地址的方式有很多,比如说手动通过百度搜索一下”IP“这样的关键字,就能查看到自己的IP,当然,也可以通过requests发起简单的请求完成查看IP这一个功能,比如说,使用一下知名的httpbin.org网站
import requests
r = requests.get("http://httpbin.org/get")
# 显示本机当前ip地址,但是不显示归属地
print("当前的ip地址为:", r.json()["origin"])
通过简单运行一下上边的几行代码,就能显示出当前的IP地址,可是只是显示地址的话,我们还是不能够知道归属地问题。如果要确切的知道IP归属地,还需要依靠一些服务商,比如说国内最常用的ip138
import requests
import re
# 这是ip138网站的一个接口地址,随时都会发生变化,这里只是作为演示
url = "https://2022.ip138.com"
# 必须修改user-agent,否则不可能请求得到数据的,这个在很久以前就是这样了
headers = {"user-agent": "I love you ip138"}
r = requests.get(url, headers=headers, timeout=10)
text = re.search("(来自:.*?)", r.text, re.S)
if text:
print(text.group(1))
else:
print("未查询到结果")
通过以上程序的简单查询,应该就能得到当前本机的ip地址归属地了
查看任意IP地址归属地有了以上的代码,就能够查看到本机的IP地址了,但是呢,还没办法解决朋友的查看别人IP归属地的需求。与直接使用公共的接口不同,如果要批量查询指定IP地址的结果,需要申请专门的api接口
首先登录ip138的用户首页,并选择账号注册,也可以直接使用ip138的用户注册页,完成了账号注册以后,点击申请在线api,之后就可以通过查看ip138的接口文档进行使用了
其实ip138的官方已经给出了python的使用程序,官方文档中的python代码如下
#!/usr/bin/python
# -*- coding: utf-8 -*-
import httplib2
from urllib.parse import urlencode #python3
#from urllib import urlencode #python2
params = urlencode({'ip':'9.8.8.8','datatype':'jsonp','callback':'find'})
url = 'https://api.ip138.com/ip/?'+params
headers = {"token":"8594766483a2d65d76804906dd1a1c6a"}#token为示例
http = httplib2.Http()
response, content = http.request(url,'GET',headers=headers)
print(content.decode("utf-8"))
# 注意:以上代码内容,不是我写的,而是来自于ip138的python官方接口文档的示例演示
显而易见的事情是,这个文档应该已经有些年头了,使用的技术也较为古老,我们可以对其进行简单的更新,将其改为requests版本的当前代码
import requests
ip = "9.8.8.8" # 此处的ip为官方文档中给出的演示ip,需要更换
token = "8594766483a2d65d76804906dd1a1c6a" # 此处为官方文档给出的示例token,需要更换
url = "https://api.ip138.com/ip/"
# 除了可以选择接受jsonp格式以外,还可以选择使用txt或者xml
params = {"ip": ip, "datatype": "jsonp", "callback": "find"}
headers = {"token": token}
r = requests.get(url, params=params, headers=headers, timeout=10)
print(r.text)
正确的注册账号,并配置好token以后,就可以通过以上程序,查看IP的归属地了
价格问题我把解决方案交给朋友以后,朋友看完了感觉很不错,但是仍然有一个担心。像这样一种服务,需要花钱吧,是不是会很贵呢,作为一个普通的小站的站长,能不能负担的起呢?因此呢,我也继续研究了一下这样做的使用价格方面的问题,发现其实并没有想象中的那么贵
当前的价格是像这样的,在图片中可以看出
至少截止到目前为止,价格并不算贵,对于大多小站,可能一年有个几十块钱最多到几百块钱就够了,不过听说随着最近查看IP归属地的需求大大增加了以后,可能下个月(2022-07)就会进行价格的调整,因此具体的使用情况,还以你实际查询到的为准
会导致隐私泄漏吗?目前在很多平台,已经能看到IP归属地的使用了。例如在微博和贴吧,都是在国内会展示所在省份,在国外会展示地区或者国家。因此,这仍然是一个很大的范围,并不会对应到某个人,或者顺着网线找到你家里,因此没有必要担心由于IP归属地造成的信息泄漏问题
当然,即使是显示了IP归属地,也不能够保证其一定准确。而且这在技术实现上也会有很大困难。例如一个人今天在A地登录,但是第二天就换到B地了,这种问题应该如何解决呢?是显示最新的,还是之前的呢?如果信息更新不及时,可能遇到比如大学生已经离开学校所在地很久了,也不再准备回去了,但是ip属地却一直不更新的情况。如果信息更新的特别及时,对于经常有外出需求的人,又会造成反复变化归属地的情况,因此,如果要显示归属地,应该对于更新变化,还要具体研究
多数爬虫程序很快就会由于对方地址和服务变化导致失效,因此无法保证当你看到这篇文章时,文中的程序仍然可以使用。如果文中的程序已失效,需要自行或者求助他人进行重写
另外,切勿将爬虫程序用于非法用途,或者错误的滥用造成对方网站的负担,谢谢!



