一、需求
在ipip查询一个IP的信息,但是仅仅想知道这个IP是不是IDC或者基站的信息。如下图,
ipip貌似也没有提供相对于的代码,直接burp抓包,看看没签名就可以整一个小脚本。
主要涉及到Python的返回数据解析问题。
二、实现代码
import requests
import time
from bs4 import BeautifulSoup
def get_ipinfo(ip):
#print(ip)
url = "https://www.ipip.net/ipquery.html"
headers = {
'Cookie': 'xxx', 'Content-Length': '62'
, 'Cache-Control': 'max-age=0'
, 'Sec-Ch-Ua': '";Not A Brand";v="99", "Chromium";v="94"'
, 'Sec-Ch-Ua-Mobile': '?0'
, 'Sec-Ch-Ua-Platform': '"macOS"'
, 'Upgrade-Insecure-Requests': '1'
, 'Origin': 'https://www.ipip.net'
, 'Content-Type': 'application/x-www-form-urlencoded'
,
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'
,
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9'
, 'Sec-Fetch-Site': 'same-origin'
, 'Sec-Fetch-Mode': 'navigate'
, 'Sec-Fetch-User': '?1'
, 'Sec-Fetch-Dest': 'document'
, 'Referer': 'https://www.ipip.net/ip.html'
, 'Accept-Encoding': 'gzip, deflate'
, 'Accept-Language': 'zh-CN,zh;q=0.9'
, 'Connection': 'close'
}
data = "csrf_token=抓包获得&ip="+ip
# print(data)
res = requests.post(url=url,headers=headers,data=data)
res = (res.text)
#print(res)
#下边是提取是否为IDC,也是重点
# step01: 将文本内容实例化出bs对象
soup_obj = BeautifulSoup(res, "lxml")
# print(soup_obj)
# step02: 查找标签
main = soup_obj.find("dl", attrs={"class": "row"})
# print(main)
# step03: main标签中的每个dd与dt标签都是所需的内容
dd = main.find_all("dd")
# dt = main.find_all("dt")
# print(dd[9])
for IDC in dd[10]:
#print(IDC)
if IDC == '否':
continue
else:
print("这是IDC")
print(ip)
for JZ in dd[11]:
#print(JZ)
if JZ == '否':
continue
else:
print("这是基站")
print(ip)
if __name__ == '__main__':
# 从同目录下的ip.txt文件内获得文件
with open('ip.txt', 'r') as f:
for ip in f:
ip = ip.replace("\n", "")
#print(ip)
try:
get_ipinfo(ip)
except:
print("cookie过期")
time.sleep(1)
#res = get_ipinfo('8.8.8.8')
ip.txt的内容如下:
112.203.xx.xx
112.208.xx.xx
112.211.xx.xx
2402:9d80:xxx:xxxx:xxxx:xxxx:xxxx:xxxx
124.66.xx.xx
三、运行结果
假设ip.txt文件内,存在IDC或者基站就会输出: