用Python看看哪个城市最热

本文介绍了一种简单的爬虫实践案例,利用Python的requests和beautifulsoup4库抓取中国天气网的城市天气数据,并通过数据分析找出全国最热的城市。文章详细介绍了爬虫的实现步骤及技巧。
部署运行你感兴趣的模型镜像

哪个城市最热?

现如今,我大天朝举国上下都处于一种高温的状态。那么这里我们也来蹭一蹭热度,来写个小爬虫,看看全国哪个城市最热。东西虽然小,但是比起那些所谓“高大上”的教程来说,这篇文章比较脚踏实地,不玩虚的,你看完后一定可以学会的。

准备工作:
  1. 在做爬虫之前,首先对爬虫的解题路径做个简单概述。一个爬虫工作分为两步骤:

    • 第一步:把你需要爬取的那个网页的数据全部拉下来。
    • 第二步是把从网站上拉下来的数据进行过滤,把你需要的提取出来,把不需要的给过滤掉。这就是爬虫的工作原理。
  2. 我们要爬取的网站数据不是特别大,复杂度也不高。因此为降低大家学习爬虫的难度。我们不上那些很复杂的框架,比如Scrapy,而是直接使用一个简单又好用的第三方库帮我们完成爬虫任务,那就是requests库。requests库是一个专门用来从网站上拉取数据的库,也就对应了我们爬虫工作的第一步——从网站上拉取数据。这个库的使用,后面我们会讲到,如果您还没有安装这个库,那么可以通过以下命令进行安装:pip install requests。如果您使用的是Linux或者Mac OS系统,那么最好在前面加上一个sudo pip install requests,不然很容易会因为权限问题而安装失败。

  3. 在使用requests库把数据拉取下来以后,接下来的工作就是对这些数据进行分析和过滤了。这时候我们使用的一个第三方库是beautifulsoup4。这个库是专门用来解析网页数据的。并且为了使接下效率更高,一般我们推荐使用lxml来作为解析的引擎。因此,要使用beautifulsoup库,要通过以下命令来安装:

    # 安装lxml
    pip install lxml
    # 安装beautifulsoup4
    pip install bs4
中国天气网分析:

这里我们需要爬取的网站是:中国天气网http://www.weather.com.cn/textFC/hb.shtml#。我们做任何爬虫之前,都需要对这个网站进行详细的分析,一定要达到了如指掌的境地。不然后面很容易在数据过滤的时候会出现一个问题,这也是所有做爬虫需要注意的地方。我们这里就跟大家分析一下中国天气网的网站:

  1. 在以上这个中国天气网的页面中。我们可以看到,他是通过区域的方式把全国个大省份和城市进行区分的,有:华北、东北、华东、华中、华南、西北、西南、港澳台。在每个区域下面,都是通过表格的形式把属于该区域下的所有省份以及城市的天气信息列出来。因此我们要做的是,首先找到所有的区域的链接,然后再在每个区域的链接下把这个区域下的所有的城市天气信息爬出来就可以了。


    1.png
  2. 我们已经知道只要拿到了所有的区域链接,就可以在这个链接的网页中把这些城市拿到。那么如何去拿到这个区域下对应的所有城市以及他们对应的天气信息呢?这时候就需要去解析源代码了,我们点击这个页面任何一个地方,然后右键点击审查元素,打开控制台后,去寻找规则(因为这个寻找规则比较繁琐,这里就做个简单概述,如果对如何去找到相应的元素感兴趣,可以关注本公众号,会有一套详细的视频教程免费教大家查找)。我们可以看到,一个省份的城市及其天气信息,都是放在一个叫做<div class='conMidtab2'>的盒子中。因此我们只要找到所有的conMidtab2盒子,就找到了所有的城市。但是这个地方需要注意的是,因为在一个页面中,展示了7天的数据,因此如果你按照class='conMidtab2'这个规则去寻找的话,会得到从今天往后延7天的所有数据。这时候我们就要换一个规则了,我们经过分析(具体分析过程可以看本教程视频内容)发现一天的天气信息,是放在一个class='conMidtab'的这样一个盒子中。因此我们只要把第一个conMidtab盒子拿到,就可以拿到今天的天气数据而把其他日期的数据给过滤掉。这里要给大家上一份源代码了:

    # find方法,只会返回第一个满足条件的元素,也即只把第一个conMidtab返回回来,把今天的数据返回回来
    conMidtab = soup.find('div', class_='conMidtab')
    # 通过得到的这个conMidtab,我们再调用find_all方法,把这个conMidtab元素下的所有conMidtab2盒子找到,得到这一天中这个区域下所有的城市
    conMidtab2_list = conMidtab.find_all('div', class_='conMidtab2')

    也上一份图片给大家分析一下:


    2.png
  3. 我们已经分析好了如何获取城市的盒子,那么接下来就是去获取城市的天气信息了。我们继续分析(具体分析过程可以看本视频教程)后发现,在table中,前面两个tr是表头,知识用来解释数据的,我们不需要,那么真正有用的数据是从第三个tr开始的。并且第三个tr的第1个td展示的是该省或者直辖市的名称,从第二个td开始才是真正展示该省份下这个城市的详细天气情况了,这里上一张图片分析一下:


    3.png

    并且,从第四个tr开始,下面的td全部展示的就是这个城市的信息了,而不包括省份的信息了,这里也用一张图片来说明这个问题:


    4.png

    所以综合以上的分析,我们就知道,省份名称是存储在table下的第三个tr下的第0个td下,而城市名字则要进行判断,如果是第三个tr,那么就是在第二个td,如果是从第四个开始,那么就是存储在第0个td下。而最高气温也要区分,第三个tr,存储在第5个td下,从第四个tr开始,则存储在第4个td下,那么我们也可以上一份源代码,看看如何获取的:

    conMidtab = soup.find('div', class_='conMidtab')
    conMidtab2_list = conMidtab.find_all('div', class_='conMidtab2')
    for x in conMidtab2_list:
        tr_list = x.find_all('tr')[2:]
        province = ''
        for index, tr in enumerate(tr_list):
            # 如果是第0个tr标签,那么城市名和省份名是放在一起的
            min = 0
            if index == 0:
                td_list = tr.find_all('td')
                province = td_list[0].text.replace('\n', '')
                city = td_list[1].text.replace('\n', '')
                max = td_list[5].text.replace('\n', '')
            else:
                # 如果不是第0个tr标签,那么在这个tr标签中只存放城市名
                td_list = tr.find_all('td')
                city = td_list[0].text.replace('\n', '')
                max = td_list[4].text.replace('\n', '')
    
            TEMPERATURE_LIST.append({
                'city': province+city,
                'min': min
            })
