102302104刘璇-数据采集与融合技术实践作业1

news/2025/10/25 20:02:00/文章来源:https://www.cnblogs.com/liuxuannn/p/19165894

作业1:

要求:用requests和BeautifulSoup库方法定向爬取给定网站(http://www.shanghairanking.cn/rankings/bcur/2020 )的数据,屏幕打印爬取的大学排名信息。
输出信息:
排名 学校名称 省市 学校类型 总分
1 清华大学 北京 综合 852.5
2 .... .... .... ....
代码:
点击查看代码
import requests
from bs4 import BeautifulSoup
import redef crawl_university_ranking_optimized():url = "http://www.shanghairanking.cn/rankings/bcur/2020"headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'}#明确指定正确表头correct_headers = ["排名", "学校名称", "省市", "学校类型", "总分"]try:response = requests.get(url, headers=headers, timeout=10)response.encoding = "utf-8"response.raise_for_status()soup = BeautifulSoup(response.text, "html.parser")table = soup.find("table", class_="rk-table")if not table:raise ValueError("未找到排名表格")#避免解析冗余文本display_headers = correct_headersdata_rows = table.find("tbody").find_all("tr")[:30]if not data_rows:raise ValueError("未提取到数据")print("软科2020中国大学排名(前30名)")print(f"{display_headers[0]:<5}\t{display_headers[1]:<12}\t{display_headers[2]:<4}\t{display_headers[3]:<6}\t{display_headers[4]}")print("-" * 80)for row in data_rows:cols = row.find_all("td")[:5]if len(cols) < 5:continuerank = cols[0].get_text(strip=True)school_name = re.sub(r'[^\u4e00-\u9fa5]', '', cols[1].get_text(strip=True))province = cols[2].get_text(strip=True)school_type = cols[3].get_text(strip=True)total_score = cols[4].get_text(strip=True)#格式化输出print(f"{rank:<5}\t{school_name:<12}\t{province:<4}\t{school_type:<6}\t{total_score}")except requests.exceptions.RequestException as e:print(f"网络错误:{e}")except Exception as e:print(f"解析错误:{e}")if __name__ == "__main__":crawl_university_ranking_optimized()
运行结果:

1-1

心得体会:
  在开发这个大学排名爬虫的过程中,我遇到了几个颇具启发性的技术难题。最初在数据提取阶段,我发现学校名称字段中混杂了各类非中文字符,这促使我深入研究Unicode编码范围,最终采用正则表达式精准过滤出纯中文内容,这个经历让我认识到数据清洗在信息抓取中的关键作用。
  在结果展示环节,我花费了大量时间调整输出格式。由于中英文字符宽度差异,简单的制表符无法实现完美的列对齐,经过反复试验格式化字符串的宽度参数,才找到各列最合适的显示比例。这个过程让我体会到,即使是命令行程序,良好的视觉呈现也能显著提升用户体验。
  最值得反思的是异常处理的设计。在初期版本中,当网页结构发生微小变动时,程序就会直接崩溃。这个教训让我意识到防御性编程的重要性,后续我为每个DOM查询操作都添加了健壮性检查,确保在页面结构发生变化时能够优雅降级而非彻底失效。
  这些实践中的挑战让我深刻理解到,一个成熟的爬虫项目不仅需要关注核心的数据抓取功能,更要考虑数据质量、输出效果和系统稳定性等多个维度。每个技术难点的突破,都让我对软件开发的全流程有了更全面的认知。

作业2:

要求:用requests和re库方法设计某个商城(自已选择)商品比价定向爬虫,爬取该商城,以关键词“书包”搜索页面的数据,爬取商品名称和价格。
输出信息:
序号 价格 商品名
1 65.00 xxx
2 .... ....
代码:
点击查看代码
import urllib3
import rehttp = urllib3.PoolManager()
def crawl_dangdang():url = "https://search.dangdang.com/?key=书包&act=input"#发送HTTP请求response = http.request('GET', url, headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"}, timeout=15)html_content = response.data.decode('gbk', errors='ignore')#提取商品名称names = re.findall(r'title="([^"]*书包[^"]*)"', html_content)names = [name.strip() for name in names if name.strip()][:60]#提取价格prices = []price_patterns = [r'<span class="price_n">&yen;([\d.]+)</span>',r'<span class="search_now_price">&yen;([\d.]+)</span>',r'<span[^>]*>\s*&yen;\s*([\d.]+)\s*</span>',r'¥\s*(\d+\.?\d*)']for pattern in price_patterns:prices = re.findall(pattern, html_content)if prices:prices = [f"¥{p}" for p in prices][:60]break# 输出结果print("序号\t价格\t商品名称")print("-" * 60)for i, (name, price) in enumerate(zip(names, prices), 1):short_name = name[:40] + '...' if len(name) > 40 else nameprint(f"{i:2d}\t{price}\t{short_name}")if __name__ == "__main__":crawl_dangdang()
运行结果:

1-2.1
1-2.2

心得体会:
  在项目技术选型过程中,我曾将淘宝、京东等主流电商平台作为首要目标,但这些平台均配备了完善的反爬虫机制,需要处理复杂的Cookie动态维护、请求头全链路伪装以及JavaScript动态渲染等高级技术难题,这已超出我的技术范畴。经过在技术社区的多方调研,我在小红书等平台了解到当当网采用相对宽松的反爬策略,其服务端渲染模式使得基础HTTP请求即可获取完整的页面数据,数据结构清晰且稳定。基于对自身技术能力的客观评估和项目周期的现实考量,我最终选择以反爬门槛较低的当当网作为数据源,在保证项目可行性的同时,确保在有限开发资源下实现数据采集的稳定性和可维护性。

作业2:

要求:爬取一个给定网页(https://news.fzu.edu.cn/yxfd.htm) 或者自选网页的所有JPEG、JPG或PNG格式图片文件
输出信息:将自选网页内的所有JPEG、JPG或PNG格式文件保存在一个文件夹中
代码:
点击查看代码
import os
import re
import requests
from urllib.parse import urljoindef crawl_fzu_news():"""爬取福州大学新闻网图片"""url = 'https://news.fzu.edu.cn/yxfd.htm'response = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'}, timeout=10)html = response.content.decode('utf-8', errors='ignore')img_urls = re.findall(r'<img.*?src="(.*?)"', html, re.IGNORECASE)valid_imgs = []for src in img_urls:if 'icon' in src.lower() or 'logo' in src.lower():continuefull_url = urljoin(url, src)if re.search(r'\.(jpg|jpeg|png)$', full_url, re.IGNORECASE):valid_imgs.append(full_url)#下载图片if not os.path.exists('images'):os.makedirs('images')for i, img_url in enumerate(valid_imgs):try:response = requests.get(img_url, timeout=10)ext = '.jpg' if '.jpeg' in img_url else os.path.splitext(img_url)[1]with open(f'images/img_{i}{ext}', 'wb') as f:f.write(response.content)print(f'下载成功: img_{i}{ext}')except Exception as e:print(f'下载失败 {img_url}: {e}')if __name__ == '__main__':crawl_fzu_news()
运行结果:

1-3.1
1-3.2

心得体会:
  在开发这个图片爬虫的过程中,我深刻体会到了实践与理论认知之间的差距。初始阶段,我低估了网页编码处理的复杂性,当发现中文字符出现乱码时,才意识到需要系统性地尝试多种编码方案。在处理图片链接时,我遇到了路径规范的挑战。相对路径、绝对路径以及带参数的动态链接交织在一起,这促使我深入理解URL拼接的规范性问题。
  通过这个项目,我认识到爬虫开发不仅需要掌握技术工具,更要具备系统思维。每个环节都可能成为系统的薄弱点,唯有通过反复测试和迭代优化,才能构建出稳定可靠的数据采集方案。

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

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

相关文章

102302110高悦作业1

• 作业①:用requests和BeautifulSoup库方法定向爬取给定网址(http://www.shanghairanking.cn/rankings/bcur/2020 )的数据,屏幕打印爬取的大学排名信息。 1.代码与实验结果 首先打开网页,查看网页的源代码,找出并…

2025.10.23 模拟赛

前言 最抽象的一集,切 A 花了快 2h,B 最后 30 min 想到做法但没调完。 A P8102 考虑将 \(A\) 插入到 \(i(\in [0,n])\) 后对答案的贡献。 设 \(f_i\) 表示 \([\max(1,i-m+1),i]\) 的最大值,\(g_i\) 表示 \([\max(1,…

刷题日记—洛谷循环题单 1.数学思想在算法题中的应用: 2.回文数的判定:

1.数学思想在算法题中的应用: 这道题的重点在于把每周的总存储求出来,然后用X与K表示,定为W,W52=N可以求出W,由W=AX+BK,可以将K从小到大遍历,直至BK=W,求出第一个符合要求的X值即为X最大值,对应的K也为最小值.…

Day23-C:\Users\Lenovo\Desktop\note\code\JavaSE\Basic\src\com\InOut

递归 递归公式 递归结束语句 package com.recursion;public class RecursionTest1 {public static void main(String[] args) {test1();}public static void test1(){System.out.println("------test1------"…

U623471 暂未定题目(无数据)

#include<bits/stdc++.h> using namespace std; mt19937_64 mrd(time(0)); const int N=1e9+7,inf=1e9,M=6e7; int pri[M],tot,fa[200010]; bool vis[N]; void init(){for(int i=2;i<=1e9;i++){if(!vis[i]) p…

深入解析:每日前端宝藏库 | tinykeys ✨

深入解析:每日前端宝藏库 | tinykeys ✨pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "M…

MAC地址类型速记

MAC 地址类型速记 MAC 表示方式 MAC 地址为 48 位,使用 EUI 48,通常使用 12 个 16 进制表示,由电气和电子工程师协会 (IEEE) 定义,通常如下表示方式: XX-XX-XX-XX-XX-XX Windows 系统常用 XX:XX:XX:XX:XX:XX Li…

《程序员修炼之道》阅读笔记3

从“能完成任务的小工”到“解决复杂问题的专家”,本质不是技术栈堆砌,而是《程序员修炼之道》强调的“成长思维”——将每一次挑战(复杂需求、线上故障、技术瓶颈)转化为能力升级机会。持续学习方面,需建立“知识…

【题解】洛谷P14308 【MX-S8-T1】斐波那契螺旋

对于这题,难点主要在于将图中这些正方形的左下角坐标求出来,注意到数据范围:\(\left| x \right|,\left| y \right| \leq 10^{18}\),所以用\(int\)绝对会炸吧,一定要开\(long long\)。 那么我们如何算出这些正方形的…

实验二 现代C++编程初体验

实验任务一 源代码 T.h点击查看代码 #pragma once#include <string>// 类T: 声明 class T { // 对象属性、方法 public:T(int x = 0, int y = 0); // 普通构造函数T(const T &t); // 复制构造函数T(T &am…

LLM学习记录DAY12

📘今日学习总结 KV Cache 作用在 Transformer 模型中,KV Cache(Key-Value Cache,键值缓存) 指的是 自回归推理过程中缓存的 Key 和 Value,以避免重复计算。 它主要用于 自注意力机制(Self-Attention),在 解码…

MCP Gateway 综述与实战指南

一、项目定位与核心价值MCP(Model Context Protocol)Gateway 是面向 Kubernetes 环境的反向代理与管理层,专为 会话感知的路由 与 MCP 实例生命周期管理 设计。它兼具 数据平面(流量转发)和 控制平面(部署、运维…

清晨的阳光刚染红天边,我就钻进了彩虹色的热气球吊篮

清晨的阳光刚染红天边,我就钻进了彩虹色的热气球吊篮。随着火焰“呼呼”地喷向气囊,巨大的彩色气球像被唤醒的花朵,载着我缓缓升向云端。 地面的房子变成了积木块,河流像银色的丝带缠绕在绿色地毯上。当热气球穿过…

深入解析:关于在博客页面添加live2d-widget的一些心得和踩过的坑

深入解析:关于在博客页面添加live2d-widget的一些心得和踩过的坑pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "…

Android设备位置历史深度解析:本地存储与取证技术

本文深入分析Android设备本地位置历史存储机制,探讨Google Timeline功能的技术实现,解析LevelDB和Protobuf数据格式,并通过多设备测试验证位置数据的准确性与可靠性。Android设备位置历史深度解析 背景介绍 2023年1…

深入解析:Zark Lab 与 Walrus 合作,建立内容发现、可访问性与实用性的基础 AI 智能层

深入解析:Zark Lab 与 Walrus 合作,建立内容发现、可访问性与实用性的基础 AI 智能层pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important;…

LLM安全新威胁:为什么几百个毒样本就能破坏整个模型

数据投毒,也叫模型投毒或训练数据后门攻击,本质上是在LLM的训练、微调或检索阶段偷偷塞入精心构造的恶意数据。一旦模型遇到特定的触发词,就会表现出各种异常行为——输出乱码、泄露训练数据、甚至直接绕过安全限制…

软件技术基础第二次作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/zjlg/25rjjc这个作业的目标 加强编程能力,熟悉码云平台操作姓名-学号 应苒媞-2023329301007码云仓库地址:https://gitee.com/kimmy1112/text-counter.git

前后端分离毕设课题:基于React.js+Java+Springboot框架+Mysql数据库在线买菜商城专业的系统设计与实现

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

vue3 不同构建版本

Vue3中不再构建UMD模块化的方式,因为UMD会让代码有更多的冗余,它要支持多种模块化的方式。 Vue3中将CJS、ESModule和自执行函数的方式分别打包到了不同的文件中。在packages/vue中有Vue3的不同构建版本。 1.cjs(两个…