【Python爬虫实战入门】:全球天气信息爬取

news2025/1/12 10:57:02

文章目录

      • 一、爬取需求
      • 二、所需第三方库
        • 2.1 简介
      • 三、实战案例
      • 四、完整代码

一、爬取需求

目标网站http://www.weather.com.cn/textFC/hb.shtml
需求:爬取全国的天气(获取城市以及最低气温)
目标urlhttp://www.weather.com.cn/textFC/hz.shtml

二、所需第三方库

requests
BeautifulSoup4

安装

requestspip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple some-package
BeautifulSoup4pip install BeautifulSoup4 -i https://pypi.tuna.tsinghua.edu.cn/simple some-package

2.1 简介

requests模块

官方文档https://requests.readthedocs.io/projects/cn/zh-cn/latest/
requests 是 Python 编程语言中一个常用的第三方库,它可以帮助我们向 HTTP 服务器发送各种类型的请求,并处理响应。

  • 向 Web 服务器发送 GET、POST 等请求方法;
  • 在请求中添加自定义标头(headers)、URL 参数、请求体等;
  • 自动处理 cookies;
  • 返回响应内容,并对其进行解码;
  • 处理重定向和跳转等操作;
  • 检查响应状态码以及请求所消耗的时间等信息。

BeautifulSoup4模块

官方文档https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/
Beautiful Soup 是一个 可以从 HTML 或 XML 文件中提取数据的 Python 库。它能用你喜欢的解析器和习惯的方式实现 文档树的导航、查找、和修改。

下表描述了几种解析器的优缺点:
在这里插入图片描述
注意:如果一段文档格式不标准,那么在不同解析器生成的 Beautiful Soup 数可能不一样。 查看 解析器之间的区别 了解更多细节。

数据提取之CSS选择器

  • 熟悉前端的同学对 css 选择器一定不会陌生,比如 jquery 中通过各种 css 选择器语法进行 DOM 操作等
  • 学习网站http://www.w3cmap.com/cssref/css-selectors.html

在爬虫中使用css选择器,代码教程

>>> from requests_html import session

# 返回一个Response对象
>>> r = session.get('https://python.org/')

# 获取所有链接
>>> r.html.links
{'/users/membership/', '/about/gettingstarted/'}

# 使用css选择器的方式获取某个元素
>>> about = r.html.find('#about')[0]

>>> print(about.text)
About
Applications
Quotes
Getting Started
Help
Python Brochure

三、实战案例

目标网站:http://www.weather.com.cn/textFC/hb.shtml

思路分析:

  1. 通过find方法,定位的div class=conMidtab2
  2. 通过find_all方法,找所有的tr标签

函数功能

  1. 得到网页源码
  2. 解析数据
  3. 保存数据
  4. 主函数

程序框架

import requests
from bs4 import BeautifulSoup
# 获取网页源码
def get_html():
    pass
# 解析数据
def parse_html():
    pass
# 保存数据
def save_data():
    pass
# 主函数
def main():
    pass

获取网页源码
在主函数中进行传参调用

# 获取网页源码
def get_html(url):
    html = requests.get(url)
    html.encoding = 'utf-8'
    # print(html.text)
    return html.text

# 主函数
def main():
    url = 'http://www.weather.com.cn/textFC/hz.shtml'
    html = get_html(url)
main()

解析数据
get_html函数的返回值(网页源码)作为参数传给parse_html函数

# 主函数
def main():
    url = 'http://www.weather.com.cn/textFC/hz.shtml'
    html = get_html(url)
    parse_html(html)
main()

对于parse_html函数,要将传入的网页源码进行解析,获取我们想要的数据。
在这里插入图片描述
通过观察元素,每一个class="conMidtab2"的div标签就代表一个省份,那么他的父级元素class="conMidtab"的div标签就包含三个省份的天气信息,了解了这些,剩下的我们只需要根据元素之间的关系,一步步提取我们想要的数据即可。

# 解析数据
def parse_html(html):
    # 创建对象
    soup = BeautifulSoup(html, 'lxml')
    conMidtab = soup.find('div', class_="conMidtab")
    tables = conMidtab.find_all('table')
    # print(tables)
    for table in tables:
        trs = table.find_all('tr')[2:]
        # print(trs)
        for index, tr in enumerate(trs):
            tds = tr.find_all('td')
            # print(tds)
            city = list(tds[1].stripped_strings)[0]  # 城市
            temp = tds[-2].string  # 最低气温
            print(city, temp)
        break

