Python爬取IP归属地信息及各个地区天气信息

一、实现样式


二、核心点

1、语言:Python、HTML,CSS

2、python web框架 Flask

3、三方库:requests、xpath

4、爬取网站:https://ip138.com/

5、文档结构

三、代码

ipquery.py

python 复制代码
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

python 复制代码
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

python 复制代码
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

javascript 复制代码
<!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,很多代码写的很冗余,不够简洁,还有一些逻辑没有处理好,感谢贵网站 信息查询网站 提供的接口数据,里面还有很多类型的查询,这边就简单写了两个查询方法的爬虫,继续加油!!!

相关推荐
·云扬·17 分钟前
【Java源码阅读系列37】深度解读Java BufferedReader 源码
java·开发语言
liulilittle1 小时前
C++ i386/AMD64平台汇编指令对齐长度获取实现
c语言·开发语言·汇编·c++
qq_171538851 小时前
TCP/IP协议精解:IP协议——互联网世界的邮政编码系统
网络·网络协议·tcp/ip
珹洺1 小时前
计算机网络:(七)网络层(上)网络层中重要的概念与网际协议 IP
网络·tcp/ip·计算机网络
巴里巴气1 小时前
selenium基础知识 和 模拟登录selenium版本
爬虫·python·selenium·爬虫模拟登录
19891 小时前
【零基础学AI】第26讲:循环神经网络(RNN)与LSTM - 文本生成
人工智能·python·rnn·神经网络·机器学习·tensorflow·lstm
JavaEdge在掘金1 小时前
Redis 数据倾斜?别慌!从成因到解决方案,一文帮你搞定
python
ansurfen1 小时前
我的第一个AI项目:从零搭建RAG知识库的踩坑之旅
python·llm
Thomas_YXQ1 小时前
Unity URP法线贴图实现教程
开发语言·unity·性能优化·游戏引擎·unity3d·贴图·单一职责原则
前端付豪1 小时前
20、用 Python + API 打造终端天气预报工具(支持城市查询、天气图标、美化输出🧊
后端·python