bs4库爬取天气预报
Python不仅用于网站开发,数据分析,图像处理,也常用于爬虫技术方向,最近学习了解下,爬虫技术入门一般先使用bs4库,爬取天气预报简单尝试下。
第一步:首先选定目标网站地址
网上查询,天气预报准确率高的官网是“天气网”,网址:http://www.weather.com.cn/
第二步:确定爬取目标数据
本次只是简单学习尝试下。
1,爬取-今天-天气预报(天气情况,最高温度,最低温度);
2,爬取-近7天-天气预报(日期,天气,温度,风力);


第三步:确定爬取目标数据网页元素定位
例如:今天-最高温度,页面元素定位,使用浏览器开发调试功能,按 F12 进入。
调试界面左上角箭头点击进入选择元素模式,然后从页面中选择需要查看的元素,然后可以在开发者工具元素(Elements)一栏中定位到该元素源代码的具体位置 。
查看元素属性:可从被定位的源码中查看部分,如class、src,也可在右边的侧栏中查看全部的属性,如下图位置查看

根据页面元素层级关系,确定bs4库的BeautifulSoup选择元素位置,根据元素标签,属性,层级递减,最后确定目标元素位置即可。
# 最高气温-元素位置如下:
soup.select("div.t >ul.clearfix > li > p.tem")
以此类推,确定所有需要爬取的目标元素位置。
第四步:完成代码编写
requests_bs4.py :
# -*- coding: UTF-8 -*-
# 爬取静态网页工具
import requests
import time
import re
from bs4 import BeautifulSoup
import randomdef get_html_text(url):'''@方法名称: 获取网页的html信息@中文注释: 获取网页的html信息,转换成字符串格式数据@入参:@param url str 网址@出参:@返回状态:@return 0 失败或异常@return 1 成功@返回错误码@返回错误信息@param rsp_text str 网页html信息@作 者: PandaCode辉@创建时间: 2023-09-05@使用范例: get_html_text('https://www.baidu.com/')'''try:if (not type(url) is str):return [0, "111111", "网址参数类型错误,不为字符串", [None]]# 浏览器用户信息列表user_agents = ['Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11','Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0','Opera/9.25 (Windows NT 5.1; U; en)','Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)','Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.5 (like Gecko) (Kubuntu)','Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.12) Gecko/20070731 Ubuntu/dapper-security Firefox/1.5.0.12','Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/1.2.9','Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.7 (KHTML, like Gecko) Ubuntu/11.04 Chromium/16.0.912.77 Chrome/16.0.912.77 Safari/535.7','Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:10.0) Gecko/20100101 Firefox/10.0',]# 随机获取一个浏览器用户信息agent = random.choice(user_agents)# header头信息headers = {'User-Agent': agent,'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3','Accept-Encoding': 'gzip, deflate','Connection': 'keep-alive','Cache-Control': 'max-age=0',}# 代理IP地址,需要找到可用的代理ip,不然无法使用# proxy = {'HTTP': 'xx.xx.xx.xx:8000', 'HTTPS': 'xx.xx.xx.xx:80'}# response = requests.get(url, headers=headers, proxies=proxy, timeout=30)# 增加随机模拟浏览器访问header头信息,提高反爬网站成功率response = requests.get(url, headers=headers, timeout=30)# print(response.status_code)response.raise_for_status()response.encoding = 'utf-8'rsp_text = response.text# 返回容器return [1, '000000', '获取网页的html信息成功', [rsp_text]]except Exception as e:print("获取网页的html信息异常," + str(e))return [0, '999999', "获取网页的html信息异常," + str(e), [None]]def spider_weather(region_code, tqyb_type):'''@方法名称: 爬取天气预报信息@中文注释: 根据地区代码,天气预报类型,爬取天气预报信息@入参:@param region_code str 地区代码@param tqyb_type str 类型(1-今天,2-近7天)@出参:@返回状态:@return 0 失败或异常@return 1 成功@返回错误码@返回错误信息@param rsp_dict dict 响应容器@作 者: PandaCode辉@创建时间: 2023-09-05@使用范例: spider_weather('101010100','1')天气预报网址http://www.weather.com.cn/weather/101010100.shtml --北京市,近7日天气http://www.weather.com.cn/weather1d/101010100.shtml --北京市,今天天气'''try:if (not type(region_code) is str):return [0, "111111", "地区代码参数类型错误,不为字符串", [None]]if (not type(tqyb_type) is str):return [0, "111112", "类型参数类型错误,不为字符串", [None]]url = ""# 类型(1-今天,2-近7天)if tqyb_type == '1':url = 'http://www.weather.com.cn/weather1d/' + region_code + '.shtml'elif tqyb_type == '2':url = 'http://www.weather.com.cn/weather/' + region_code + '.shtml'# UTC格式当前时区时间t = time.localtime()work_time = time.strftime("%Y-%m-%d %H:%M:%S", t)print('当前日期时间:' + str(work_time))now_day = str(work_time)[:7]# 根据url地址获取网页信息rst = get_html_text(url)if rst[0] != 1:return rsthtml_str = rst[3][0]# 使用BeautifulSoup解析网页数据soup = BeautifulSoup(html_str, "html.parser")# 返回容器初始化rsp_dict = {}# 类型(1-今天,2-近7天)if tqyb_type == '1':# 获取今天天气信息# 白天,天气情况tq_day_info = soup.select("div.t >ul.clearfix > li > p.wea")[0].textrsp_dict["tq_day_info"] = '白天,天气情况:' + tq_day_infoprint(rsp_dict["tq_day_info"])# 最高温度temperatrue_high = soup.select("div.t >ul.clearfix > li > p.tem")[0].text# 去除换行符temperatrue_high = ''.join(re.findall(r'\S', temperatrue_high))rsp_dict["temperatrue_high"] = '白天,最高温度:' + temperatrue_highprint(rsp_dict["temperatrue_high"])# 夜间,天气情况tq_night_info = soup.select("div.t >ul.clearfix > li > p.wea")[1].textrsp_dict["tq_night_info"] = '夜间,天气情况:' + tq_night_infoprint(rsp_dict["tq_night_info"])# 夜间,最低温度temperatrue_low = soup.select("div.t >ul.clearfix > li > p.tem")[1].text# 去除换行符temperatrue_low = ''.join(re.findall(r'\S', temperatrue_low))rsp_dict["temperatrue_low"] = '夜间,最低温度:' + temperatrue_lowprint(rsp_dict["temperatrue_low"])print('===============================')elif tqyb_type == '2':# 获取近7日天气rsp_dict["c7day_list"] = []# 日期day_info = soup.select("div.c7d > input > input > input > ul.t.clearfix > li > h1")# print('日期:' + str(day_info))# 天气tq_info = soup.select("div.c7d > input > input > input > ul.t.clearfix > li > p.wea")# print('天气:' + str(tq_info))# 温度tem_info = soup.select("div.c7d > input > input > input > ul.t.clearfix > li > p.tem")# print('温度:' + str(tem_info))# 风力win_info = soup.select("div.c7d > input > input > input > ul.t.clearfix > li > p.win > i")# print('风力:' + str(win_info))# 列表存储for i in range(7):temp_dict = {}# 日期temp_dict["day_info"] = '日期:' + now_day + '-' + str(day_info[i].text)print(temp_dict["day_info"])# 天气temp_dict["tq_info"] = '天气:' + str(tq_info[i].text)print(temp_dict["tq_info"])# 温度# 去除换行符temperatrue = ''.join(re.findall(r'\S', str(tem_info[i].text)))temp_dict["tem_info"] = '温度:' + temperatrueprint(temp_dict["tem_info"])# 风力temp_dict["win_info"] = '风力:' + str(win_info[i].text)print(temp_dict["win_info"])# 添加到列表rsp_dict["c7day_list"].append(temp_dict)print('===============================')# 返回容器return [1, '000000', '爬取天气预报信息成功', [rsp_dict]]except Exception as e:print("爬取天气预报信息异常," + str(e))return [0, '999999', "爬取天气预报信息异常," + str(e), [None]]# 主方法
if __name__ == '__main__':# 101010100 - 北京市# 爬取天气预报-今天rst1 = spider_weather('101010100', '1')rsp_dict1 = rst1[3][0]print(rsp_dict1)# 爬取天气预报-近7天rst2 = spider_weather('101010100', '2')rsp_dict2 = rst2[3][0]print(rsp_dict2)

