#笔者使用的python IDE是Thonny,系统是win11(安装包的步骤查看往日笔记)
首先我们需要引入对应的包,requests:用于发送HTTP请求并获取响应。
lxml:用于解析HTML页面。
Flask:用于创建Web应用程序。
gevent.pywsgi:用于启动WSGI服务器。
import requests
from lxml import etree
from flask import Flask,render_template,request
from gevent import pywsgi
我们要想在网页端实现,需要创建一个简单的web应用
app = Flask(__name__)
创建一个名为app的Flask应用程序事例
我们先写一个获得手机号码的函数
def get_phone(phone):
url = f'https://www.ip138.com/mobile.asp?mobile={phone}&action=mobile'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.67'}
response = requests.get(url,headers=headers)
response.encoding = 'utf-8'
这里的url源自ip38官网iP地址查询--手机号码查询归属地 | 邮政编码查询 | iP地址归属地查询 | 身份证号码验证在线查询网 (ip138.com)
进入这个网站
随便输入一个号码,比如笔者输入的是18836498752
可以查到对应的归属地是河南濮阳,发现上面的网址变成了
https://www.ip138.com/mobile.asp?mobile=18836498752&action=mobile
所以我们的url地址就可以写为
url = f'https://www.ip138.com/mobile.asp?mobile={phone}&action=mobile'#phone用来获得参数
headers模仿浏览器,reponse接受服务器的响应,并改编码为utf-8格式
e = etree.HTML(response.text)
datas = e.xpath(f"//tr/td[2]/span/text()")
return datas
然后该解析数据了,etree模块解析响应的HTML页面,通过XPath表达式"//tr/td[2]/a[@href != '//jx.ip138.com/{phone}/']/text()"提取归属地信息。
这里的xpath表达式是指获取html元素从tr标签开始的第二个td的span标签文本值
接下来该定义路由函数
@app.route('/index3')
def index3():
return render_template('index3.html')
@app.route('/search_phone')
def search_phone():
phone = request.args.get('phone')
return '<br/>'.join(get_phone(phone))
index3返回index3.html模板的内容,对应的视图函数用于处理查询手机号码的请求,从请求参数中获取手机号码,并调用get_phone(phone)函数获取归属地信息,然后将信息以HTML换行符<br/>连接并返回。
网页代码如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form action="/search_phone" method="get">
手机号:<input type="text" name="phone" id="">
<input type="submit" value="查询">
</form>
</body>
</html>
server = pywsgi.WSGIServer(('127.0.0.1', 5005), app)
server.serve_forever()
最后使用gevent.pywsgi模块创建一个WSGI服务器,将应用程序绑定到127.0.0.1的5005端口,并启动服务器,使应用程序可以接收HTTP请求并响应。
这样就可以获得对应的电话归属地
python代码如下:
import requests
from lxml import etree
from flask import Flask,render_template,request
from gevent import pywsgi
app = Flask(__name__)
def get_phone(phone):
url = f'https://www.ip138.com/mobile.asp?mobile={phone}&action=mobile'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.67'}
response = requests.get(url,headers=headers)
response.encoding = 'utf-8'
#解析数据
e = etree.HTML(response.text)
datas = e.xpath(f"//tr/td[2]/span/text()")
return datas
@app.route('/index3')
def index3():
return render_template('index3.html')
@app.route('/search_phone')
def search_phone():
phone = request.args.get('phone')
return '<br/>'.join(get_phone(phone))
server = pywsgi.WSGIServer(('127.0.0.1', 5005), app)
server.serve_forever()