python从入门到精通(十八):python爬虫的练习案列集合
python爬虫的练习
- 1.爬取天气网的北京城市历史天气数据
- 1.1 第一种使用面向对象OOP编写爬虫
- 1.2 第二种使用面向过程函数编写爬虫
1.爬取天气网的北京城市历史天气数据
1.1 第一种使用面向对象OOP编写爬虫
import re
import requests
from bs4 import BeautifulSoup
import xlwtclass Spider(object):""" 天气数据爬虫类 """ # 定义类变量,用于正则表达式datatime_pattern = re.compile(r'<div class="th200">(.*?)</div>')wendu_pattern = re.compile(r'<div class="th140">(.*?)</div>')def __init__(self, url, headers, filepath):""" 初始化方法 :param url: 基础URL模板 :param headers: HTTP请求头 :param filepath: 输出文件路径 """ self.url = urlself.headers = headersself.datalist = [] # 存储日期的列表 self.mwen = [] # 存储最高温度的列表 self.iwen = [] # 存储最低温度的列表 self.tq = [] # 存储天气状况的列表 self.fx = [] # 存储风向的列表 self.filepath = filepath def download_page(self,url):""" 下载页面并返回页面内容 :param url: 要下载的页面URL :return: 页面内容或None(如果下载失败)""" try:response = requests.get(url, headers=self.headers)response.raise_for_status() # 如果HTTP请求返回了不成功的状态码,则引发HTTPError异常return response.textexcept requests.RequestException as e:print(f"Error downloading page: {e}")return Nonedef parse_page(self, html):""" 解析页面内容,提取日期和温度数据 :param html: 页面内容 """ soup = BeautifulSoup(html, 'html.parser')# print(soup)for item in soup.find_all('ul', class_='thrui'):item_str = str(item)# print(item)# 使用正则表达式提取日期数据 dates = re.findall(self.datatime_pattern, item_str)self.datalist.extend(dates)# print(dates)# 使用正则表达式提取温度数据 temperatures = re.findall(self.wendu_pattern, item_str)print(temperatures)# 假设每组温度数据包含4个部分:最高温度、最低温度、天气状况、风向 for i in range(0, len(temperatures), 4):self.mwen.append(temperatures[i])self.iwen.append(temperatures[i + 1])self.tq.append(temperatures[i + 2])self.fx.append(temperatures[i + 3])def download_and_parse_all_pages(self):""" 下载并解析所有页面 """ for year in range(23, 24): # 这里设定只是下载2023年的for month in range(1, 2): # 这里设定只是下载2023年的1月的# base_url = self.url page_url = f"{self.url}20{year:02d}{month:02d}.html" # 这里设定不够两位补0print(page_url)html = self.download_page(page_url)# print(html)if html:self.parse_page(html)def save_to_excel(self):""" 将爬取的数据保存到Excel文件中 """ workbook = xlwt.Workbook(encoding='utf-8', style_compression=0)worksheet = workbook.add_sheet('北京历史天气数据', cell_overwrite_ok=True)# 写入表头 columns = ("日期", "最高温度", "最低温度", "天气", "风向")for i, col in enumerate(columns):worksheet.write(0, i, col)# 写入数据 for i in range(len(self.datalist)):worksheet.write(i + 1, 0, self.datalist[i])worksheet.write(i + 1, 1, self.mwen[i])worksheet.write(i + 1, 2, self.iwen[i])worksheet.write(i + 1, 3, self.tq[i])worksheet.write(i + 1, 4, self.fx[i])workbook.save(self.filepath)print(f"Data saved to {self.filepath}")def run(self):self.download_and_parse_all_pages()self.save_to_excel()if __name__ == '__main__':headers = {'User-Agent': 'Mozilla/5.0(compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)'}url_template = "http://lishi.tianqi.com/beijing/"filepath = "beijing_weather_data.xls"spider = Spider(url_template, headers, filepath)spider.run()
1.2 第二种使用面向过程函数编写爬虫
import requests
from bs4 import BeautifulSoup
import re
import xlwtdatatime = re.compile('<div class="th200">(.*?)</div>')
wendu = re.compile('<div class="th140">(.*?)</div>')def down_allpage(url):datalist = []mwen = []iwen = []tq = []fx = []for i in range(23,24):for j in range(1,2):baseurl = url + '20{}{:0>2d}.html'.format(i, j)html = down_page(baseurl)# print(html)soup = BeautifulSoup(html, 'html.parser')for item in soup.find_all('ul',class_='thrui'):# print(item)item = str(item)riqi = re.findall(datatime,item)for item1 in riqi:datalist.append(item1)# print(datalist)zb_all = re.findall(wendu,item)# print(zb_all)for i in range(31):mwen.append(zb_all[i*4+0])iwen.append(zb_all[i*4+1])tq.append(zb_all[i*4+2])fx.append(zb_all[i*4+3])# print(mwen,'\n',iwen,'\n',tq,'\n',fx)return datalist,mwen,iwen,tq,fxdef save_xls(datalist,mwen,iwen,tq,fx):wb = xlwt.Workbook(encoding='utf-8', style_compression=0)ws = wb.add_sheet('天气数据',cell_overwrite_ok=True)col = ("日期","最高温度","最低温度","天气","风向")for i in range(len(col)):ws.write(0,i,col[i])for i in range(len(datalist)):ws.write(i+1,0,datalist[i])for i in range(len(mwen)):ws.write(i+1,1,mwen[i])for i in range(len(iwen)):ws.write(i+1,2,iwen[i])for i in range(len(tq)):ws.write(i+1,3,tq[i])for i in range(len(fx)):ws.write(i+1,4,fx[i])wb.save(r'D:\天气数据.xls')def down_page(url):headers = {'User-Agent': 'Mozilla/5.0(compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)'}r = requests.get(url, headers=headers)html = r.textreturn html# print(html)if __name__ == '__main__':url = 'http://lishi.tianqi.com/beijing/'# down_page(url)down_allpage(url)datalist,mwen,iwen,tq,fx = down_allpage(url)print(datalist)save_xls(datalist,mwen,iwen,tq,fx)
相关文章:
python从入门到精通(十八):python爬虫的练习案列集合
python爬虫的练习 1.爬取天气网的北京城市历史天气数据1.1 第一种使用面向对象OOP编写爬虫1.2 第二种使用面向过程函数编写爬虫 1.爬取天气网的北京城市历史天气数据 1.1 第一种使用面向对象OOP编写爬虫 import re import requests from bs4 import BeautifulSoup import xlw…...
2.12作业
第一题:段错误。 第二题:hello world 第三题:hello 第四题:world 第五题: a: int a; b: int*a; c: int a0;int *p&a;int **q&p; d: int a[10]; e: int *a[10]; …...
树莓派4B(Raspberry Pi 4B) 使用docker搭建单机版nacos
树莓派4B(Raspberry Pi 4B) 使用docker搭建单机版nacos ⚠️ 由于树莓派上的芯片是ARM架构,而官方推出的docker镜像不适用于ARM架构,所以想用树莓派搭建最新版的Nacos服务的小伙伴们可以忽略我这篇文章了。本文基于nacos 2.0.4&am…...
C++入门学习(二十七)跳转语句—continue语句
当在循环中遇到continue语句时,它会跳过当前迭代剩余的代码块,并立即开始下一次迭代。这意味着continue语句用于跳过循环中特定的执行步骤,而不是完全终止循环。 直接看一下下面的代码更清晰: 与上一节的break语句可以做一下对比…...
JPEG图像格式加速神经网络训练--使用DCT训练CNN
JPEG图像格式加速神经网络训练 JPEG图像格式加速神经网络训练工作原理DCT系数与JPEG直接利用DCT系数阶段 1: 数据准备步骤 1: 读取JPEG文件结构步骤 2: 提取量化表和Huffman表步骤 3: 解析图像数据步骤 4: 反量化步骤 5: 获取DCT系数 阶段 2: 输入处理预处理 1: 正规化…...
【代码】Processing笔触手写板笔刷代码合集
代码来源于openprocessing,考虑到国内不是很好访问,我把我找到的比较好的搬运过来! 合集 参考:https://openprocessing.org/sketch/793375 https://github.com/SourceOf0-HTML/processing-p5.js/tree/master 这个可以体验6种笔触…...
Junit常用注解
注解是方法的“标签” 说明每个方法的“职责” Q:总共有那些注解? 参见官方的API文档 0.常用主机及其特点 BeforeClass 只会执行一次必须用static修饰常用来初始化测试需要的变量 Before 会执行多次(只要写一次)在每个Test执行执行之前执行可以和…...
【机器学习】支持向量机(SVM)
支持向量机(SVM) 1 背景信息 分类算法回顾 决策树 样本的属性非数值 目标函数是离散的 贝叶斯学习 样本的属性可以是数值或非数值目标函数是连续的(概率) K-近邻 样本是空间(例如欧氏空间)中的点目标函…...
C语言指针全解
1.什么是指针: 指针是存放地址的地方,是内存中最小单元的地址(编号),内存被分为一个个小的单元格,每一格有一个字节。比如说int a0;a会占据四个字节的大小,每个字节对应单元格都有自…...
rtt设备io框架面向对象学习-看门狗设备
1.看门狗设备基类 / components / drivers / include / drivers /下的watchdog.h 定义了如下看门狗设备基类 struct rt_watchdog_device { struct rt_device parent; const struct rt_watchdog_ops *ops; }; 看门狗设备基类的方法定义如下 struct rt_watchdog_ops { rt_err_…...
加固平板电脑丨三防智能平板丨工业加固平板丨智能城市管理
随着智能城市的不断发展,人们对于城市管理的要求也在不断提高,这就需要高效、智能的城市管理平台来实现。而三防平板就是一款可以满足这一需求的智能设备。 三防平板是一种集防水、防尘、防摔于一体的智能平板电脑,它可以在复杂的环境下稳定运…...
Redis的配置文件
目录 前言: 一、 Units 二、 INCLUDES 三、 NETWORK 3.1 bind 3.2 protected-mode 3.3 port 3.4 tcp-backlog 3.5 timeout 3.6 tcp-keepalive 3.7 示例演示 四、 GENERAL 4.1 daemonize 4.2 pidfile 4.3 loglevel 4.4 logfile 4.5 databases 五、…...
懒人精灵 之 Lua 捕获 json解析异常 ,造成的脚本停止.
Time: 2024年2月8日20:21:17 by:MemoryErHero 1 异常代码 Expected value but found T_END at character 12 异常代码 Expected value but found T_OBJ_END at character 223 处理方案 - 正确 json 示范 while true do--Expected value but found T_END at character 1--Ex…...
Python 列表操作详解
Python 是一种流行的编程语言,它以其简洁的语法和强大的功能而闻名。在 Python 中,列表是一种常用的数据结构,它可以包含任意类型的元素,并且可以随时添加或删除元素。在这篇文章中,我们将详细介绍 Python 列表的一些常…...
【Jenkins】Jenkins关闭Jenkins关闭、重启
目录 一、Jenkins关闭、重启 二、Jenkins服务的启动、停止方法。 一、Jenkins关闭、重启 1.关闭Jenkins 只需要在访问jenkins服务器的网址url地址后加上exit,关闭Jenkins服务。 例如:http://localhost:8081/exit 2.重启Jenkies 只有在Jenkins服务启动…...
【Linux】学习-动静态库
动静态库 头文件与库的区别 头文件一般而言,是声明和宏定义。头文件是在预处理阶段使用的 库文件是已经编译好的二进制代码。是一种目标文件,库文件是在链接阶段使用的 对于头文件和库我们可以这样理解,就是头文件提供的是一个函数的声明&…...
人工智能之数学基础【最小二乘法】
原理 最小二乘法由勒让德(A.M.Legendre)于1805年在其著作《计算彗星轨道的新方法》中提出,主要思想是最小化误差二次方和寻找数据的最佳匹配函数,利用最小二乘法求解未知参数,使得理论值与观测值之差(即误差,或称为残差)的二次方和达到最小,即: E = ∑ i = 1 n ϵ …...
【Java安全】ysoserial-URLDNS链分析
前言 Java安全中经常会提到反序列化,一个将Java对象转换为字节序列传输(或保存)并在接收字节序列后反序列化为Java对象的机制,在传输(或保存)的过程中,恶意攻击者能够将传输的字节序列替换为恶…...
Nginx报错合集(502 Bad Gateway,504 Gateway nginx/1.18.0 (Ubuntu) 等等报错)
1.504 Gateway Time-outnginx/1.18.0 (Ubuntu) 日志报错: 2024/02/11 04:38:54 [error] 564#564: *29 upstream timed out (110: Connection timed out) while reading response header from upstream, client: *******, server: *******, request: "GE…...
Rust开发WASM,WASM Runtime运行
安装wasm runtime curl https://wasmtime.dev/install.sh -sSf | bash 查看wasmtime的安装路径 安装target rustup target add wasm32-wasi 创建测试工程 cargo new wasm_wasi_demo 编译工程 cargo build --target wasm32-wasi 运行 wasmtime ./target/wasm32-wasi/d…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
