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

news/2024/10/19 7:33:58

目录
  • 作业①
    • 实验要求及结果
    • 心得体会
  • 作业②
    • 实验要求及结果
    • 心得体会
  • 作业③
    • 实验要求及结果
    • 心得体会

  • 码云连接

作业①

实验要求及结果

  • 要求
    在中国气象网(http://www.weather.com.cn)给定城市集的7日天气预报,并保存在数据库。
  • 代码
点击查看代码
from bs4 import BeautifulSoup, UnicodeDammit
import urllib.request
import sqlite3# 天气数据库类
class WeatherDB:def openDB(self):self.con = sqlite3.connect("weathers.db")self.cursor = self.con.cursor()try:self.cursor.execute("create table weathers (wCity varchar(16), wDate varchar(16), wWeather varchar(64), wTemp varchar(32), constraint pk_weather primary key (wCity, wDate))")except Exception as err:print("Table already exists, clearing data:", err)self.cursor.execute("delete from weathers")def closeDB(self):self.con.commit()self.con.close()def insert(self, city, date, weather, temp):try:self.cursor.execute("insert into weathers (wCity, wDate, wWeather, wTemp) values (?, ?, ?, ?)",(city, date, weather, temp))except Exception as err:print("Insert error:", err)def show(self):self.cursor.execute("select * from weathers")rows = self.cursor.fetchall()print("%-16s%-16s%-32s%-16s" % ("City", "Date", "Weather", "Temp"))for row in rows:print("%-16s%-16s%-32s%-16s" % (row[0], row[1], row[2], row[3]))# 天气预报类
class WeatherForecast:def __init__(self):self.headers = {"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; en-US; rv:1.9pre) Gecko/2008072421 Minefield/3.0.2pre"}self.cityCode = {"北京": "101010100", "上海": "101020100", "广州": "101280101", "深圳": "101280601"}self.db = Nonedef forecastCity(self, city):if city not in self.cityCode.keys():print(f"{city} code cannot be found")returnurl = "http://www.weather.com.cn/weather/" + self.cityCode[city] + ".shtml"try:req = urllib.request.Request(url, headers=self.headers)data = urllib.request.urlopen(req)data = data.read()dammit = UnicodeDammit(data, ["utf-8", "gbk"])data = dammit.unicode_markupsoup = BeautifulSoup(data, "lxml")lis = soup.select("ul[class='t clearfix'] li")for li in lis:try:date = li.select('h1')[0].textweather = li.select('p[class="wea"]')[0].texttemp = li.select('p[class="tem"] span')[0].text + "/" + li.select('p[class="tem"] i')[0].textprint(city, date, weather, temp)self.db.insert(city, date, weather, temp)except Exception as err:print("Parsing error:", err)except Exception as err:print("Request error:", err)def process(self, cities):self.db = WeatherDB()self.db.openDB()for city in cities:self.forecastCity(city)self.db.show()self.db.closeDB()# 调用天气预报程序
ws = WeatherForecast()
ws.process(["北京", "上海", "广州", "深圳"])
print("Completed")
  • 运行结果

心得体会

  • 通过这次作业,我学会了如何利用Python的requests和BeautifulSoup库来爬取中国气象网的7日天气预报数据。
  • 在这个过程中,我学会了如何分析和处理HTML页面结构此外,我还熟练掌握了SQLite数据库的基本操作,包括创建表、插入数据和查询数据。

作业②

实验要求及结果

  • 要求:用requests和BeautifulSoup库方法定向爬取股票相关信息,并存储在数据库中。
    候选网站:东方财富网:https://www.eastmoney.com/

  • 代码:

点击查看代码
import requests
import re
import sqlite3# 连接SQLite数据库,创建数据库文件
connection = sqlite3.connect('stocks_data.db')
cursor = connection.cursor()# 创建表格
create_table_sql = """
CREATE TABLE IF NOT EXISTS stocks (id INTEGER PRIMARY KEY AUTOINCREMENT,code TEXT,name TEXT,latest_price REAL,change_rate REAL,change_amount REAL,volume INTEGER,turnover INTEGER,amplitude REAL,highest REAL,lowest REAL,opening_price REAL,previous_close REAL,volume_ratio REAL,turnover_rate REAL,pe_ratio REAL,pb_ratio REAL
);
"""
cursor.execute(create_table_sql)
connection.commit()# 请求头
header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0","Cookie": "qgqp_b_id=c358a3ef431fdeb8bab829150de55857; st_si=45644677308239; HAList=ty-0-300059-%u4E1C%u65B9%u8D22%u5BCC; st_asi=delete; st_pvi=36719701084546; st_sp=2024-10-15%2014%3A56%3A34; st_inirUrl=https%3A%2F%2Fwww.eastmoney.com%2F; st_sn=7; st_psi=20241015151240611-113200301321-6110855007"
}# 获取股票数据的接口函数
def get_html(cmd, page):url = f"https://98.push2.eastmoney.com/api/qt/clist/get?cb=jQuery112409605352694558194_1728976797660&pn={page}&pz=20&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&dect=1&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&_=1728976797661"response = requests.get(url, headers=header)data = response.text# 提取JSON格式数据left_data = re.search(r'^.*?(?=\()', data).group()data = re.sub(left_data + '\(', '', data)data = re.sub('\);', '', data)data = eval(data)  # 解析成Python字典格式return data# 股票分类及接口参数
cmd = {"沪深京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","上证A股": "f3&fs=m:1+t:2,m:1+t:23","深证A股": "f3&fs=m:0+t:6,m:0+t:80","北证A股": "f3&fs=m:0+t:81+s:2048",
}# 爬取并保存股票数据到数据库
for market_name, market_code in cmd.items():page = 0while True:page += 1data = get_html(market_code, page)if page <= 2:print(f"正在爬取 {market_name} 第 {page} 页")stock_list = data['data']['diff']for stock in stock_list:code = stock["f12"]name = stock["f14"]latest_price = stock["f2"]change_rate = stock["f3"]change_amount = stock["f4"]volume = stock["f5"]turnover = stock["f6"]amplitude = stock["f7"]highest = stock["f15"]lowest = stock["f16"]opening_price = stock["f17"]previous_close = stock["f18"]volume_ratio = stock["f10"]turnover_rate = stock["f8"]pe_ratio = stock["f9"]pb_ratio = stock["f23"]# 插入数据到SQLite数据库insert_sql = """INSERT INTO stocks (code, name, latest_price, change_rate, change_amount, volume, turnover, amplitude, highest, lowest, opening_price, previous_close, volume_ratio, turnover_rate, pe_ratio, pb_ratio)VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"""cursor.execute(insert_sql,(code, name, latest_price, change_rate, change_amount, volume, turnover, amplitude,highest, lowest, opening_price, previous_close, volume_ratio, turnover_rate, pe_ratio,pb_ratio))else:break# 提交并关闭数据库连接
connection.commit()
cursor.close()
connection.close()print("股票数据已成功存储到SQLite数据库中")
  • 截图

