102302126李坤铭作业1

news/2025/10/28 22:41:22/文章来源:https://www.cnblogs.com/likunming/p/19172884

作业1
用requests和BeautifulSoup库方法定向爬取给定网址(http://www.shanghairanking.cn/rankings/bcur/2020 )的数据,屏幕打印爬取的大学排名信息。
1)代码:

点击查看代码
import requests
from bs4 import BeautifulSoup# 目标 URL(上海软科 2020 年中国大学排名)
url = "http://www.shanghairanking.cn/rankings/bcur/2020"# 1. 发送 HTTP 请求
try:response = requests.get(url)response.encoding = "utf-8"  # 确保编码正确response.raise_for_status()  # 如果请求失败,抛出异常
except requests.exceptions.RequestException as e:print(f"请求失败: {e}")exit()# 2. 解析 HTML 内容
soup = BeautifulSoup(response.text, "html.parser")# 3. 定位排名数据所在的表格
tables = soup.find_all("table")
for table in tables:if "排名" in table.text:  # 判断表格是否包含“排名”break
if not table:print("未找到排名表格!")exit()# 4. 提取表格中的每一行数据(跳过表头)
rows = table.find_all("tr")[1:]  # 跳过表头行# 5. 存储并打印排名信息
rankings = []
for row in rows:cols = row.find_all("td")if len(cols) < 5:  # 确保每行有足够的数据continuerank = cols[0].text.strip()  # 排名name = cols[1].text.strip()  # 学校名称province = cols[2].text.strip()  # 省市type_ = cols[3].text.strip()  # 学校类型score = cols[4].text.strip()  # 总分rankings.append((rank, name, province, type_, score))# 6. 打印结果
print("上海软科 2020 年中国大学排名:")
print("+" + "-"*50 + "+")
print("| {:<4} | {:<10} | {:<6} | {:<8} | {:<6} |".format("排名", "学校名称", "省市", "学校类型", "总分"))
print("+" + "-"*50 + "+")
for rank in rankings:print("| {:<4} | {:<10} | {:<6} | {:<8} | {:<6} |".format(*rank))
print("+" + "-"*50 + "+")
运行结果:

b321e4a4-6490-4777-ad22-3f1d044fd75c
2)作业心得
这段代码是一个简单的网页数据抓取示例,其逻辑非常直观:首先通过请求获取网页内容,然后利用解析工具对页面进行解析,最后从中提取所需的数据信息。具体来说,使用requests库来获取网页内容,借助BeautifulSoup库精准定位数据所在位置,同时还需要对中文乱码以及数据中多余的空格、换行进行清理,让展示的数据会显得整齐统一。
作业2
用requests和re库方法设计某个商城(自已选择)商品比价定向爬虫,爬取该商城,以关键词“书包”搜索页面的数据,爬取商品名称和价格。
1)代码:

点击查看代码
import urllib.request
import redef fetch_dangdang_backpack_products():search_url = "https://search.dangdang.com/?key=%CA%E9%B0%FC&category_id=10009684#J_tab"try:with urllib.request.urlopen(search_url, timeout=3) as response:page_content = response.read().decode('gb2312')# 使用更精确的正则匹配商品列表项product_items = re.findall(r'<li[^>]*?class="line[^>]*>(.*?)</li>', page_content, re.S)# 定义更健壮的正则模式title_regex = re.compile(r'<a[^>]*title=["\']\s*([^"\']*?)\s*["\']', re.I)price_regex = re.compile(r'<span[^>]*class=["\']price_n["\'][^>]*>(.*?)</span>', re.S)valid_products = 0print("当当网书包商品信息:")print(f"{'编号':<4}{'售价':<10}{'商品名称'}")print("=" * 80)for position, item in enumerate(product_items, 1):titles = title_regex.findall(item)prices = price_regex.findall(item)if titles and prices:item_name = titles[0].strip()item_price = prices[0].strip().replace('&yen;', '¥')print(f"{position:<4}{item_price:<10}{item_name}")valid_products += 1print("=" * 80)print(f"成功获取 {valid_products} 个有效商品信息")except urllib.error.URLError as error:if hasattr(error, 'code'):print(f"HTTP请求失败,状态码:{error.code}(可能触发反爬机制,建议优化请求头)")else:print(f"网络请求异常:{error.reason}")if __name__ == "__main__":print("启动当当网书包商品爬取程序...\n")fetch_dangdang_backpack_products()print("\n爬取程序执行完毕!")
运行结果:

