前言

说实话,查看电脑的IP,也挺无聊的,但是够简单,所以就从这里开始吧。IP地址在操作系统里就可以直接查看。但是除了IP地址,我们也想通过IP获取地理地址和网络运营商情况。IP地址和地理地址并没有固定的关系,所以我们需要借助网络上的数据库,或者说借助第三方的服务来查询。这里,我们选用IP.CN提供的IP地址查询服务。

基本环境配置

版本:Python3

系统:Windows

相关模块:PyQt5

实现效果图

完整代码from PyQt5.Qt import (

QApplication,

QWidget,

QLabel,

QPushButton,

QVBoxLayout,

QSizePolicy

)

'''

想要学习Python?Python学习交流群:984632579满足你的需求,资料都已经上传群文件,可以自行下载!

'''

def fetch_ip():

from urllib.request import urlopen, Request

return urlopen(Request("https://ip.cn", headers={"User-Agent": "curl/7"})) \

.read().decode().strip().replace("来自", "\n来自")

app = QApplication([])

lbl = QLabel()

lbl.setStyleSheet("background: teal; color: lime; font-size: 72px;"

"qproperty-alignment: AlignCenter;"

"qproperty-text: 'Ready.'")

lbl.setSizePolicy(QSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored))

btn = QPushButton()

btn.setStyleSheet("* { background: seagreen; color: aqua; font-size: 72px; border: none }"

"* { qproperty-text: 获取IP地址 }"

"*:hover { background: darkgreen }"

"*:pressed { background: olive }")

btn.setSizePolicy(lbl.sizePolicy())

btn.clicked.connect(lambda: lbl.setText(fetch_ip()))

box = QVBoxLayout()

box.addWidget(lbl)

box.addWidget(btn)

box.setStretch(0, 2)

box.setStretch(1, 1)

box.setSpacing(0)

box.setContentsMargins(0, 0, 0, 0)

wnd = QWidget()

wnd.setWindowTitle("IP地址察看器")

wnd.resize(777, 777 * 0.618)

wnd.setLayout(box)

wnd.show()

app.exec()

运行以上程序,点击按钮,大约卡顿半秒后,文本标签处就会显示我们电脑的IP地址、地理地址和ISP信息。

这个程序涉及到了不少新的知识点,我来依次解释一下:

def 函数名(...参数):这种语法是用来定义函数的。Lambda表达式定义的是匿名函数,def定义的是有名字的函数。函数接受0个或多个输入,处理后返回0个或多个输出。

冒号之后的下一行开始是函数体。函数体左边的四个空格不能省略。Python为了简洁,没有提供特殊的符号来给函数定界。Python用Tab(制表符)或空格来给函数定界。Tab在不同平台下宽度可能不一样,所以程序代码中的空白一般用空格。理论上任意个空格都可以,但使用4个空格已经是事实上的标准了。

函数名称里面执行的逻辑,不一定要跟函数名有关系。在函数体里头,可以执行我们想执行的任意逻辑。

函数体可以什么都不做。但是Python规定函数体不能为空。所以,表示什么都不做,要用语句pass

函数体通过return关键字结束执行,并将return后边跟着的数据(如果有的话)返回。没有返回语句的函数,会执行到函数尾部,返回None

用来导入模块的import语句,除了放在代码头部外,也可以用在函数体里面。但是出了这个函数,import进来的东西就访问不到了

Python是一种脚本语言,意思是Python代码会从头到尾一行一行地顺序执行。所以,用到的模块要提前导入,用到的函数要提前定义

使用Python代码也可以访问网页。Python内置的urllib模块提供了这个功能。

URL就是我们通常说的网址。常见的网址可能使用http协议,也可能使用https协议。所以,在代码中,我们要明确指出

urlopen函数可以将网页下载回来。不同的网页,下载回来的格式也不一样。可能是普通的HTML网页(最常见的网页类型),可能是纯文本文档(在Windows下俗称记事本文档),也可能是图片、视频、压缩包等电脑上可以存储的任意文件格式。