数据显示:

如果把所有数据都爬下来后,那么我们可以使用echarts-python把数据进行可视化,这部分内容比较简单,我就直接把我做的可视化的数据图给大家看下,具体的实现方式,大家可以观看我的视频教程,讲解非常详细:


5.jpg
写在最后:

以上是对中国天气网爬虫和数据可视化的分析,爬虫虽然简单,但也是五脏俱全,囊括了爬虫逻辑的方方面面,并且在最后还把爬取出来的数据进行了可视化,使我们爬取出来的数据有用武之地。另外,因为本教程是通过文字的形式进行传递的,要描述整个过程实在有点太难。如果还没看懂的或者是想进一步了解具体爬虫的细节的,可以看下以下课程:零基础:21天搞定Python分布式爬虫

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>好的,我现在需要帮助用户确定一个TIFF文件是否包含热红外数据,并指导如何在ERDAS中进行辐射校正和数据分析。首先,我得回想一下用户之前的问题和之前的回答,确保信息连贯。用户之前询问过ERDAS中的辐射校正功能,特别是增益和偏移量的使用,现在转向了如何判断TIFF是否为热红外数据以及相关分析方法。 首先,用户的问题分为两部分:确定TIFF是否包含热红外数据,以及在ERDAS中处理热红外数据的步骤。我需要结合之前的回答,尤其是关于辐射校正的部分,以及引用中的信息。比如,之前提到过热红外波段需要特殊处理,比如使用普朗克公式进行温度转换,这可能需要在分析时注意。 接下来,确定TIFF是否包含热红外数据的方法。根据遥感数据的一般知识,热红外数据通常位于特定的波长范围,比如10-12微米。用户可能需要检查元数据或波段信息来判断。如果TIFF文件有头文件或元数据,比如Landsat的MTL文件,里面可能会明确说明波段类型。例如,Landsat的热红外波段通常是第10或11波段。如果用户只有TIFF文件而没有元数据,可能需要通过波长信息或统计特征来推断。 在ERDAS中查看波段信息的话,可能需要使用Layer Info或元数据查看器。此外,用户可能需要查看像元值的范围,因为热红外数据通常以辐射亮度或亮度温度表示,数值范围可能与可见光或近红外不同。例如,亮度温度可能在280-320K之间,而辐射亮度的单位是W/(m²·sr·μm)。 然后,分析热红外数据的步骤。在ERDAS中进行辐射校正时,用户需要确保输入正确的增益和偏移量,这些参数可能在元数据中提供。辐射校正后,可能需要将辐射亮度转换为温度,这涉及到普朗克公式或传感器特定的参数,如Landsat使用的公式。此外,用户可能需要处理地表发射率的影响,这可能需要额外的数据或假设。 需要注意的是,用户可能在操作过程中遇到问题,比如参数输入错误、单位转换错误,或者温度反演公式的应用。因此,在回答中应包含验证步骤,比如检查典型地物的温度范围是否合理,或者对比已知数据。 此外,用户提到的ERDAS辐射校正功能的位置和参数输入步骤之前已经回答过,这里需要再次强调针对热红外的特殊处理,比如勾选热红外选项,或使用不同的校正参数。可能还需要指导用户如何在ERDAS中应用温度转换工具,或者是否需要使用其他模块。 最后,确保回答结构清晰,分步骤说明,并包含常见问题处理,比如如何应对负值或异常温度结果。同时,引用之前提到的参考文献,如[^1]中的辐射校正步骤,以及元数据的重要性。</think>--- ### **一、判断TIFF文件是否包含热红外数据的步骤** #### **1. 元数据检查** - **头文件/元数据文件** - 若TIFF文件附带 `.xml`、`.MTL` 或 `.hdr` 等元数据文件,直接查看波段描述: - 热红外波段通常标注为 **Thermal Infrared (TIR)** 或 **Band 10/11**(Landsat系列) - 波长范围:热红外波段中心波长一般为 $10-12 \, \mu m$[^1] ```xml <!-- Landsat 8 MTL文件示例 --> <LANDSAT_METADATA_FILE> <PRODUCT_CONTENTS> <BAND_NAME>BAND_10</BAND_NAME> <WAVELENGTH>10.9</WAVELENGTH> <!-- 单位为μm --> </PRODUCT_CONTENTS> </LANDSAT_METADATA_FILE> ``` - **无元数据时** - 使用 **ERDAS Metadata Tool**: - 打开TIFF文件后,右键选择 `Layer Info` > `Metadata`,检查 `Wavelength` 或 `Band Type` 字段 - 若元数据缺失,通过 **统计特征** 辅助判断: - 热红外数据像元值范围较小(通常为 $280-320 \, K$ 或辐射亮度值 $0-20 \, W/(m^2 \cdot sr \cdot \mu m)$) --- ### **二、在ERDAS中查看热红外数据内容** #### **1. 基础查看方法** - **光谱曲线分析** - 步骤:`Interpreter` > `Spectral Analysis` > `Spectral Profile` - 热红外波段的光谱曲线与可见光波段差异显著(例如:水体在热红外波段表现为低温低辐射值,沥青路面表现为高温高辐射值)[^1] - **伪彩色合成** - 将热红外波段单独赋予红、绿、蓝通道,观察地表温度分布特征(高温区域显示为亮红色) #### **2. 数值验证** - **光标查询工具** - 使用 `Inquire Cursor` 工具点击典型地物(如水体、裸土、建筑物屋顶),检查数值范围: - 未定标的原始DN值:通常为整数(如 Landsat 热红外波段 DN 值范围 $0-65535$) - 辐射定标后:亮度温度范围 $280-320 \, K$ 或辐射亮度值 $1-15 \, W/(m^2 \cdot sr \cdot \mu m)$[^1] --- ### **三、ERDAS热红外数据分析流程** #### **1. 辐射定标(转换为辐射亮度)** - 操作路径:`Interpreter` > `Radiometric Correction` > `Landsat TM/ETM+` 或 `Generic Sensor` - 输入热红外波段对应的增益(Gain)和偏移量(Offset) - 公式: $$ L_{\lambda} = Gain \times DN + Offset $$ (示例:Landsat 8 Band 10的典型增益为 $3.3420 \times 10^{-4} \, W/(m^2 \cdot sr \cdot \mu m)/DN$,偏移量 $0.1 \, W/(m^2 \cdot sr \cdot \mu m)$) #### **2. 温度反演(转换为地表温度)** - **使用Planck公式** - ERDAS内置工具:`Interpreter` > `Thermal Infrared` > `Brightness Temperature` - 输入参数: - 传感器特定参数(如Landsat的 $K1$ 和 $K2$ 常量) - 公式: $$ T = \frac{K2}{\ln\left(\frac{K1}{L_{\lambda}} + 1\right)} $$ (Landsat 8 Band 10的 $K1=774.89 \, W/(m^2 \cdot sr \cdot \mu m)$,$K2=1321.08 \, K$) - **地表发射率校正**(可选) - 通过NDVI估算发射率,使用 `Spatial Modeler` 构建自定义公式: $$ LST = \frac{T}{1 + (\lambda \cdot T / \rho) \ln \epsilon} $$ ($\lambda$ 为波长,$\rho=1.438 \times 10^{-2} \, m \cdot K$,$\epsilon$ 为发射率) --- ### **四、注意事项与验证** 1. **数据单位一致性** - 确认辐射亮度单位为 $W/(m^2 \cdot sr \cdot \mu m)$,温度单位为开尔文($K$) 2. **异常值处理** - 若出现负温度值:检查增益/偏移量是否输入错误,或原始数据存在噪声(可通过 `Mask` 工具过滤) 3. **地物温度合理性验证** - 水体日间温度:$290-300 \, K$ - 植被覆盖区:$300-310 \, K$ - 城市建筑表面:$310-320 \, K$ --- ### **操作示例(ERDAS 热红外温度反演)** ```python # 伪代码:温度反演逻辑 def brightness_temperature(L_lambda, K1, K2): return K2 / np.log(K1 / L_lambda + 1) # Landsat 8 Band 10示例 L_lambda = 10.0 # 辐射亮度值 (W/(m²·sr·μm)) K1 = 774.89 K2 = 1321.08 T = brightness_temperature(L_lambda, K1, K2) # 输出约 300 K ``` --- ### **相关问题** 1. 如何从Landsat MTL文件中提取热红外波段的 $K1$ 和 $K2$ 常量? 2. ERDAS中如何批量处理多景热红外影像的温度反演? 3. 热红外数据的大气校正方法与可见光波段有何区别?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南窗客斯黄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值