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

一、实现样式

Python爬取IP归属地信息及各个地区天气信息_第1张图片
Python爬取IP归属地信息及各个地区天气信息_第2张图片

二、核心点

1、语言:Python、HTML,CSS
2、python web框架 Flask
3、三方库:requests、xpath
4、爬取网站:https://ip138.com/
5、文档结构
Python爬取IP归属地信息及各个地区天气信息_第3张图片

三、代码

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

你可能感兴趣的:(Python,python,tcp/ip,开发语言,flask,爬虫)