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

news2024/9/21 12:33:19

一、实现样式

ip查询
weather

二、核心点

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/802427.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Lambda-Java8新特性最佳实践

一、基本概念 1.背景 Lambda是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。 Lambda 表达式&#xff08;Lambda express…

视频孪生赋能智慧交通,视频孪生在9大交通场景的典型应用展示

《数字中国建设整体布局规划》中提出&#xff0c;要推动数字技术和实体经济深度融合&#xff0c;在交通领域加快数字技术创新应用。其中对“数字技术创新应用”的理解&#xff0c;一方面是指推动人工智能、大数据、云计算、数字孪生、物联网等新技术与交通行业深度融合&#xf…

深度学习入门(二):神经网络整体架构

一、前向传播 作用于每一层的输入&#xff0c;通过逐层计算得到输出结果 二、反向传播 作用于网络输出&#xff0c;通过计算梯度由深到浅更新网络参数 三、整体架构 层次结构&#xff1a;逐层变换数据 神经元&#xff1a;数据量、矩阵大小&#xff08;代表输入特征的数量…

1400*B. Toy Blocks

Example input 3 3 3 2 2 4 2 2 3 2 3 0 3 0 output 1 0 3 解析&#xff1a; 对于某个盒子&#xff0c;我们用其余盒子的最大值 mx 乘以其余的盒子数量&#xff08;n-1&#xff09;&#xff0c;再减去其余盒子当前的数量 ( sum-a[ i ] )&#xff0c;即为需要补上的数量 cnt…

某制造企业基于 KubeSphere 的云原生实践

背景介绍 随着业务升级改造与软件产品专案的增多&#xff0c;常规的物理机和虚拟机方式逐渐暴露出一些问题&#xff1a; 大量服务部署在虚拟机上&#xff0c;资源预估和硬件浪费较大&#xff1b;大量服务部署在虚拟机上&#xff0c;部署时间和难度较大&#xff0c;自动化程度…

RocketMQ工作原理

文章目录 三.RocketMQ工作原理1.消息的生产消息的生产过程Queue选择算法 2.消息的存储1.commitlog文件目录与文件消息单元 2.consumequeue目录与文件索引条目 3.对文件的读写消息写入消息拉取性能提升 3.indexFile1.索引条目结构2.文件名的作用3.查询流程 4.消息的消费1.推拉消…

思维导图怎么做?一份完整的思维导图绘制教程来了!

在信息爆炸的时代&#xff0c;如何高效地整理和消化信息是每个人都需要面对的问题。思维导图作为一种能够高效组织和呈现信息的工具&#xff0c;凭借其直观、易理解的特性&#xff0c;备受学生、教师、企业管理者、商业团队等许多人的青睐。那么&#xff0c;如何制作思维导图呢…

Python案例|使用Scikit-learn实现客户聚类模型

聚类是一种经典的无监督学习方法&#xff0c;无监督学习的目标是通过对无标记训练样本的学习&#xff0c;发掘和揭示数据集本身潜在的结构与规律&#xff0c;即不依赖于训练数据集的类标记信息。聚类试图将数据集划分为若干个互不相交的类簇&#xff0c;从而每个簇对应一个潜在…

适合运动时戴的蓝牙耳机有哪些?精选五款表现还不错的耳机

音乐能有效地激发人体潜能&#xff0c;充分释放能量&#xff0c;达到更好的运动效果&#xff0c;因此对于运动爱好者来说&#xff0c;运动耳机至关重要。面对产品种类众多的运动耳机&#xff0c;很多人都会感到迷茫&#xff0c;经常有人问“有什么适合运动的时候佩戴的耳机”&a…

健身用什么耳机好?分享几款适合健身时使用的耳机!

随着全民健身的热潮到来&#xff0c;运动耳机的种类也更加丰富。在众多入耳式耳机、半入耳式耳机、头戴式耳机等传统市场之中&#xff0c;诞生了一种新晋关注度极高的耳机骨传导耳机。这种不依赖空气传递声波&#xff0c;并且无需堵住耳朵的新奇聆听方式&#xff0c;不仅健康而…

