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

news/2024/10/23 1:59:11
这个作业属于哪个课程 <首页 - 2024数据采集与融合技术实践 - 福州大学 - 班级博客 - 博客园 (cnblogs.com)>
这个作业要求在哪里 <作业2 - 作业 - 2024数据采集与融合技术实践 - 班级博客 - 博客园 (cnblogs.com)>
学号 <102202126>

一、作业内容

作业①

  • 要求:在中国气象网(http://www.weather.com.cn)给定城市集的7日天气预报,并保存在数据库。

  • 代码如下

    from bs4 import BeautifulSoup
    from bs4 import UnicodeDammit
    import urllib.request
    import sqlite3class 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 sqlite3.OperationalError:# If the table already exists, we ignore the error.passdef 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(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 = WeatherDB()  # Initialize WeatherDB instancedef forecastCity(self, city):if city not in self.cityCode.keys():print(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']")[0].text.strip()self.db.insert(city, date, weather, temp)except Exception as err:print(f"Error processing weather data: {err}")except Exception as err:print(f"Error fetching weather data: {err}")def process(self, cities):self.db.openDB()  # Open databasefor city in cities:self.forecastCity(city)  # Scrape and store weather data for each cityself.db.show()  # Print data from the databaseself.db.closeDB()  # Close database# Create weather forecast instance and process specified cities
    ws = WeatherForecast()
    ws.process(["北京", "上海", "广州", "深圳"])
    print("Completed")
  • 输出信息:


  • Gitee文件夹链接:陈家凯第二次实践作业

  • 心得体会:

    • 定义类 WeatherDB 和 WeatherForecast,将数据库操作和天气数据处理逻辑封装在类中。
    • 使用类的方法进行数据库的打开、关闭、插入和显示操作。
    • 使用类的方法进行天气数据的抓取和处理

    作业②

  • 要求:用requests和BeautifulSoup库方法定向爬取股票相关信息,并存储在数据库中。

  • 代码如下

    import requests
    import pandas as pd
    import sqlite3
    import json# 用get方法访问服务器并提取页面数据
    def getHtml(page):url = f"https://78.push2.eastmoney.com/api/qt/clist/get?cb=jQuery112408723133727080641_1728978540544&pn={page}&pz=20&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&dect=1&wbp2u=|0|0|0|web&fid=f3&fs=m:0+t:6,m:0+t:80,m:1+t:2,m:1+t:23,m:0+t:81+s:2048&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&_=1728978540545"try:r = requests.get(url)r.raise_for_status()json_data = r.text[r.text.find("{"):r.text.rfind("}")+1]  # 提取 JSON 数据部分data = json.loads(json_data)return dataexcept requests.RequestException as e:print(f"Error fetching data: {e}")return None# 获取单个页面股票数据
    def getOnePageStock(page):data = getHtml(page)if not data or 'data' not in data or 'diff' not in data['data']:return []return data['data']['diff']# 将股票信息存储到SQLite数据库
    def saveToDatabase(stock_list):conn = sqlite3.connect('stocks.db')c = conn.cursor()try:c.execute('''CREATE TABLE IF NOT EXISTS stocks(code TEXT PRIMARY KEY, name TEXT, price REAL, change REAL, percent_change REAL, volume INTEGER, amount REAL)''')for stock in stock_list:c.execute("INSERT OR IGNORE INTO stocks VALUES (?, ?, ?, ?, ?, ?, ?)",(stock.get('f12'), stock.get('f14'), stock.get('f2'), stock.get('f3'), stock.get('f4'), stock.get('f5'), stock.get('f6')))conn.commit()except sqlite3.Error as e:print(f"Database error: {e}")finally:c.execute("SELECT * FROM stocks")rows = c.fetchall()df = pd.DataFrame(rows, columns=['Code', 'Name', 'Price', 'Change', 'Percent Change', 'Volume', 'Amount'])print(df)conn.close()def main():all_stocks = []for page in range(1, 6):  # 爬取前5页数据stock_list = getOnePageStock(page)if stock_list:all_stocks.extend(stock_list)else:print(f"未能获取到第{page}页的股票数据")if all_stocks:print("爬取到的股票数据:")for stock in all_stocks:print(stock)saveToDatabase(all_stocks)print("股票信息已成功存储到数据库。")else:print("未能获取到任何股票数据")if __name__ == "__main__":main()
    
  • 输出信息:

  • Gitee文件夹链接:陈家凯第二次实践作业

  • 心得体会:

    • 分页处理:通过循环处理多页数据,每次只爬取 20 条记录,对于 API 限制了请求量的情况是合适的。
    • 灵活性:在 main 函数中,可以轻松调整爬取的页数(例如从 range(1, 6) 变更为其他范围),这使得代码具备一定的灵活性。

    作业③

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

  • 代码如下

    import requests
    import re
    import sqlite3class UniversityDB:def openDB(self):# 连接到SQLite数据库self.con = sqlite3.connect('universities.db')self.cursor = self.con.cursor()try:# 如果表不存在,则创建universities表self.cursor.execute('''CREATE TABLE IF NOT EXISTS universities (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,score REAL)''')except sqlite3.Error as e:print(f"Error creating table: {e}")def closeDB(self):# 提交更改并关闭数据库连接self.con.commit()self.con.close()def insert(self, university_data):try:# 插入大学数据到表中sql = "INSERT INTO universities (name, score) VALUES (?, ?)"self.cursor.execute(sql, university_data)except sqlite3.Error as e:print(f"Error inserting data: {e}")def show(self):# 获取并显示universities表中的所有记录self.cursor.execute("SELECT * FROM universities")rows = self.cursor.fetchall()print("{:<5}{:<20}{:<5}".format("排名", "学校", "总分"))for index, row in enumerate(rows):print("{:<5}{:<20}{:<5}".format(index + 1, row[1], row[2]))class UniversityCrawler:def __init__(self):# 请求的URL和头信息self.url = 'https://www.shanghairanking.cn/_nuxt/static/1728872418/rankings/bcur/2020/payload.js'self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36'}def crawl_universities(self):try:# 发送GET请求到URLresponse = requests.get(self.url, headers=self.headers)response.raise_for_status()response_text = response.textexcept requests.RequestException as e:print(f"Error fetching data: {e}")return []# 使用正则表达式提取大学名称和分数name_pattern = r'univNameCn:"(.*?)"'score_pattern = r'score:(.*?),'names = re.findall(name_pattern, response_text, re.S)scores = re.findall(score_pattern, response_text, re.S)universities_data = []for name, score in zip(names, scores):try:# 将分数转换为浮点数并添加到列表中score_value = float(score)universities_data.append((name, score_value))except ValueError:print(f"Invalid score value: {score}")continuereturn universities_datadef process(self):# 初始化数据库并插入爬取的数据db = UniversityDB()db.openDB()universities_data = self.crawl_universities()for uni_data in universities_data:db.insert(uni_data)db.show()db.closeDB()if __name__ == "__main__":# 创建爬虫实例并开始处理crawler = UniversityCrawler()crawler.process()print("completed")
    
  • 输出信息:

  • gif图:

  • Gitee文件夹链接:陈家凯第二次实践作业

  • 心得体会:

    • 学会了使用 json 库解析 JSON 数据。
    • 学会了提取 JSON 数据中的特定部分。
    • 学会了使用 sqlite3 库进行 SQLite 数据库操作。
    • 学会了创建数据库表并定义主键约束。
    • 学会了插入数据并处理可能的异常。
    • 学会了查询并显示数据库中的数据

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

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

相关文章

Proxmox VE 安装Mikrotik RouterOS

一、环境介绍 1、PVE版本:Proxmox Virtual Environment 7.2-3 2、ROS CHR镜像文件,Google Chrome 浏览器上访问Mikrotik官网下载,或访问云盘。 3、WinSCP、Xshell 用于上传镜像文件到PVE物理机。(请自行百度下载)Xshell下载地址WinSCP下载地址 二、PVE部署准备工作,上传R…

Educational Codeforces Round 170 (Rated for Div. 2) ABCD

Educational Codeforces Round 170 (Rated for Div. 2) ABCD来源:Educational Codeforces Round 170 (Rated for Div. 2) A. Two Screens 题意 给两个屏幕,两种操作,每种操作一秒,求让两个屏幕显示两个指定字符串的最短时间 操作:在一个屏幕的字符串后加任意一个字符 把一…

一个案例入门补环境

补环境其实是`补浏览器有而Node没有的环境,即补BOM和DOM的对象`,一切环境补的结果都是向浏览器实际结果靠齐,入门补环境只需要记住缺啥补啥这个技巧,当运行提示缺少某个环境,则直接在浏览器运行该环境是啥结果然后补上该结果。此分享只用于学习用途,不作商业用途,若有冒…

tcp

TCP/IP 协议与七层 ISO 模型的对应关系TCP/IP 和 ISO 的区别: OSI 参考模型注重“通信协议必要的功能是什么”,而 TCP/IP 则更强调“在计算机上实现协议应该开发哪种程序”。

基于Ascend C的Matmul算子性能优化最佳实践

本文将为开发者优化昇腾Cube类算子性能带来启发。本文分享自华为云社区《基于Ascend C的Matmul算子性能优化最佳实践》,作者:昇腾CANN。 矩阵乘法是深度学习计算中的基础操作,对于提升模型训练和推理速度至关重要。昇腾AI处理器是一款专门面向AI领域的AI加速器,其AI Core采…

CSP - Content Security Policy

检验地址CSP Evaluator规则HTTP内容安全策略参考所有以 结尾的指令都-src支持类似的值,称为源列表。多个源列表值可以用空格分隔,但none其中一个值应是唯一的。

网站怎么修改记住密码?网站用户名怎么修改密码?

修改记住密码功能登录网站:首先,你需要登录到你的账户。 进入账户设置:找到并点击账户设置或个人资料选项。 查找安全设置:在账户设置中,找到与安全相关的设置部分。 修改记住密码设置:通常会有“记住我”或“自动登录”的选项,你可以根据需要开启或关闭此功能。修改网站…