2e01555f-8e41-4e2d-8281-2cc03917d4c6
2)作业心得
通过本次代码调试实践,我深入认识到Cookie在应对网站反爬机制中的关键作用:当当网通过Cookie来追踪和验证用户身份,当HTTP请求缺少有效的Cookie时,服务器会直接返回显示"无商品数据"的空白页面(即便请求头中已正确设置User-Agent)。因此,在实际爬取操作前,必须从浏览器开发者工具中复制真实的Cookie信息并添加到请求头中,这是绕过基础反爬策略的必要前提条件。
作业3
爬取一个给定网页(https://news.fzu.edu.cn/yxfd.htm)或者自选网页的所有JPEG、JPG或PNG格式图片文件
1)代码:

点击查看代码
import requests
from bs4 import BeautifulSoup
import os
import time
from urllib.parse import urljoin# 待抓取的新闻页面列表
news_pages = ["https://news.fzu.edu.cn/yxfd.htm","https://news.fzu.edu.cn/yxfd/1.htm","https://news.fzu.edu.cn/yxfd/2.htm","https://news.fzu.edu.cn/yxfd/3.htm","https://news.fzu.edu.cn/yxfd/4.htm","https://news.fzu.edu.cn/yxfd/5.htm"
]# 图片存储配置
IMAGE_FOLDER = "fzu_news_images"
downloaded_images = 0# 自动创建图片目录
os.makedirs(IMAGE_FOLDER, exist_ok=True)
print(f"图片存储目录已创建:{IMAGE_FOLDER}")def save_image(image_url, page_index):"""下载并保存单张新闻图片"""global downloaded_images# 配置请求头模拟浏览器访问request_headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/128.0.0.0 Safari/537.36"}try:# 发起图片下载请求img_response = requests.get(image_url, headers=request_headers, timeout=15)img_response.raise_for_status()# 生成规范化文件名filename = image_url.split("/")[-1]if "." not in filename:filename = f"unnamed_{downloaded_images + 1}.jpg"save_path = os.path.join(IMAGE_FOLDER, f"page_{page_index}_{filename}")# 写入图片文件with open(save_path, "wb") as img_file:img_file.write(img_response.content)downloaded_images += 1print(f"[成功] 页面{page_index} - 图片{downloaded_images}: {filename}")return Trueexcept Exception as error:print(f"[失败] 页面{page_index} 图片下载失败: {image_url}\n原因: {error}")return Falsedef parse_news_page(page_url, page_index):"""解析新闻页面并提取图片"""print(f"\n开始处理页面 {page_index}: {page_url}")# 配置请求头request_headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/128.0.0.0 Safari/537.36"}try:# 获取页面内容page_response = requests.get(page_url, headers=request_headers, timeout=15)page_response.encoding = page_response.apparent_encoding# 解析HTML文档html_parser = BeautifulSoup(page_response.text, "html.parser")image_containers = html_parser.find_all("div", class_="img slow")if not image_containers:print(f"[提示] 页面{page_index} 未发现图片元素")return# 处理每个图片容器for container in image_containers:img_element = container.find("img")if img_element and img_element.get("src"):# 处理相对路径full_image_url = urljoin(page_url, img_element["src"])save_image(full_image_url, page_index)time.sleep(1)  # 请求间隔print(f"[完成] 页面{page_index} 处理完毕")except Exception as error:print(f"[错误] 页面{page_index} 解析失败: {error}")if __name__ == "__main__":print("福州大学新闻图片抓取程序启动")print(f"目标页面列表: {news_pages}")# 遍历所有新闻页面for idx, page_url in enumerate(news_pages, start=1):parse_news_page(page_url, idx)# 页面间延迟(除最后一页)if idx < len(news_pages):print("等待2秒后处理下一页...")time.sleep(2)# 输出统计信息print("\n抓取任务完成!")print(f"处理页面数: {len(news_pages)}")print(f"成功下载图片数: {downloaded_images}")print(f"图片存储路径: {os.path.abspath(IMAGE_FOLDER)}")
运行结果:

image
2)作业心得
在网页数据采集阶段,我采用urllib.request库构建带自定义请求头的HTTP请求,通过模拟浏览器行为(User-Agent伪装)有效规避了基础反爬机制,成功获取到完整的网页HTML源码。

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

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

相关文章

10月28日日记

1.今天进行工程实训 2.明天学习马哲 3.负载因子为什么通常设置为0.75?

【大模型应用开发】之本地部署大模型

本地部署本地部署一般是在自己的服务器上部署,但这里以本地电脑进行部署为例,由于电脑配置远远无法支持大模型配置要求,届时部署下来的也是阉割版的。本地部署一种方案就是ollama,官方地址:https://ollama.com访问…

link元素的用法及HTML样板

本人学习时候很容易额外扩展,因为很多次见到同一个熟悉但不了解的代码或用法我会很难受,所以我把基本用法都列出来了,看起来会很冗杂(因为不仅不同文章重复,相同文章我也在重复-.-),但结合实例来回对比查阅让我…

Raft 一致性算法简介

引言与背景 分布式系统中,为了在 非拜占庭故障(如节点宕机或网络分区)情况下保持数据一致性,往往需要分布式共识算法来确保多个副本状态统一 。长期以来,Leslie Lamport 提出的 Paxos 算法 一直是这一领域的代表…

