一、实现样式
二、核心点
1、语言:Python、HTML,CSS
2、python web框架 Flask
3、三方库:requests、xpath
4、爬取网站:https://ip138.com/
5、文档结构
三、代码
ipquery.py
import requests
from lxml import etree
# 请求user-agent
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'}
def getIpInfo(ip):
ipurl = f"https://ip138.com/iplookup.php?ip={ip}&action=2"
res = requests.get(ipurl,headers = headers)
e = etree.HTML(res.text)
ip = e.xpath("//div[@class='caption']//h1//text()")
ipinfo = e.xpath("//div[@class='table-box']//tbody//tr//td[2]//text()")
ipinfo.append(ip[0])
return ipinfo
searchWeather.py
import requests
from lxml import etree,html
import re
# 请求user-agent
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'}
def getWeather(location):
weatherUrl = f"https://www.wentian123.com/search/?location={location}"
res = requests.get(weatherUrl,headers = headers)
e = etree.HTML(res.text)
weather = e.xpath("//table//tbody//td//text()")
#处理数据
# 去除'\n'
weathernew = [x.strip() for x in weather]
# 去掉空字符串''
while '' in weathernew:
weathernew.remove('')
# print(weathernew)
# 数据分组 6个一组
weatherInfo = [weathernew[i:i+6] for i in range(0,len(weathernew),6)]
return weatherInfo
query.py
from flask import Flask,render_template,request
from ipquery.ipquery import getIpInfo
from searchWeather.seachWeather import getWeather
app = Flask(__name__)
# 主页
@app.route('/')
def index():
return render_template('index.html',weather = [],ipinfo = [])
# ip地址查询
@app.route('/ipquery')
def ipquery():
ip = request.args.get('ip')
ipinfo = getIpInfo(ip)
# print(ipinfo[1])
return render_template('index.html',ipinfo = ipinfo,weather = [])
# 天气查询
@app.route('/weather')
def getweather():
location = request.args.get('location')
# print(location)
weather = getWeather(location)
# print(weather)
return render_template('index.html',weather = weather,ipinfo = [])
if __name__ == '__main__':
app.run(port=5000, debug=True)
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
<title>查询网站</title>
</head>
<style>
* {
margin: 0 auto;
padding: 0 auto;
/* display: flex; */
}
.public {
box-shadow: 0 2px 4px rgba(0, 0, 0, .12), 0 0 6px rgba(0, 0, 0, .04);
margin: 0 auto;
width: fit-content;
padding: 40px 60px;
text-align: center;
margin-top: 20px;
}
</style>
<body style="margin: 0 auto;">
<!-- ip查询 -->
<div>
<div class="public">
<h3>IP归属地查询</h3>
</h3>
</h3>
<form class="form-inline" action="/ipquery">
<div class="form-group">
<label for="exampleInputEmail2">IP地址</label>
<input type="text" class="form-control" name="ip" placeholder="请输入需要查询的IP地址" style="width: 300px;">
</div>
<button type="submit" class="btn btn-primary">查询</button>
</form>
<table class="table table-bordered" style="width: 100%;margin-top: 20px;">
<tr>
<th style="text-align: center;">IP地址</th>
<th style="text-align: center;">ASN归属地</th>
<th style="text-align: center;">运营商</th>
</tr>
{% if ipinfo != [] %}
<tr>
<td>{{ipinfo[-1]}}</td>
<td>{{ipinfo[0]}}</td>
<td>{{ipinfo[1]}}</td>
</tr>
{% endif %}
</table>
</div>
<!-- 天气查询 -->
<div class="public">
<form class="form-inline" action="/weather">
<div class="form-group">
<input type="text" class="form-control" name="location" placeholder="请输入市区县名称、区号或者邮政" style="width: 300px;">
</div>
<button type="submit" class="btn btn-primary">查询</button>
</form>
<table class="table table-bordered table-striped table-hover" style="width: 100%;margin-top: 20px;">
{% if weather != [] %}
<tbody>
{% for i in weather %}
<tr>
<td colspan="4" style="font-size: 16px;">{{i[0]}}</td>
</tr>
<tr>
<td>{{i[1]}}{{i[2]}}</td>
<!-- <td>{{i[2]}}</td> -->
<td>{{i[3]}}</td>
<td>{{i[4]}}</td>
<td>{{i[5]}}</td>
</tr>
{% endfor %}
</tbody>
{% endif %}
</div>
</div>
</body>
</html>
四、总结
初学python,很多代码写的很冗余,不够简洁,还有一些逻辑没有处理好,感谢贵网站 信息查询网站 提供的接口数据,里面还有很多类型的查询,这边就简单写了两个查询方法的爬虫,继续加油!!!