相关文章:
bs4库爬取天气预报
Python不仅用于网站开发,数据分析,图像处理,也常用于爬虫技术方向,最近学习了解下,爬虫技术入门一般先使用bs4库,爬取天气预报简单尝试下。 第一步:首先选定目标网站地址 网上查询,…...
l8-d8 TCP并发实现
一、TCP多进程并发 1.地址快速重用 先退出服务端,后退出客户端,则服务端会出现以下错误: 地址仍在使用中 解决方法: /*地址快速重用*/ int flag1,len sizeof (int); if ( setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &a…...
编写中间件以用于 Express 应用程序
概述 中间件函数能够访问请求对象 (req)、响应对象 (res) 以及应用程序的请求/响应循环中的下一个中间件函数。下一个中间件函数通常由名为 next 的变量来表示。 中间件函数可以执行以下任务: 执行任何代码。对请求和响应对象进行更改。结束请求/响应循环。调用堆…...
【2023年数学建模国赛】D题解题思路
2023年数学建模国赛D题解题思路 为了解决问题1、问题2和问题3,我们可以采用动态规划方法来制定生产计划,考虑了不确定性因素和多种可能情况的预案集。首先,我们需要定义一些变量和符号: T T T:总的养殖周期࿰…...
python爬虫之正则表达式学习
网络安全离不开脚本和工具的开发,python很多又需要正则表达式。 这是一个很好的学习正则表达式的项目 https://github.com/ziishaned/learn-regex/blob/master/translations/README-cn.md 基本匹配 正则表达式其实就是在执行搜索时的格式,它由一些字…...
智慧能源方案:TSINGSEE青犀AI算法中台在能源行业的应用
一、方案背景 互联网、物联网、人工智能等新一代信息技术引领新一轮产业革命,加快能源革命步伐。尤其是随着人工智能技术的不断发展,AI智能检测与识别技术在能源行业的应用也越来越广泛。与此同时,国家出台多项政策,将智慧能源纳…...
达梦数据库awr报告收集
1、找出快照点snap_id与时间的对应关系 SYS.WRM$_SNAPSHOT表中记录了快照点snap_id与时间的对应关系 例如如下语句可以得出2023-09-04这一天各个时间点对应的快照点snap_id select snap_id,end_interval_time from SYS.WRM$_SNAPSHOT where end_interval_time between to…...
c语言练习43:深入理解strcmp
深入理解strcmp strcmp的主要功能是用来比较两个字符串 模拟实现strcmp 比较两个字符串对应位置上的大小 按字典序进行比较 例如: 输入:abc abc 输出:0 输入:abc ab 输出:>0的数 输入:ab abc …...
NUC980webServer开发
目录 1.RTL8189FTV驱动移植 2.wifi配置工具hostapd移植 1.openssl-1.0.2r交叉编译 2.libnl-3.2.25.tar.gz交叉编译 3.hostapd-2.9.tar.gz交叉编译 4.移植相关工具到开发板 1.RTL8189FTV驱动移植 1. 把驱动文件源码放在linux源码的drivers/net/wireless/realtek/rtlwifi/目录…...
驱动开发--day2
实现三盏灯的控制,编写应用程序测试 head.h #ifndef __HEAD_H__ #define __HEAD_H__#define LED1_MODER 0X50006000 #define LED1_ODR 0X50006014 #define LED1_RCC 0X50000A28#define LED2_MODER 0X50007000 #define LED2_ODR 0X50007014#endif mychrdev.c #inc…...
用户促活留存新方式——在APP中嵌入小游戏
随着APP同类产品的不断出现,APP开发者们面临着激烈的竞争,很多APP下载后被新的APP取代,获客成本越来越高。同时开发者还会面临用户粘性差、忠诚度低、用完即走、留存困难,商业化价值被大大缩减。 在APP中植入小游戏来提高用户活跃…...
MySQL 8.0.34(x64)安装笔记
一、背景 从MySQL 5.6到5.7,再到8.0,版本的跳跃不可谓不大。安装、配置的差别也不可谓不大,特此备忘。 二、过程 (1)获取MySQL 8.0社区版(MySQL Community Server) 从 官网 字样 “MySQL …...
物流供应商实现供应链自动化的3种方法
当前影响供应链的全球性问题(如新冠肺炎疫情)正在推动许多物流供应商重新评估和简化其流程。运输协调中的摩擦只会加剧供应商无法控制的现有延误和风险。值得庆幸的是,供应链专业人员可以通过端到端的供应链自动化消除延迟,简化与合作伙伴的沟通…...
Mysql更新时间列只改日期为指定日期不更改时间
场景 Mysql分表后同结构不同名称表之间复制数据以及Update语句只更新日期加减不更改时间: Mysql分表后同结构不同名称表之间复制数据以及Update语句只更新日期加减不更改时间_霸道流氓气质的博客-CSDN博客 上面通过如下方式实现日期列增加指定天数。 UPDATE bus…...
实时测试工具 Visual Studio 扩展 NCrunch 4.18 Crack
NCrunch Visual Studio 扩展 .NET 的终极实时测试工具 在编码时查看实时测试结果和内联指标。 下载v4.18 发布于 2023 年 7 月 17 日 跳过视频至: 代码覆盖率 指标 分布式处理 配置 发动机模式 Visual Studio 自动并发测试 NCrunch 是一个完全自动化的测试扩展&a…...
Neo4j 基本语法
一、基本语法 1、新建节点 (1)基本语法: () 代表节点 示例: CREATE (u:User {uid:970939424 }) // 节点类型为User,属性值为uid970939424CREATE (u:Round {rid:7194842697444819113 }) // 节点类型为Rou…...
docker常见面试题
1.什么是docker docker是一个容器化平台,类似于一个集装箱,集装箱与集装箱之间互不影响,docker平台就是一个软件集装箱平台,我们可以构建应用程序,将其所有的依赖打包到一个容器中,然后就很方便的可以在其…...
静态路由:配置和使用详解
文章目录 一、静态路由的配置和使用详解1. 配置要点1.1 点到点接口配置1.2 以太网接口配置 2. 默认路由3. 静态路由的配置命令4. 静态路由实现路由备份和负载分担 二、静态路由的优先级和比较1. 静态路由的优先级设置2. 静态路由与动态路由的比较2.1 静态路由优缺点2.2 动态路由…...
玩转Mysql系列 - 第15篇:详解视图
这是Mysql系列第15篇。 环境:mysql5.7.25,cmd命令中进行演示。 需求背景 电商公司领导说:给我统计一下:当月订单总金额、订单量、男女订单占比等信息,我们啪啦啪啦写了一堆很复杂的sql,然后发给领导。 …...
0065__git fetch, git pull, git merge, git rebase
git fetch, git pull, git merge, git rebase_git pull和merge_送你一朵小莲花的博客-CSDN博客...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
