数据采集与融合技术实践作业二

news/2024/10/24 20:53:32/文章来源:https://www.cnblogs.com/nchenxi/p/18500442

作业①:7日天气预报爬取

1. 作业代码与实现步骤

我们将在中国气象网爬取北京、上海、广州的7日天气预报,并将数据保存到数据库中。以下是实现步骤。

步骤详解

  1. 打开中国天气网:在浏览器中访问中国天气网。

  2. 搜索城市:输入“北京”并打开其天气页面。

  3. 检查网页结构:使用浏览器的开发者工具(按F12)查看网页的HTML结构。

    • 每天天气信息存放在一个ul元素的li元素中。
    • 日期在li下的h1元素中。
    • 天气状态在li下的class为'wea'p元素文本中。
    • 温度信息在class为'tem'下的p元素中的spani元素中。
  4. 获取城市编码:北京的城市编码为101010100,据此我们再分别获得上海和广州的城市编码,我们将其存储在字典中,以便构造URL使用。

  5. 使用BeautifulSoup进行数据爬取:使用CSS选择器查找HTML元素并提取信息。

代码示例

# 给定城市集的城市ID列表(北京、上海、广州)
cities = {"北京": "101010100","上海": "101020100","广州": "101280101"
}# 爬取每个城市的7日天气数据
for city_name, city_id in cities.items():url = f"http://www.weather.com.cn/weather/{city_id}.shtml"try:headers = {"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; en-US; rv:1.9pre) Gecko/2008072421 Minefield/3.0.2pre"}req = urllib.request.Request(url, headers=headers)data = urllib.request.urlopen(req)data = data.read()dammit = UnicodeDammit(data, ["utf-8", "gbk"])data = dammit.unicode_markupsoup = BeautifulSoup(data, "lxml")# 获取7天天气预报信息lis = soup.select("ul[class='t clearfix'] li")for li in lis:try:date = li.select('h1')[0].text  # 获取日期weather = li.select('p[class="wea"]')[0].text  # 获取天气情况temp_high = li.select('p[class="tem"] span')[0].text if li.select('p[class="tem"] span') else "N/A"temp_low = li.select('p[class="tem"] i')[0].texttemperature = temp_high + "/" + temp_low  # 获取温度(高温/低温)# 打印天气信息print(f"{city_name} - {date}: {weather}, {temperature}")# 将数据插入数据库c.execute("INSERT INTO weather (city, date, weather, temperature) VALUES (%s, %s, %s, %s)",(city_name, date, weather, temperature))conn.commit()# 关闭数据库连接
conn.close()print("所有城市的天气数据已保存到数据库!")

图片展示

打印结果

数据库结果

2. 作业心得

在这个作业中,我深入了解了如何从网页中提取结构化数据。通过分析HTML结构,我能够高效地使用CSS选择器定位所需信息,并将其存储在数据库中。此外,学习到城市编码的管理,使我能够灵活处理不同城市的天气数据。这些知识对我今后的学习与实践都大有裨益。


作业②:股票信息爬取

1. 作业代码与实现步骤

接下来,我们将使用requests和BeautifulSoup库爬取东方财富网的股票相关信息,并将其存储到数据库中。

步骤详解

  1. 选择股票信息网站:以东方财富网为例,访问 东方财富网。
  2. 分析网页结构:打开开发者工具(F12),观察股票列表的加载情况。
  3. 查找数据API:通过网络请求(Network)标签,寻找股票数据的API地址,并分析请求返回的数据格式。
  4. 提取url,获取单页数据:直接通过requests库的get就可以直接加载数据,对应的文件数据如下。通过分析,我们可以得到单只股票的数据都以字符串的形式被存放在“data”下面,而且控制翻页的参数主要是p参数,所以只要用一个page变量来替代页码,构造新的URL,再通过for循环就能实现提取多页数据。

代码示例

