在进行下面环节的时候我们需要先明白一个点:什么是IP地址 ?
IP地址:IP地址分为局域网和广域网两种。它在全球范围内实现了不同硬件结构、不同操作系统、不同网络系统的互联。在整个Internet中,每一个节点都依靠唯一的IP地址互相区分和相互联系。
有网络的地方就一定有IP,因为IP地址的存在是构成现如今整个Internet的基础;非常的重要,而且每一台计算机只要连网了,都无权自行去设定属于自己的IP地址,估计大家会有一个疑惑?那IP地址是怎么来的呢?这会有一个统一的机构进行管理;在此我们先不过多去描述。
- 实战
这里我们分析的是专门做IP地址的一个大数据统计平台。
分析网站结构,确定我们要抓取的数据内容
经过分析,该网站的结构非常的简单,没有什么特别的,下面是我们需要抓取的内容;但在这里我运用了图形界面来做。
我们的需求是这样的:
1、有一个可被用户输入ip地址的输入框2、一个可被用户点击确定要查询的按钮
3、一个可用来展示通过爬虫抓取网站数据后的区域
from tkinter import *
# 创建主窗口
root = Tk()
# 设置标题内容
root.title("PM-ip定位")
# 创建输入框并设置尺寸
ip_input = Entry(root, width=40)
# 创建一个回显列表
display_info = Listbox(root, width=60, height=10)
# 创建查询按钮
result_button = Button(root, text=" 查 询 ")
if __name__ == '__main__':
# 完成布局 显示
ip_input.pack()
display_info.pack()
result_button.pack()
# 循环
root.mainloop()
运行之后是一个非常简单的界面;关于里面的一些属性应用 ,也都是非常简单的,这里就不过多描述了
我这里有跟本章节配套的视频,如果有需要的可以联系我!
接下来,我们通过爬虫抓取数据并跟上述界面融合在一起;
第一步:获取数据
如果大家觉得阅读有困难,包括headers我是一键生成的;可以参考我前2篇文章,有很详细的介绍,这里就一概而过了。
import requests
# 查询函数, 接收用户输入的ip地址
def get_find_position():
# 伪装
headers = {
'Connection': 'keep-alive',
'Cache-Control': 'max-age=0',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
'Referer': 'https://www.ipip.net/ip.html',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9',
}
# 发送请求并获取返回数据
response = requests.get('https://www.ipip.net/ip/175.0.59.43.html', headers=headers).text
print(response)
第二步: 运用re正则表达式 ;解析数据内容
正则表达式是非常灵活的一种解析方式,这里运用了简单粗暴的通配符方案(.*?) 。
import re
# 正则表达式
address = re.search(r'地理位置.*?;">(.*?)</span>', response, re.S)
operator = re.search(r'运营商.*?;">(.*?)</span>', response, re.S)
time = re.search(r'时区.*?;">(.*?)</span>', response, re.S)
wrap = re.search(r'地区中心经纬度.*?;">(.*?)</span>', response, re.S)
第三步:将解析内容在界面中进行展示
这里运用了回传,将解析的内容回传至窗口列表中进行展示。
# 判断是否匹配成功
if address:
# 匹配成功则一定有ip和地理位置信息
ip_info_list = ['地理位置: ' + address.group(1), '当前IP: ' + ip]
# 分别判断其他信息匹配结果, 成功则加入临时列表
if operator:
ip_info_list.insert(0, '所有者/运营商: ' + operator.group(1))
if time:
ip_info_list.insert(0, '时区: ' + time.group(1))
if wrap:
ip_info_list.insert(0, '地区中心经纬度: ' + wrap.group(1))
# 清空之前的回显列表
display_info.delete(0, 5)
else:
display_info.insert(0, "无效的ip!")
在图形界面中Button组件有一个属性为command,这个属性可以绑定一个事件,当我们点击这个组件的时候,会执行绑定的事件,而这个是事件就是我们的爬虫。
result_button = Button(root, command=get_find_position, text=" 查 询 ")