当前位置: 首页 > news >正文

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库,爬取天气预报简单尝试下。 第一步:首先选定目标网站地址 网上查询&#xff0c…...

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:总的养殖周期&#xff0…...

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种方法

当前影响供应链的全球性问题(如新冠肺炎疫情)正在推动许多物流供应商重新评估和简化其流程。运输协调中的摩擦只会加剧供应商无法控制的现有延误和风险。值得庆幸的是,供应链专业人员可以通过端到端的供应链自动化消除延迟,简化与合作伙伴的沟通&#xf…...

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博客...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子&#xff08…...

华为云AI开发平台ModelArts

华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...