在这里插入图片描述
但是,这里出现了一个问题,那就是我们要打印城市信息的时候,只能打印出第一个城市,后面的城市无法打印出来,通过查看元素后我们会发现,除了第一个城市是在第二个td标签里面,其余城市都在第一个td标签里面,所以在这里我们要将循环改一下,同时还要加一个判断,只要是第一个城市就去第二个td标签,其余的取第一个td标签
在这里插入图片描述
想要实现这种效果,我们就要用到一个函数enumerate,这个函数可以将下标和下标对应的值给显示出来。

# 解析数据
def parse_html(html):
    # 创建对象
    soup = BeautifulSoup(html, 'lxml')
    conMidtab = soup.find('div', class_="conMidtab")
    tables = conMidtab.find_all('table')
    # print(tables)
    for table in tables:
        trs = table.find_all('tr')[2:]
        # print(trs)
        for index, tr in enumerate(trs):
            tds = tr.find_all('td')
            # print(tds)
            if index == 0:  # 第一个城市取第二个td标签
                city = list(tds[1].stripped_strings)[0]  # 城市
            else:  # 其余的取第一个td标签
                city = list(tds[0].stripped_strings)[0]  # 城市
            temp = tds[-2].string  # 最低气温
            print(city, temp)

在这里插入图片描述
更换url查看数据信息
在主函数里面去更换url,然后查看打印的数据信息是否正确。运行后发现前面的都是正确的,直到更换到港澳台1地区时就出现了问题。

# 主函数
def main():
    # url = 'http://www.weather.com.cn/textFC/hz.shtml'  # 华中地区
    # url = 'http://www.weather.com.cn/textFC/hb.shtml'  # 华北地区
    url = 'http://www.weather.com.cn/textFC/gat.shtml'  # 港澳台地区
    html = get_html(url)
    parse_html(html)
main()

在这里插入图片描述
在这里插入图片描述
我们发现,我们无法在元素中发现问题,那么我们现在就应该查看一下网页源代码。
在这里插入图片描述
查看网页源代码之后可以发现,他所在的table标签是没有结束标签的,后面的城市的table标签也没有结束标签,这也就导致了数据混乱。
想要解决这个问题,就需要更换一下解析器。上面在提到BeautifulSoup4时的解析器,我们发现html5lib这个解析器拥有最好的容错性。
在这里插入图片描述
下载pip install html5lib

# 解析数据
def parse_html(html):
    # 创建对象
    soup = BeautifulSoup(html, 'html5lib')  # 将lxml换成html5lib
    conMidtab = soup.find('div', class_="conMidtab")
    tables = conMidtab.find_all('table')
    # print(tables)
    for table in tables:
        trs = table.find_all('tr')[2:]
        # print(trs)
        for index, tr in enumerate(trs):
            tds = tr.find_all('td')
            # print(tds)
            if index == 0:  # 第一个城市取第二个td标签
                city = list(tds[1].stripped_strings)[0]  # 城市
            else:  # 其余的取第一个td标签
                city = list(tds[0].stripped_strings)[0]  # 城市
            temp = tds[-2].string  # 最低气温
            print(city, temp)

在这里插入图片描述
页面切换
要实现页面切换首先我们要观察一下不同页面的url

华北:http://www.weather.com.cn/textFC/hb.shtml
东北:http://www.weather.com.cn/textFC/db.shtml
华南:http://www.weather.com.cn/textFC/hn.shtml
华中:http://www.weather.com.cn/textFC/hz.shtml
港澳台:http://www.weather.com.cn/textFC/gat.shtml

我们发现,这些url的不同之处就在于后面的字母的不同,而这些字母又恰好是地区的首字母,那么我们只需要将这些地区的首字母存入到一个列表当中,循环之后就可以实现页面的切换。

# 主函数
def main():
    district = ['hb', 'db', 'hd', 'hz', 'hn', 'xb', 'xn', 'gat']
    # url = 'http://www.weather.com.cn/textFC/hz.shtml'
    # url = 'http://www.weather.com.cn/textFC/hb.shtml'
    for dist in district:
        url = f'http://www.weather.com.cn/textFC/{dist}.shtml'
        html = get_html(url)
        parse_html(html)
main()

数据保存
定义一个全局变量的列表list_data,在解析数据的第二层循环中定义一个字典,将城市和最低气温添加到字典中去,最后将字典添加到list_data列表中。

