102302105汪晓红数据采集作业2

news/2025/11/11 22:56:08/文章来源:https://www.cnblogs.com/xiaofennnn/p/19194005

第二次作业
作业①:
作业代码和图片:
核心代码:

点击查看代码
# 主程序
url = "http://www.weather.com.cn/weather/101010100.shtml"
city = "北京"# 初始化数据库
conn = setup_database()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")lis = soup.select("ul[class='t clearfix'] li")print(f"正在获取{city}的天气预报并保存到数据库...")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].text# 打印到控制台print(date, weather, temp)# 保存到数据库save_weather_to_db(conn, city, date, weather, temp)except Exception as err:print(f"解析错误: {err}")# 显示已保存的数据display_saved_data(conn)print(f"\n数据库文件: weather_data.db")

结果图片:
image
Gitee文件夹链接:https://gitee.com/xiaofennnn/2025-data-collection?source=header_my_projects
作业心得:
在保存到数据库的地方出了点问题,把报错给ai,找到了解决方法
作业②:
作业代码和图片:
核心代码:

点击查看代码
class StockFetcher:"""股票数据获取与处理类"""def __init__(self):self.base_url = "https://push2.eastmoney.com/api/qt/clist/get"self.params = {"np": "1","fltt": "1","invt": "2","cb": "jQuery37103071409561710594_1762478212220","fs": "m:0+t:6+f:!2,m:0+t:80+f:!2,m:1+t:2+f:!2,m:1+t:23+f:!2,m:0+t:81+s:262144+f:!2","fields": "f12,f13,f14,f1,f2,f4,f3,f152,f5,f6,f7,f15,f18,f16,f17,f10,f8,f9,f23","fid": "f3","pn": "1","pz": "20","po": "1","dect": "1","ut": "fa5fd1943c7b386f172d6893dbfba10b","wbp2u": "|0|0|0|web","_": "1762478212229"}self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ""(KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"}self.db_path = "stock.db"self.table_name = "stocks"def _parse_jsonp(self, jsonp_str: str) -> Optional[Dict[str, Any]]:"""解析JSONP格式响应为JSON对象"""try:# 提取JSON部分json_start = jsonp_str.find('(') + 1json_end = jsonp_str.rfind(')')json_str = jsonp_str[json_start:json_end]return json.loads(json_str)except (ValueError, IndexError) as e:print(f"解析JSONP失败: {e}")return Nonedef fetch_data(self) -> Optional[List[StockInfo]]:"""从API获取并解析股票数据"""try:print("正在获取股票数据...")response = requests.get(self.base_url,params=self.params,headers=self.headers,timeout=10)response.raise_for_status()  # 检查HTTP错误状态# 解析JSONP响应json_data = self._parse_jsonp(response.text)if not json_data or "data" not in json_data or "diff" not in json_data["data"]:print("获取的数据格式不正确")return None# 转换为StockInfo对象列表stocks = []for idx, item in enumerate(json_data["data"]["diff"], 1):# 数据验证required_fields = ["f12", "f14", "f2", "f3", "f4", "f5", "f6", "f7"]if not all(field in item for field in required_fields):print(f"跳过不完整的股票数据: {item}")continue# 创建股票信息对象stock = StockInfo(rank=idx,code=str(item["f12"]),name=str(item["f14"]),price=float(item["f2"]) / 100,change_percent=f"{float(item['f3']) / 100:.2f}%",change_amount=float(item["f4"]) / 100,volume=f"{round(float(item['f5']) / 10000, 2):.2f}万",turnover=f"{round(float(item['f6']) / 100000000, 2):.2f}亿",other=f"{float(item['f7']) / 100:.2f}%")stocks.append(stock)# 限制最多20条数据if len(stocks) >= 20:breakreturn stocksexcept requests.exceptions.RequestException as e:print(f"网络请求错误: {e}")return None
结果图片:

image

Gitee文件夹链接:https://gitee.com/xiaofennnn/2025-data-collection?source=header_my_projects
作业心得:
这个任务在抓包的时候出现了很多问题,找了很久才找到正确的,所以要一层层看,有耐心一点
作业③:
抓包过程:
lv_0_20251111190822

核心代码:

点击查看代码
 def fetch_ranking_data(self):"""爬取并处理大学排名数据"""try:response = requests.get(self.url, headers=self.headers)response.raise_for_status()response.encoding = response.apparent_encoding# 编译正则表达式模式pattern = re.compile(r'univNameCn:"(?P<university_name>[^"]+)",'r'.*?'r'univCategory:(?P<category_code>[^,]+),'r'.*?'r'province:(?P<province_code>[^,]+),'r'.*?'r'score:(?P<score>[^,]+),', re.S)universities_data = []for match in pattern.finditer(response.text):university_data = self._parse_university_data(match)if university_data:universities_data.append(university_data)# 按总分降序排序universities_data.sort(key=lambda x: x[3], reverse=True)return universities_dataexcept requests.RequestException as error:print(f"数据获取失败: {error}")return []def _parse_university_data(self, regex_match):"""解析单条大学数据"""try:university_name = regex_match.group('university_name').strip().strip('"')category_code = regex_match.group('category_code').strip().strip('"')province_code = regex_match.group('province_code').strip().strip('"')score_string = regex_match.group('score').strip().strip('"')# 验证并转换数据if not university_name or not self._is_valid_score(score_string):return Noneprovince = self.PROVINCE_MAPPING.get(province_code, '其他')category = self.UNIVERSITY_CATEGORY_MAPPING.get(category_code, '其他')total_score = float(score_string)return (university_name, province, category, total_score)except (AttributeError, ValueError) as error:print(f"数据解析错误: {error}")return Nonedef _is_valid_score(self, score_str):"""验证分数字符串是否有效"""return score_str.replace('.', '').isdigit()def save_to_database(self, universities_data):"""将大学排名数据保存到数据库"""if not universities_data:print("没有数据需要保存")returntry:with sqlite3.connect(self.database_name) as connection:cursor = connection.cursor()crawl_timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')# 准备插入数据data_to_insert = []for rank, university_info in enumerate(universities_data, start=1):name, province, category, score = university_infodata_to_insert.append((rank, name, province, category, score, crawl_timestamp))# 执行批量插入insert_query = '''INSERT INTO {} (ranking, university_name, province, category, total_score, crawl_time)VALUES (?, ?, ?, ?, ?, ?)'''.format(self.table_name)cursor.executemany(insert_query, data_to_insert)print(f"成功保存 {len(data_to_insert)} 条大学排名数据")except sqlite3.Error as error:print(f"数据保存失败: {error}")
结果图片:

image

image

Gitee文件夹链接:https://gitee.com/xiaofennnn/2025-data-collection?source=header_my_projects
作业心得:
这次抓包过程明显轻松了很多,而且解析json也更加得心应手了

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

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

相关文章

【数据结构】:链表的核心实现与运行解析

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

11.11每日总结

今天主要的课程有人机交互技术和软件构造。软考结束了 唉 已经做好下学期再努力试一次的准备了。今天还完善了心理健康平台的设计,继续加油

Meta AI 推出全语种语音识别系统,支持 1600+语言;谢赛宁、李飞飞、LeCun 联手发布「空间超感知」AI 框架丨日报

开发者朋友们大家好:这里是 「RTE 开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的技术」、「有亮点的产品」、「有思考的文章」、「有态度…

Python Socket网络编程

1. Socket参数介绍 服务器端server = socket.socket(AF.INET,sock.SOCK_STREAM)Socket Typessocket.SOCK_STREAM #for tcpsocket.SOCK_DGRAM #for udp socket.SOCK_RAW #原始套接字,普通的套接字无法处理ICMP、…

拥护向量机(SVM)(二)---优化算法

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

英语翻译题做法

🔹快速浏览全文和完形填空一样,做翻译题前,我先快速浏览一遍全文,大概知道文章讲什么、关于什么。如果时间充裕,可以这样做;但如果考试时间紧张,直接读划线句的翻译部分。重点看首尾两段,也能大致把握主旨。�…

Python show memory

py -m pip install psutil import os import psutil import asyncio import time from datetime import datetimeclass Book:def __init__(self,id,name,author,isbn,title,topic):self.id=idself.name=nameself.autho…

LeetCode - 1171. - 教程

LeetCode - 1171. - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &q…

研发度量DORA+SPACE+OST 影响模型

目录总结DORA 指标Space指标传统指标参考资料 总结 作为研发总监,建议您建立一个三层指标仪表盘:顶层(DORA + 业务结果): 关注结果和对业务的贡献。这是您向 CEO 或董事会汇报的指标。核心 DORA 4 指标。 功能发布…

断句

文言文断句,传统上称为“句读”,明辨“句读”是阅读文言文最基本的方法;文言文断句,在通读全文、了解大意的基础上,可借助以下几种方法断句:一、借助虚词标志性词语断句 虚词是明辨句读的重要标志,尤其是代词、…

GBT - What is gradient-boosted tree regression?

GBT - What is gradient-boosted tree regression?Gradient-Boosted Tree Regression (GBT Regression) — also called Gradient Boosted Regression Trees (GBRT) or Gradient Boosting Regression — is a powerfu…

保姆级教程 十分钟带你配置好vscode xdebug

本文详细介绍了在VSCode中配置Xdebug进行PHP远程调试的完整流程。首先通过PHP版本确认和路径查找确定环境配置基础,然后通过手动或自动方法下载匹配的Xdebug扩展并进行正确安装。重点讲解了php.ini文件的关键配置项设…

比特币的简单技术原理

比特币技术核心详解:从密码学原理到区块链架构 比特币不仅仅是一种数字货币,更是一个建立在密码学和分布式网络之上的革命性系统。理解其技术内核,是理解其价值主张的关键。 一、 终极目标:数字黄金与无需信任的价…

详细介绍:HUD-汽车图标内容

详细介绍:HUD-汽车图标内容pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco",…

后端八股之mysql - 指南

后端八股之mysql - 指南2025-11-11 22:38 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; fon…

nginx拦截ip

nginx拦截iphttp中加# 提取客户端真实 IPmap $http_x_forwarded_for $client_ip { "~^(?P<ip>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})" "$ip"; default …

2025年包装机厂家推荐排行榜,全自动包装机,全自动包装机生产线,非标定制生产线,非标定制机器公司精选指南

2025年包装机厂家推荐排行榜:全自动包装机生产线与非标定制设备选购指南 行业背景与发展趋势 随着制造业智能化转型的深入推进,包装机械行业正迎来技术革新的关键时期。全自动包装机生产线作为现代工业生产的重要装备…

【CI130x 离在线】FIFO的学习及实例

FIFO(先进先出)命名管道,用于无关系进程间的通信,因为Linux中所有事物都是文件,它在文件系统中以文件名的形式存在。创建管道用函数mkfifo(const char * pathname,mode_t mode); 函数说明:pathname参数为创建实名…

2025年包装机厂家权威推荐榜:全自动包装机、半自动包装机,高效智能包装解决方案精选

2025年包装机厂家权威推荐榜:全自动包装机、半自动包装机,高效智能包装解决方案精选随着制造业智能化转型的深入推进,包装机械行业正迎来技术革新的关键时期。全自动包装机和半自动包装机作为生产线上的关键设备,其…

CF1187F

有 \(n\) 个整数 \(a_1 \sim a_n\),每个数在 \([l_i, r_i]\) 随机选择,设 \(B = \sum\limits_{i = 1}^n [a_i \ne a_{i - 1}](a_0 = 0)\),求 \(E(B^2)\)。 \(n \le 2 \times 10^5, 1 \le l_i \le r_i \le 10^9\)。首…