def get_html(cmd, page):url = f"https://7.push2.eastmoney.com/api/qt/clist/get?cb=jQuery112409467675731682619_1703939377395&pn={page}&pz=20&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&wbp2u=|0|0|0|web&fid={cmd}&fields=f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f22,f11,f62,f128,f136,f115,f152&_=1703939377396"response = requests.get(url, headers=header)data = response.textleft_data = re.search(r'^.*?(?=\()', data).group()  # Extracting the callback function namedata = re.sub(left_data + '\(', '', data)  # Removing the callback function namedata = re.sub('\);', '', data)  # Removing the endingdata = eval(data)  # Evaluating the string as a Python expressionreturn datacmd = {"沪深京A股": "f3&fs=m:0+t:6,m:0+t:80,m:1+t:2,m:1+t:23,m:0+t:81+s:2048",
}null = "null"
for market, command in cmd.items():page = 0stocks = []while True:page += 1data = get_html(command, page)if data['data'] != null:print(f"正在爬取 {market} 第 {page} 页")df = data['data']['diff']for index in df:# 处理数据,确保插入时不出错#插入的数据会有“-”的出现latest_price = float(index['f2']) if index['f2'] != '-' else None change_rate = float(index['f3']) if index['f3'] != '-' else Nonechange_amount = float(index['f4']) if index['f4'] != '-' else Nonevolume = float(index['f5']) if index['f5'] != '-' else Noneamount = float(index['f6']) if index['f6'] != '-' else Noneamplitude = float(index['f7']) if index['f7'] != '-' else Nonehighest = float(index['f15']) if index['f15'] != '-' else Nonelowest = float(index['f16']) if index['f16'] != '-' else Noneopen_price = float(index['f17']) if index['f17'] != '-' else Noneclose_price = float(index['f18']) if index['f18'] != '-' else Nonevolume_ratio = index['f10'] if index['f10'] != '-' else Noneturnover_rate = float(index['f8']) if index['f8'] != '-' else Nonepe_ratio = index['f9'] if index['f9'] != '-' else Nonepb_ratio = index['f23'] if index['f23'] != '-' else Nonestock_dict = {"代码": index["f12"],"名称": index['f14'],"最新价": latest_price,"涨跌幅": change_rate,"涨跌额": change_amount,"成交量(手)": volume,"成交额": amount,"振幅(%)": amplitude,"最高": highest,"最低": lowest,"今开": open_price,"昨收": close_price,"量比": volume_ratio,"换手率": turnover_rate,"市盈率(动态)": pe_ratio,"市净率": pb_ratio,}stocks.append(stock_dict)# 将数据插入数据库c.execute("INSERT INTO stocks (code, name, latest_price, change_rate, change_amount, volume, amount, amplitude, highest, lowest, open, close, volume_ratio, turnover_rate, pe_ratio, pb_ratio) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)",(index["f12"], index['f14'], latest_price, change_rate, change_amount, volume, amount, amplitude,highest, lowest, open_price, close_price, volume_ratio, turnover_rate, pe_ratio, pb_ratio))conn.commit()else:break# 关闭数据库连接
conn.close()print("所有股票数据已保存到数据库!")

图片展示

打印结果

数据库结果

2. 作业心得

通过爬取股票信息,我更加熟悉了网络数据的获取和处理过程。在分析网页结构和API请求时,我掌握了如何有效提取和存储数据。这不仅增强了我的编程能力,还让我对金融数据的实时更新有了更深的理解。


作业③:中国大学2021主榜爬取

1. 作业代码与实现步骤

最后,我们将爬取中国大学2021主榜的所有院校信息,并将其存储到数据库中。

步骤详解

  1. 访问目标网站:前往 中国大学2021主榜。

  2. 检查网页结构:使用F12打开开发者工具,分析表格结构。

  3. 循环遍历提取:使用BeautifulSoup提取排名、学校名称、所在城市、类型和总分。

  4. 存储数据:将提取的数据保存到MySQL数据库中。

代码示例

def printUnivList(ulist, html, num):data = json.loads(html)  # 对数据进行解码# 提取 数据 rankings 包含的内容content = data['data']['rankings']# 把学校的相关信息放到 ulist 里面for i in range(num):index = content[i]['rankOverall']  # 排名name = content[i]['univNameCn']  # 学校名称province = content[i]['province']  # 省市score = content[i]['score']  # 总分category = content[i]['univCategory']  # 类型ulist.append([index, name, province, score, category])# 将数据插入数据库c.execute("INSERT INTO university_ranking (`rank`, name, province, score, category) VALUES (%s, %s, %s, %s, %s)",(index, name, province, score, category))conn.commit()# 打印前 num 名的大学tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}\t{4:^10}\t{5:^10}"  # {1:{3}^10} 中的 {3} 代表取第三个参数print(tplt.format("排名", "学校名称", "省市", chr(12288), "总分", "类型"))  # chr(12288) 代表中文空格for i in range(num):u = ulist[i]print(tplt.format(u[0], u[1], u[2], chr(12288), u[3], u[4]))  # chr(12288) 代表中文空格def main():uinfo = []url = 'https://www.shanghairanking.cn/api/pub/v1/bcur?bcur_type=11&year=2020'html = getHTMLText(url)  # 获取大学排名内容printUnivList(uinfo, html, 30)  # 输出排名前30的大学内容main()# 关闭数据库连接
conn.close()

图片展示

打印结果

数据库结果

2. 作业心得

通过爬取中国大学的排名信息,我对数据的结构化处理有了更深入的理解。整个过程让我认识到数据获取和整理的重要性,并掌握了如何有效地将这些数据存储到数据库中。记录调试过程也让我对每一步的操作有了直观的了解,这为我后续的学习奠定了良好的基础。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

clickhouse安装部署使用