urlopen函数下载网页消耗的时间是不确定的。Python代码要一行一行执行,下载网页时,程序要等待下载完成才能执行其他代码(包括响应用户的点击事件)。所以,下载时会导致软件假死,点击按钮没反应。

Python语言经常被用来做爬虫(用来自动化批量下载网页),而urllib是Python官方的可以做爬虫的模块。所以,直接使用urllib,会被ip.cn识别为爬虫而拒绝服务(返回HTTP状态码403)。所以,我们需要将我们的HTTP请求伪装成浏览器或者其他用户代理(User-Agent, 一般用户不会直接使用HTTP协议访问网页,而要借助浏览器代为访问,浏览器代理用户访问网页,这时浏览器的角色就是用户代理)。不过,我们这次不伪装成浏览器,而要伪装成cURL(可以当作一个命令行下的网页浏览器)。因为IP.CN对浏览器返回的是一个HTML网页,对cURL返回的是一个包含了IP信息的字符串。为了省却解析HTML网页获取我们关心的IP信息,我们决定伪装成cURL,一步到位获取。

要伪装成cURL,我们需要修改HTTP请求的头部Header。HTTP规范定义了HTTP头部的User-Agent字段表示用户代理。我们修改这个字段即可。经过我的测试,IP.CN对cURL的识别策略是User-Agent字段以curl开头,后面跟斜杠和curl版本号。我们用curl/7就行。

urllib.request.urlopen返回的数据类型是urllib.response.Response对象,这是urllib对HTTP响应的封装。Response.read()方法可以读取响应内容。由于HTTP响应可能是张图片,所以不能用字符串来表示。read方法读到的是字节码,字节码可以表示任何数据类型,也可以表示任何文件类型。从字节码转换到字符串,需要解码,即调用decode()方法。这张,我们便得到了一个表示IP地址信息的字符串,格式类似于当前 IP: 115.171.212.227 来自: 北京市 电信\n。

字符串调用strip()方法可以去除首位的空白字符,比如换行符号。

字符串调用replace()方法,可以替换字符串中的指定子串为其他文本。我们用replace()方法来给字符串中间添加一个换行符。

控件的文本、对齐方式等属性也可以通过样式表来设置,比如qproperty-text表示文本,qproperty-alignment表示对齐方式。

Qt的样式表(QSS, Qt Style Sheet)中,*是通配符,表示任意控件。

QSS中,:hover表示鼠标悬浮状态,:pressed表示鼠标按下状态。

除了QBoxLayout.addWidget()方法,我们还可以通过QBoxLayout.setStretch(索引,比重)来调节子控件在布局中的拉伸因子。

注意,IP地址是商品,是可以用来买卖的,IP地址的归属地和归属运营商(ISP)也是动态变化的,不一定准确。