心得体会

作业③

实验要求及结果

  • 要求:爬取中国大学2021主榜(https://www.shanghairanking.cn/rankings/bcur/2021)所有院校信息,并存储在数据库中,同时将浏览器F12调试分析的过程录制Gif加入至博客中。

  • 代码:

点击查看代码
import requests
import re
import sqlite3class UniversityDB:def __init__(self):self.con = sqlite3.connect("universities.db")self.cursor = self.con.cursor()self.create_table()def create_table(self):self.cursor.execute("""CREATE TABLE IF NOT EXISTS universities (id INTEGER PRIMARY KEY AUTOINCREMENT,rank INTEGER,name TEXT,province TEXT,category TEXT,score REAL)""")self.con.commit()def closeDB(self):self.con.commit()self.con.close()def insert(self, rank, name, province, category, score):self.cursor.execute("""INSERT INTO universities (rank, name, province, category, score)VALUES (?, ?, ?, ?, ?)""", (rank, name, province, category, score))def show(self):self.cursor.execute("SELECT * FROM universities")rows = self.cursor.fetchall()print("{:<10} {:<20} {:<15} {:<15} {:<10}".format("排名", "学校", "省份", "类型", "总分"))for row in rows:print("{:<10} {:<20} {:<15} {:<15} {:<10}".format(row[1], row[2], row[3], row[4], row[5]))class UniversityForecast:def __init__(self):self.db = UniversityDB()def fetch_data(self, url):response = requests.get(url)response.raise_for_status()return response.textdef parse_data(self, text):name = re.findall(',univNameCn:"(.*?)",', text)score = re.findall(',score:(.*?),', text)category = re.findall(',univCategory:(.*?),', text)province = re.findall(',province:(.*?),', text)code_name = re.findall('function(.*?){', text)start_code = code_name[0].find('a')end_code = code_name[0].find('pE')code_name = code_name[0][start_code:end_code].split(',')value_name = re.findall('mutations:(.*?);', text)start_value = value_name[0].find('(')end_value = value_name[0].find(')')value_name = value_name[0][start_value + 1:end_value].split(",")universities = []for i in range(len(name)):province_name = value_name[code_name.index(province[i])][1:-1]category_name = value_name[code_name.index(category[i])][1:-1]universities.append((i + 1, name[i], province_name, category_name, score[i]))return universitiesdef process(self, url):try:text = self.fetch_data(url)universities = self.parse_data(text)for uni in universities:self.db.insert(uni[0], uni[1], uni[2], uni[3], float(uni[4]))except Exception as err:print(f"Error processing data: {err}")def show_database(self):print("\n开始输出数据库:\n")self.db.show()def close_database(self):self.db.closeDB()# 使用示例
if __name__ == "__main__":forecast = UniversityForecast()url = "https://www.shanghairanking.cn/_nuxt/static/1728872418/rankings/bcur/2021/payload.js"forecast.process(url)forecast.show_database()forecast.close_database()print("completed")print("输出数据库完成")
  • 运行结果:

心得体会

  • 正则表达式的应用:通过正则表达式提取复杂文本中的特定信息,提高了数据处理的灵活性,但也需要注意正则的匹配精度。

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

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

相关文章

多校A层冲刺NOIP2024模拟赛08

多校A层冲刺NOIP2024模拟赛08\(T1\) A. 传送 (teleport) \(0pts\)弱化版: [ABC065D] Built? | luogu P8074 [COCI2009-2010#7] SVEMIR | “迎新春,过大年”多校程序设计竞赛 H 二次元世界之寻找珂朵莉先不管后面加入的 \(m\) 条边。对于两点间的路径 \(i \to j\) ,经过中转…

KubeSphere v4 安装指南

日前,KubeSphere v4 发布,相较于之前的版本,新版本在架构上有了颠覆性的变化。为了让社区的各位小伙伴能够丝滑的从旧版本过渡到新版本,我们特别推出本篇安装指南文章,以供参考。 关于 KubeSphere v4 的介绍,请阅读本文:KubeSphere v4 开源并发布全新可插拔架构 LuBan。…

Graphic Raycaster

参数解释Graphic Raycaster —— 射线检测Ignore Reversed Graphics 是否忽略反方向图形,勾选此选项时反转180的图形将不接受射线检测,否则正反面都接受 Blocking Objects 屏蔽指定对象类型,None 都不屏蔽 Two D 屏蔽具有2D碰撞体的2D物理对象,Three D 屏蔽具有3D碰撞体的3…

SAP ABAP ME23N打印预览允许打印

简介: 用户希望PO创建成功时邮件发送打印模板,平时可以通过ME23N打印预览进行打印 实现:ME23N标准打印使用的是Scriptform函数ME_PRINT_PO调用子例程prepare_formular打开FORM,所以在这个子例程OPEN_FORM前的增强点做增强增强内容:IF p_screen NE space .xdialog = X.xde…

Java的Stream流编程的排序sorted方法里参数o1,o2分别代表什么?

先说结论:在sorted方法中,o1是最后面的元素,o2是倒数第二个元素,以此类推,流是处理元素是从后面开始取值。 package com.br.itwzhangzx02.learn; import org.junit.Test; import java.util.ArrayList; import java.util.List; import com.br.itwzhangzx02.learn.POJO.Use…

无刷直流电机

无刷直流电机 无刷直流电机(Brushless Direct Current Motor,简称BLDC)是一种没有电刷和换向器的电机,它使用电子方式切换电流方向来控制电机的旋转。与传统的有刷直流电机相比,无刷直流电机具有许多优点,包括高效率、低噪音、长寿命和高可靠性。 一、直流无刷电机的组成…

Megacli查看Dell服务器Raid状态

通常我们使用的DELL/HP/IBM三家的机架式PC级服务器阵列卡是从LSI的卡OEM出来的,DELL和IBM两家的阵列卡原生程度较高,没有做太多封装,可以用原厂提供的阵列卡管理工具进行监控;而HP的阵列卡一般都做过封装了,因此需要使用自身特有的管理工具来监控。 MegaCli是一款管理维护…

基于BP神经网络的CoSaMP信道估计算法matlab性能仿真,对比LS,OMP,MOMP,CoSaMP

1.算法仿真效果 matlab2022a仿真结果如下(完整代码运行后无水印): 仿真操作步骤可参考程序配套的操作视频。2.算法涉及理论知识概要LS估计法实现方式较为简单,其估计过程没有考虑实际信道的噪声因素。因此,特别当毫米波MIMO信道干扰较大时,其估计性能较差,只适用于对信道…