一、安装 下载地址https://packages.clickhouse.com/rpm/stable/上传文件到Linux中开始安装1、进入到文件所在目录cd /usr/local/soft/clickhouse-rpms/2、使用rpm命令安装sudo rpm -ivh *.rpm3、查看状态systemctl status clickhouse-server4、启动服务systemctl start clickh…

Clickhouse的安装

一、官网下载 下载地址: https://packages.clickhouse.com/rpm/stable/ 一共需要下载这下面四个 注:一个页面没有的需要点击next进入下一个界面二、下载之后使用Xterminal打开所需要建立连接的虚拟机出现如下界面之后说明连接成功三、创建一个自己的文件夹,将先前下好的rpm文…

Oracle 排序

在Oracle中,使用 ORDER BY 语法按字符串进行排序 ASC或DESC关键字:指定升序或降序排序,默认情况下,排序是升序的。 NULLS FIRST 或 NULLS LAST 关键字:指定对空值的处理方式,默认情况下,空值排在最后。 -- 按升序排序,空值排在最后 SELECT column_name FROM table_name…

代码随想录算法训练营第24天(补第12天)| 递归遍历,迭代遍历,统一迭代

前置知识 二叉树的定义: struct BNode{int val;BNode* lchild;BNode* rchild;BNode():lchild(NULL),rchild(NULL){}BNode(int val){val=val;lchild=rchild=NULL;} };递归遍历文章链接:https://programmercarl.com/二叉树的递归遍历.html#思路 题目链接:https://leetcode.cn/…

20222403 2024-2025-1 《网络与系统攻防技术》实验三实验报告

1. 实验内容 1.1.实践内容 (1)正确使用msf编码器,veil-evasion,自己利用shellcode编程等免杀工具或技巧正确使用msf编码器,使用msfvenom生成如jar之类的其他文件 veil,加壳工具 使用C + shellcode编程(2)通过组合应用各种技术实现恶意代码免杀 如果成功实现了免杀的,简单语…

Camunda中的Execution listeners和Task listeners

在Camunda中大多数节点元素都可以设置执行监听器(Execution listeners),例如事件、顺序流、用户任务、服务任务和网关。其中用户任务除了可以设置执行监听器,还可以设置独有的用户任务监听器,相比于执行监听器,用户任务监听器可以设置更加细粒度的事件类型。 下面针对执行…

AMD Ryzen 5700X黑苹果运行Docker和Virtualization(虚拟化)

最近把我的AMD Ryzen黑苹果系统升级到Sequoia 15.01 发现virtualbox不能用了,遂重新分区又安装了一个Sonoma 14.7AMD Ryzen Run Virtualization展示 Virtualization Limit系统要求: BigSur <= 当前运行系统版本 <= Sonoma 虚拟化软件: virtualbox 6.1.50 安全要求:关…

GISBox对比CesiumLab,哪款GIS工具箱更适合你?

在地理信息系统(GIS)领域,越来越多的用户开始关注GIS工具箱的选择,其中GISBox和CesiumLab是两款备受推崇的产品。那么,哪一款更适合你的需求呢?本文将从功能、使用体验和应用场景等方面,对GISBox和CesiumLab进行详细对比,帮助你做出更明智的选择。 GISBox:功能强大,简…

一,超级详细的ClickHouse安装部署文档(RPM版安装),新手小白一看就能学会!!!

ClickHouse安装部署博客笔记(RPM版) 前言 ClickHouse是一个高性能的列式数据库,专为在线分析处理(OLAP)而设计。它能够实时生成分析数据报告,并支持对大数据进行快速的查询。本文将带你一步步完成ClickHouse的单机安装部署,确保你能够顺利上手这个强大的数据库系统。 第…

STM32配置HID设备时主机识别不到力反馈的解决办法

这个问题困扰我快一个星期了,我仔仔细细阅读了Device Class Definition for Physical Interface Devices (PID) Version 1.0和HID Usage Tables FOR Universal Serial Bus (USB)。 都没有找到识别不到力反馈的原因,按理说配置完报告描述符就能显示力反馈了,但是我这边死活识…

VSCode Java环境配置

JDK 部分 1. 下载 java jdk jdk23下载地址 windows 选择 Windows / x64 zip 文件 2. 解压 将 zip 文件移动到你想要的路径下并解压,如: E:\openjdk-23.0.1_windows-x64_bin 解压后复制 bin 文件路径,如: E:\openjdk-23.0.1_windows-x64_bin\jdk-23.0.1\bin 3. 配置环境变…

第8课 项目管理工具禅道

一、禅道的介绍 (1)定义禅道是一个项目管理工具,也是一个bug管理工具,还是一个用例管理工具。 (2)作用:为了解决众多企业在管理中出现混乱,无序的现象,开发出来 (3)来源:禅道属易软天创公司 (4 )禅道是集于产品管理,项目管理,测试管理于一身,同时包含事务管理…