# 保存数据
def save_data():
    with open('全国天气.csv', 'w', encoding='utf-8-sig', newline='') as f:
        writer = csv.DictWriter(f, fieldnames=('城市', '最低气温'))
        writer.writeheader()
        writer.writerows(list_data)

在这里插入图片描述

四、完整代码

import requests
from bs4 import BeautifulSoup
import csv


list_data = []
# 获取网页源码
def get_html(url):
    html = requests.get(url)
    html.encoding = 'utf-8'
    # print(html.text)
    return html.text


# 解析数据
def parse_html(html):
    # 创建对象
    soup = BeautifulSoup(html, 'html5lib')  # 将lxml换成html5lib
    conMidtab = soup.find('div', class_="conMidtab")
    tables = conMidtab.find_all('table')
    # print(tables)
    for table in tables:
        trs = table.find_all('tr')[2:]
        # print(trs)
        for index, tr in enumerate(trs):
            dic = {}
            tds = tr.find_all('td')
            # print(tds)
            if index == 0:  # 第一个城市取第二个td标签
                city = list(tds[1].stripped_strings)[0]  # 城市
            else:  # 其余的取第一个td标签
                city = list(tds[0].stripped_strings)[0]  # 城市
            dic['城市'] = city
            temp = tds[-2].string  # 最低气温
            dic['最低气温'] = temp
            list_data.append(dic)


# 保存数据
def save_data():
    with open('全国天气.csv', 'w', encoding='utf-8-sig', newline='') as f:
        writer = csv.DictWriter(f, fieldnames=('城市', '最低气温'))
        writer.writeheader()
        writer.writerows(list_data)


# 主函数
def main():
    district = ['hb', 'db', 'hd', 'hz', 'hn', 'xb', 'xn', 'gat']
    # url = 'http://www.weather.com.cn/textFC/hz.shtml'
    # url = 'http://www.weather.com.cn/textFC/hb.shtml'
    for dist in district:
        url = f'http://www.weather.com.cn/textFC/{dist}.shtml'
        html = get_html(url)
        parse_html(html)
    save_data()  # 数据保存

main()

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

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

相关文章

双热点的王炸组合!损失函数+Attention,精度与速度上实现SOTA!

损失函数注意力机制在深度学习领域是一个热门研究方向,它可以提高模型的性能和泛化能力,帮助我们构建更加精确且高效的模型。 具体来说: 通过结合注意力机制的聚焦能力和损失函数的优化指导,模型能够更精确地捕捉数据中的关键信息…

Vue3基础笔记(4)组件

目录 一.模版引用 二.组件组成 1.引入组件 2.注入组件 3.显示组件 三.组件嵌套关系 四.组件注册方式 五.组件传递数据 六.组件事件 一.模版引用 虽然Vue的声明性渲染模型为你抽象了大部分对DOM的直接操作,但在某些情况下,我们仍然需要直接访问底…

一个新细节,Go 1.17 将允许切片转换为数组指针!

在 Go 语言中,一个切片(slice)包含了对其支持数组的引用,无论这个数组是作为一个独立的变量存在于某个地方,还是仅仅是一个为支持分片而分配的匿名数组。 其切片基本结构都如下: // runtime/slice.go typ…

windows安装ElasticSearch以及踩坑

1.下载 elasticsearch地址:Past Releases of Elastic Stack Software | Elastichttps://www.elastic.co/cn/downloads/past-releases#elasticsearch IK分析器地址:infinilabs/analysis-ik: 🚌 The IK Analysis plugin integrates Lucene IK…

学习R语言第五天

文章目录 语法学习创建数据的方式绘制图形的方式图形添加颜色如何操作数据的方式数据进行验算的判断加付值的方式修改变量名称的方式判断是否存在缺失值在计算的方式忽略缺失值通过函数的方式忽略缺失值日期处理的方式字符串转化成日期的方式格式化数据框中数据返回当前的日期的…

【重磅开源】MapleBoot生成代码工具介绍(单表表格功能)

基于SpringBootVue3开发的轻量级快速开发脚手架 🍁项目简介 一个通用的前、后端项目模板 一个快速开发管理系统的项目 一个可以生成SpringBootVue代码的项目 一个持续迭代的开源项目 一个程序员的心血合集 度过严寒,终有春日&#xff…

【深度学习实战(33)】训练之model.train()和model.eval()