ChatGPT | 分割Word文字及表格,优化文本分析

知识库读取Word内容时&#xff0c;由于embedding切片操作&#xff0c;可能会出现表格被分割成多个切片的情况。这种切片方式可能导致“列名栏”和“内容栏”之间的Y轴关系链断裂&#xff0c;从而无法准确地确定每一列的数据对应关系&#xff0c;从而使得无法准确知道每一列的数…

PySpark基本操作:如何查看源码

方法一&#xff1a; from pyspark.mllib.tree import GradientBoostedTrees import inspectsource_code inspect.getsource(GradientBoostedTrees) print(source_code) 方法二&#xff1a; GradientBoostedTrees — PySpark 3.4.1 documentation (apache.org) 在官网中&…

【网络原理】 (1) (应用层 传输层 UDP协议 TCP协议 TCP协议段格式 TCP内部工作机制 确认应答 超时重传 连接管理)

文章目录 应用层传输层UDP协议TCP协议TCP协议段格式TCP内部工作机制确认应答超时重传 网络原理部分我们主要学习TCP/IP协议栈这里的关键协议(TCP 和 IP),按照四层分别介绍.(物理层,我们不涉及). 应用层 我们需要学会自定义一个应用层协议. 自定义协议的原因? 当前的软件(应用…

途乐证券:纺织服装板块走强,金发拉比、红蜻蜓涨停,嘉曼服饰等大涨

纺织服装板块28日盘中强势上扬&#xff0c;到发稿&#xff0c;嘉曼服饰涨约17%&#xff0c;金发拉比、红蜻蜓涨停&#xff0c;日播时尚、如意集团、云中马涨约7%&#xff0c;比音勒芬、聚杰微纤等涨超5%。 数据显现&#xff0c;4月美国服装及服装面料批发商库存额与服装及服装配…

K8s-资源管理(二)

文章目录 2. 资源管理2.1 资源管理介绍2.2 YAML语言介绍2.3 资源管理方式2.3.1 命令式对象管理2.3.2 命令式对象配置2.3.3 声明式对象配置 2.4. 模拟使用普通用户来操作2.5 kubectl 一些基本命令2.6 使用个人的 docker 仓库的镜像 2. 资源管理 2.1 资源管理介绍 在kubernetes…

分享VMware Workstation Pro ESXI7创建虚拟机和配置硬盘空间(分享自己的学习历程意在帮助有需要的小伙伴)

背景&#xff1a;因公司项目需求改用VMware Workstation Pro&#xff0c;已经使用1个月目前除了中途出现过一次问题被解决后一直稳定运行至今&#xff0c; 1:这里贴出拿出现的问题提示及解决方法的链接&#xff1a;解决vmWare ESXI 7.3报错; 2:如果你是第一次接触VMware Work…

剑指offer63.股票的最大利润

这道题比我想象的简单&#xff0c;通过示例1可以发现&#xff0c;这个股票只能买卖一次&#xff0c;我以前写过一道题股票可以买卖多次比如示例1就可以1买5卖再3买6卖这样利润就是7&#xff0c;而这道题其实就是找一个小的数和它后面的大的数的差值&#xff0c;找出这个最大差值…

面试手写实现Promise.all

目录 前言常见面试手写系列Promise.resolve 简要回顾源码实现Promise.reject 简要回顾源码实现Promise.all 简要回顾源码实现Promise.allSettled 简要回顾源码实现Promise.race 简单回顾源码实现结尾 前言 (?﹏?)曾经真实发生在一个朋友身上的真实事件&#xff0c;面试官让…

网络应用技术师技能考试试题

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…

2023秋招面试题持续更新中。。。

目录 1.八股文渐进式MVVM三次握手&#xff0c;四次挥手viteajax组件化和模块化虚拟dom原理流程浏览器内核浏览器渲染过程回流和重绘nextTick 2.项目相关1.声明式导航和编程式导航重写push和replace方法&#xff1a;性能优化图片懒加载路由懒加载 http请求方式 1.八股文 渐进式…