python制作查询工具发给别人使用_利用Python制作简单的小程序:IP查相关推荐

  1. python制作查询工具发给别人使用_用Python做一个简单的翻译工具

    编程本身是跟年龄无关的一件事,不论你现在是十四五岁,还是四五十岁,如果你热爱它,并且愿意持续投入其中,必定会有所收获. 本文就来自编程教室一位"小"读者的投稿(互助学习1群里的同学 ...

  2. python制作查询工具发给别人使用_用Python制作天气查询软件

    这是小王推荐的第2篇好文 作者:flywind 程序介绍 先上图让大家感受一下 又来一波Python的骚操作,使用PyQt5和爬虫做一个天气查询软件,具体效果上图中很清楚的能够展示出来.UI使用PyQ ...

  3. python身份证号掩盖出生日期的代码_利用Python制作全国身份证号验证及查询系统!就问你吊不吊!...

    大家好哇,又是一个愉快的周末,今天本鸟给大家分享1个有趣的实战项目,用python制作"全国身份证号验证及查询系统",成品界面如下图: 本系统可以实现身份证号真伪验证,年龄.性别及 ...

  4. python对数据进行合并的函数_利用Python pandas对Excel进行合并的方法示例

    前言 在网上找了很多Python处理Excel的方法和代码,都不是很尽人意,所以自己综合网上各位大佬的方法,自己进行了优化,具体的代码如下. 博主也是新手一枚,代码肯定有很多需要优化的地方,欢迎各位大 ...

  5. python删除数据库的数据完整代码_利用python操作小程序云数据库实现简单的增删改查...

    不止python,你可以利用任何语言那实现通过http请求来操作你自己的小程序云数据库了 背景 也是在最近吧,小程序更新了云开发 HTTP API 文档,提供了小程序外访问云开发资源的能力,使用 HT ...

  6. python按某列拆分excel表格_利用Python+Pandas实现从一个excel表中提取列形成新表

    简要 利用python实现把一个工作表中的某些列,和其中单独的一列,提取成为一个个新表. 如图(处理前)蓝色部分是需要保留的列,红色是需要一项一项分出来作为单独表格的列. 其中,第一行的名字是用的回车 ...

  7. python自动化测试脚本可以测php吗_利用Python语言实现实验室自动化

    作为一名系统和应用工程师,得益于自动化仪器和软件,我已经节省了不计其数的日日夜夜;例如LabVIEW,这是一款系统设计平台和开发环境,支持可视化编程语言.LabVIEW支持用户利用友好的图形用户界面( ...

  8. 利用python爬取58同城简历数据_利用python爬取58同城简历数据-Go语言中文社区

    利用python爬取58同城简历数据 最近接到一个工作,需要获取58同城上面的简历信息(http://gz.58.com/qzyewu/).最开始想到是用python里面的scrapy框架制作爬虫.但 ...

  9. python怎么画出圆润的曲线_利用python画出AUC曲线的实例

    以load_breast_cancer数据集为例,模型细节不重要,重点是画AUC的代码. 直接上代码: from sklearn.datasets import load_breast_cancer ...

  10. 下面哪个python库不能用于提取网页信息_利用python的webscraping库采集抓取爱帮网电话号码...

    利用python的webscraping模块抓取爱帮网电话号码,本文采集该页面的标题和2个电话号码, 具体的python代码: # -*- coding: UTF-8 -*- ''' Created ...

最新文章

  1. [Linux]VI相关操作
  2. php 计算一个字符串在另一个字符串中出现的次数
  3. ARMS V4.3发布,应用监控全新支持内存快照分析,全息排查等功能。
  4. 客户合作伙伴关系研究
  5. notepad正则删除关键词所在行
  6. Javascript Array和String的互转换。
  7. 第四节 CSS继承性和层叠性
  8. POJ 3422 费用流
  9. 后副车架焊接机器人_焊接机器人的工装设计和工装的使用方法
  10. cmd怎么导入mysql文件,使用cmd工具如何导入大容量sql文件到mysql数据库
  11. 小草客户端android2.2.4 g,小草客户端android2.2.5-小草app安卓版客户端android2.2.5预约 v2.2.5-优盘手机站...
  12. win10设置共享 Mac访问
  13. Java泛型_自定义泛型类
  14. 雷电模拟器修改本地IP
  15. vnc 键盘慢_在基于Web的VNC应用程序中支持多种键盘布局
  16. SpringBoot+Vue实现前后端分离的教务评教系统
  17. 【微信小程序】随机点名系统(点击开始滚动名字点击结束按钮结束滚动)
  18. 微信小程序onPullDownRefresh onReachBottom实现下拉刷新上拉分页加载
  19. SyntaxError :invalid syntax错误解决办法
  20. 可穿戴式柔性电子应变传感器基底材料

热门文章

  1. 如何用iframe代码显示调用网页的指定部分
  2. 3.啊哈!算法 --- 一大波数正在靠近——枚举!很暴力
  3. 2.妙用 register_shutdown_function和fastcgi_finish_request
  4. 2. laravel 创建第一条路由
  5. transform-origin用于设置变换原点
  6. Python学习之面向对象(一)
  7. 浅谈文件断点续传和WebUploader的基本结合
  8. 使用强类型DataSet增加数据并获取自动增长的ID
  9. 在更新.net 4.5补丁后,VS2012突然不能打开项目,卸载补丁之后解决。
  10. 如何在Windows上使用GIT下载Android源代码