10月28号

今天上午进行了铁道认知实训

URL验证绕过速查表:全面解析SSRF与CORS绕过技术

本文详细介绍了PortSwigger最新发布的URL验证绕过速查表工具,涵盖域名混淆、伪相对URL、环回地址编码等核心技术,帮助安全测试人员快速生成绕过payload,有效检测SSRF、CORS配置错误等漏洞。介绍URL验证绕过速查表 U…

https://avoid.overfit.cn/post/44c8d547475340d59aa4480f634ea67f

现在的 Agent 系统有个很明显的问题 —— 会话一结束,什么都忘了。 这不是个技术缺陷,但是却限制了整个系统的能力边界。Agent 可以做推理、规划、执行复杂任务,但就是记不住之前发生过什么。每次对话都像是第一次见…

23题黄金分割

某同学在学习了黄金分割后对于黄金分割产生了浓厚的兴趣,于是他开始探究有关黄金分割的相关性质,请你帮助他完成以下任务。【任务一】作一个黄金分割 (1)如图, \(BC \perp AB\), \(BC = \frac{1}{2} AB\),作 \(…

记录一次成功的springboot2

pom文件<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"x…

算法学习-素数筛法【埃氏筛法、线性筛法】

普通筛法: 核心思路: 使用一个布尔数组记录此数是否为素数, 从2~n便利, 如果是此数记录为素数 向后维护数组,此素数的K倍均为非素数,直到大于n. ^时间复杂度O(nlogn) 便利+维护 埃式筛法 初式: 同线性筛法,依次遍历向后…

日总结 19

C#是基于.NET框架的托管语言,由CLR(公共语言运行时)负责自动内存管理(垃圾回收),开发效率高,更适合快速构建Windows应用、Web服务、Unity游戏等上层应用,编译后生成中间语言(IL),跨平台依赖.NET Core/5+;而…

Day 18

复习日:把散落的知识点,织成可落地的网 原本计划学新内容,可翻了翻最近的笔记,发现二叉树遍历、MySQL查询、离散图论的知识点像散落在抽屉里的零件——单独看都认识,凑到一起却不知道怎么联动。索性花一天时间复盘…

Jenkins Share Library教程 —— 企业级 Jenkins Shared Library 实战示例

写在前面 好久不见~最近状态稍缓,更新也慢了些,这篇文章同样让大家等了挺久,先跟大家说声抱歉。 如果你认真读了前面几篇,还跟着实践了,那到这里,咱们就要正式开启真正的 “进阶阶段” 啦! 确实,大多数公司内…

STM32之fromelf生成bin和反汇编文件

介绍一下STM32之fromelf生成bin和反汇编文件的命令。一、生成bin文件 fromelf --bin -o UWBStation.bin UWBStation/UWBStation.axf或者 fromelf --bin -o "@L.bin" "#L"二、生成反汇编文件 frome…

25.10.28联考题解

A 从两边贪心即可。 B 设 \(f_{i,j,0/1}\) 表示牌堆还剩 \(i\) 张牌,现在已经有 \(j\) 种有用的牌种,是否有对子的期望。转移考虑分讨新的牌是否有贡献,有什么贡献即可。 C 首先差分,现在一次操作就是一个位置加一…

2025年河南工业大学2025新生周赛(1)

A 诚信参赛 如果你答案错误,请检查:1. 是否是英语输入状态下的标点符号;2. 逗号后面有个空格。 写这类题时,建议直接复制题目需要输出的内容粘贴到代码里。 #include <stdio.h>int main(void) { printf(&…

excel查找满足条件的第二项

需求就是,查找满足条件的第二项 使用vlookup达不到,网上查的似乎都不行,实验后找到一个方法=VLOOKUP(E1,INDEX(A:B,MATCH(E1,A:A,0)+1,1):INDEX(A:B,MATCH("座",A:A ),2),2,0)稍微解释一下:思路是,用MA…

【传奇开心果系列】基于Flet框架实现的跷跷板动画自定义模板特色和实现原理深度解析 - 指南

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

CF506E Mr. Kitayutas Gift

没见过的套路,还是很神的。模数写成 \(10^4+5\) 调了 1h /fn。 首先记 \(m=|S|+n\)。 计数考虑 dp。插入字符使其成为回文串 dp 显然是困困难难的。 考虑从最终插入字符后的结果入手,则对于回文串 \(T\) 能通过 \(S\…

记录一次成功的springBoot

开发您的第一个 Spring Boot 应用程序本节介绍如何开发一个小型的“Hello World!” Web 应用程序,该应用程序突出显示了 Spring Boot 的一些关键功能。 您可以选择 Maven 或 Gradle 作为构建系统。 spring.io 网站包…