一、model.train(),model.eval()作用? model.train() 和 model.eval() 是 PyTorch 中的两个方法,用于设置模型的训练模式和评估模式。 model.train() 方法将模型设置为训练模式。在训练模式下,模型会启用 dropout 和 batch norm…

SinoDB SQL管理工具之-DBeaver安装使用说明

本文介绍如何使用DBeaver管理工具连接SinoDB数据库。 1. DBeaver下载 下载地址:Download | DBeaver Community 请根据需求选择对应自己操作系统的版本进行下载。本次示例使用Windows 64位操作系统进行安装配置。下载版本为:dbeaver-ce-23.0.2-x86_64-…

什么是SOL链跟单机器人与阻击机器人?

SOL链作为一个快速增长的区块链生态系统,为各种应用程序提供了丰富的发展机会。在SOL链上,智能合约的应用已经开始蓬勃发展,其中包括了许多与加密货币交易相关的应用。在本文中,我们将介绍在SOL链上开发的阻击机器人(S…

42.乐理基础-拍号-看懂拍号的意义

到这必然是已经知道 X、Y的意思了: 然后带入数字: 然后念拍号的时候,在国内,百分之九十的地方是从下往上念,念作四二拍,还有百分之十的地方是和国外一样,从上往下念,念作二四拍&…

DigitalOcean 应用托管平台级更新:应用端到端运行时性能大幅改进

DigitalOcean 希望可以为企业提供所需的工具和基础设施,以帮助企业客户加速云端的开发,实现业务的指数级增长。为此 DigitalOcean 在 2020 年就推出了App Platform。 App Platform(应用托管) 是一个完全托管的 PaaS 解决方案&…

如何自己快速的制作流程图?6个软件教你快速进行流程图制作

如何自己快速的制作流程图?6个软件教你快速进行流程图制作 自己制作流程图可以是项目管理、流程设计或教学展示中的重要环节。以下是六款常用的流程图制作软件,它们都提供了快速、简单的方式来制作流程图: 迅捷画图:这是一款非…

Java基础(三):Java异常机制以及底层实现原理

🌷一、异常 ☘️1.1 什么是异常 Java异常是程序发生错误的一种处理机制,异常的顶级类是Throwable,Throwable字面意思就是可抛出的,该类是所有的错误和异常的超类,只有Throwable类或者Throwable子类的实例对象才可以被…

超详细——集成学习——Adaboost实现多分类——附代码

资料参考 1.【集成学习】boosting与bagging_哔哩哔哩_bilibili 集成学习——boosting与bagging 强学习器:效果好,模型复杂 弱学习器:效果不是很好,模型简单 优点 集成学习通过将多个学习器进行结合,常可获得比单一…

Xinstall广告效果监测,助力广告主优化投放策略

在移动互联网时代,APP推广已成为企业营销的重要手段。然而,如何衡量推广效果,了解用户来源,优化投放策略,一直是广告主和开发者面临的难题。这时,Xinstall作为国内专业的App全渠道统计服务商,以…

TCP四次挥手分析

TCP四次挥手分析 概念过程分析为什么连接的时候是三次握手,关闭的时候却是四次握手?为什么要等待2MSL? 概念 四次挥手即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。 在…

有关string的部分接口

1.迭代器与反向迭代器(iterator-) 迭代器是可以用来访问string里面的内容的,这里来记录一下使用的方法。 里面用到了一个叫做begin函数和一个end函数,这两个都是针对string使用的函数。 s1.begin()函数是指向string内容的第一个元素 而s1.end()指向的则…

「新媒体营销必备」短链接生成,让你的内容更易传播!

在信息大爆炸的今天,无论是企业还是个人都需要有一个快速有效的方式让信息传播。而短链接生成的出现,为我们带来了极大的便利。 C1N短网址(c1n.cn)是一家致力于为用户提供快速、安全的短链接服务的公司。作为专注于短链接的品牌&…

Windows Server 2019虚拟机安装

目录 第一步、准备工作 第二步、部署虚拟机 第三步、 Windows Server 2019系统启动配置 第一步、准备工作 下载Windows Server 2019系统镜像 官网下载地址:Windows Server 2019 | Microsoft Evaluation Center VMware Workstation 17下载地址: 链…

阿里云国际服(alibabacloud)介绍、注册、购买教程?

一、什么是阿里云国际版? 阿里云分为国内版和国际版。国内版仅面向中国大陆客户,国际版面向全球客户。 二、国际版与国内版有何异同? 1)异:除了目标客户不同,运营主体不同,所需遵守的法律与政…