102302125 苏琎宇 数据采集第1次作业

news/2025/10/28 16:32:48/文章来源:https://www.cnblogs.com/jadevoice/p/19172159

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

在分析网站的数据结构和请求方式后,发现无法像普通分页网页那样简单地循环请求分页数据,原因主要是:

数据是通过前端 JS 动态生成的

  • 网站使用 Nuxt.js(或类似 SPA 框架)渲染页面内容。
  • 页面里的数据(大学排名、详细信息等)并不是直接在 HTML 里,而是存储在一个 JS 对象里,例如:
__NUXT_JSONP__("/rankings/bcur/2020", function(...) { return { data: [...], fetch: {...} }})

image

  • 也就是说 每页的数据都在 JS 文件里预加载,浏览器解析 JS 后才渲染到页面。
  • 对于爬虫而言,直接请求 HTML 无法获取 JS 渲染后的内容。

因此要爬取到全部大学排名信息无法使用urllib.request和BeautifulSoup这种传统做法

网络抓包分析后发现有一个payload.js文件拥有全部的数据

image

使用console查看

image

可以使用这一个console命令下载到数据

image

image

import urllib.request                                                                
import re                                                                            
import csv                                                                           def fetch_html(url):                                                                 headers = {                                                                      "User-Agent": (                                                              "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "                             "AppleWebKit/537.36 (KHTML, like Gecko) "                                "Chrome/128.0.0.0 Safari/537.36"                                         )                                                                            }                                                                                req = urllib.request.Request(url, headers=headers)                               with urllib.request.urlopen(req, timeout=5) as resp:                             return resp.read().decode('gb2312', errors='ignore')                         def parse_products(html):                                                            """ 使用正则从 HTML 中提取书包商品名称和价格 """                                 li_blocks = re.findall(r'<li[^>]*?>(.*?)</li>', html, re.S)                      products = []                                                                    for li in li_blocks:                                                             name_match = re.search(r'title="([^"]+)"', li)                               price_match = re.search(r'<span class="price_n">\s*(.*?)\s*</span>', li)     if name_match and price_match:                                               name = name_match.group(1).strip()                                       price = price_match.group(1).replace('&yen;', '¥').strip()               products.append((name, price))                                           return products                                                                  def save_to_csv(products, filename="dangdang_bookbag.csv"):                          """ 保存为 CSV 文件 """                                                          with open(filename, "w", newline="", encoding="utf-8-sig") as file:              writer = csv.writer(file)                                                    writer.writerow(["序号", "价格", "商品名"])                                  for idx, (name, price) in enumerate(products, start=1):                      writer.writerow([idx, price, name])                                      print(f"\n✅ 数据已成功保存到文件:{filename}")                                  def main():                                                                          url = "https://search.dangdang.com/?key=%CA%E9%B0%FC&category_id=10009684#J_tab" print("开始爬取当当网“书包”商品数据...\n")                                       try:                                                                             html = fetch_html(url)                                                       products = parse_products(html)                                              print(f"共爬取到 {len(products)} 件有效商品,正在保存到CSV...")              save_to_csv(products)                                                        except Exception as e:                                                           print("❌ 爬取失败:", e)                                                    print("\n爬取任务结束!")                                                        if __name__ == "__main__":                                                           main()                                                                           

运行结果:
image

用requests和re库方法设计某个商城(自已选择)商品比价定向爬虫,爬取该商城,以关键词“书包”搜索页面的数据,爬取商品名称和价格。

import urllib.request
import re
import csvdef fetch_html(url):headers = {"User-Agent": ("Mozilla/5.0 (Windows NT 10.0; Win64; x64) ""AppleWebKit/537.36 (KHTML, like Gecko) ""Chrome/128.0.0.0 Safari/537.36")}req = urllib.request.Request(url, headers=headers)with urllib.request.urlopen(req, timeout=5) as resp:return resp.read().decode('gb2312', errors='ignore')def parse_products(html):""" 使用正则从 HTML 中提取书包商品名称和价格 """li_blocks = re.findall(r'<li[^>]*?>(.*?)</li>', html, re.S)products = []for li in li_blocks:name_match = re.search(r'title="([^"]+)"', li)price_match = re.search(r'<span class="price_n">\s*(.*?)\s*</span>', li)if name_match and price_match:name = name_match.group(1).strip()price = price_match.group(1).replace('&yen;', '¥').strip()products.append((name, price))return productsdef save_to_csv(products, filename="dangdang_bookbag.csv"):""" 保存为 CSV 文件 """with open(filename, "w", newline="", encoding="utf-8-sig") as file:writer = csv.writer(file)writer.writerow(["序号", "价格", "商品名"])for idx, (name, price) in enumerate(products, start=1):writer.writerow([idx, price, name])print(f"\n✅ 数据已成功保存到文件:{filename}")def main():url = "https://search.dangdang.com/?key=%CA%E9%B0%FC&category_id=10009684#J_tab"print("开始爬取当当网“书包”商品数据...\n")try:html = fetch_html(url)products = parse_products(html)print(f"共爬取到 {len(products)} 件有效商品,正在保存到CSV...")save_to_csv(products)except Exception as e:print("❌ 爬取失败:", e)print("\n爬取任务结束!")if __name__ == "__main__":main()

image

爬取一个给定网页(https://news.fzu.edu.cn/yxfd.htm)或者自选网页的所有JPEG、JPG或PNG格式图片文件

import re
import urllib.request
import os
from colorama import Fore, Style, initinit(autoreset=True)# ------------------------------
# 1. 下载网页
# ------------------------------
def get_html(url):headers = {"User-Agent": "Mozilla/5.0"}req = urllib.request.Request(url, headers=headers)with urllib.request.urlopen(req) as response:html = response.read().decode("utf-8", errors="ignore")return html# ------------------------------
# 2. 提取 JPG / JPEG / PNG 图片链接
# ------------------------------
def get_image_links(html, base_url):# 匹配 jpg, jpeg, png 图片链接pattern = re.compile(r'src="([^"]+\.(?:jpg|jpeg|png))"', re.IGNORECASE)links = pattern.findall(html)domain = re.match(r"(https?://[^/]+)", base_url).group(1)full_links = []for link in links:if link.startswith("http"):full_links.append(link)elif link.startswith("/"):full_links.append(domain + link)else:full_links.append(base_url.rsplit("/", 1)[0] + "/" + link)return list(set(full_links))# ------------------------------
# 3. 下载图片
# ------------------------------
def download_images(links, folder="images"):if not os.path.exists(folder):os.makedirs(folder)for i, url in enumerate(links, start=1):try:ext = os.path.splitext(url)[1].split('?')[0]  # 自动识别扩展名filename = os.path.join(folder, f"img_{i}{ext}")urllib.request.urlretrieve(url, filename)print(Fore.GREEN + f"下载成功: {filename}")except Exception as e:print(Fore.RED + f"下载失败: {url} ({e})")# ------------------------------
# 4. 主程序
# ------------------------------
if __name__ == "__main__":base_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",]all_links = []for page in base_pages:print(f"\n正在爬取页面: {page}")html = get_html(page)links = get_image_links(html, page)print(f"  找到 {len(links)} 张图片")all_links.extend(links)# 去重all_links = list(set(all_links))print(f"\n共提取 {len(all_links)} 张图片,开始下载...\n")download_images(all_links)print("\n✅ 所有图片下载完成!")                             

image

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

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

相关文章

哈希优化策略

哈希优化策略哈希优化策略算法题中,我们常通过将线性查找替换为哈希查找来降低算法的时间复杂度。我们借助一个算法题来加深理解。Q:给定一个整数数组 nums 和一个目标元素 target ,请在数组中搜索“和”为 target …

一站式开发速查表大全 - 覆盖主流编程语言与工具

这是一个全面的编程速查表集合项目,涵盖了从基础编程语言到现代开发框架的完整参考资料。包含JavaScript、Python、Java、Go等主流语言,以及React、Vue、Angular等前端框架,还有Docker、Kubernetes、Git等开发工具的…

gcc系编译器、调试器的应用和c/c++编译原理

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

JAVA FX初次使用并制作辅助工具指南

JAVA FX初次使用并制作辅助工具指南先上功能截图讲讲第一次使用的体验。 JAVA FX还是非常友好很好使用的 IDEA新建FX项目的时候就能把很多功能都选上。 这些pom是适配了jdk21的,不同版本的fx组件适配jdk也不一样,我是…

Day6综合案例1-体育新闻列表

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">…

题解:AT_agc015_e [AGC015E] Mr.Aoki Incubator

原题链接:link。 自然想到建立坐标系,以速度为纵轴,初始点为横轴。 以样例二为例来分析:考虑将点两两连线: ` 其中红线为斜率为负数的线,容易知道点 \((x_i,v_i)\) 与点 \((x_j,v_j)\) 所连成的线的斜率为 \(\fr…

SNP特征通道数是什么意思

在《【已阅】cropformer.pdf》的基因组预测场景中,“SNP特征通道数”本质是SNP基因型经过编码后,每个SNP位点对应的数值特征所占用的“维度/通道数量”,是Hyena算子、CNN等模型组件处理SNP数据时的核心维度参数(d_…

CF1482E Skyline Photo

绝世唐题,为啥没有人写题解啊。 首先发现划分成若干个段,设一个 DP \(f_i\) 表示以 \(i\) 结尾的分段方式的最大贡献,那么朴素转移就是你去枚举区间取 \(\max\)。 发现是求 \(h\) 的最小值所对应的 \(b\),比较典的…

sqlserver 添加或修改字段

添加字段ALTER TABLE 表名 ADD 列名 数据类型 [约束];修改字段 ALTER TABLE 表名 ALTER COLUMN 列名 新数据类型;

最小瓶颈生成树

作业是鸽子更新的动力。\(\text{MBST}\)(\(\text{Minimum Bottleneck Spanning Tree}\))指的是求一颗生成树,其中最大的边权最小(所以也叫 \(\text{min-max spanning tree}\))。和最小树形图一样,也有有向图版本…

Linux系统常用操作指令简明指南

Linux系统常用操作指令简明指南 熟练掌握Linux命令是每个开发者的基本功。这份指南凝聚了我多年开发经验中的精华,将帮助您提高工作效率,解决实际问题。请记住,Linux哲学的核心在于"每个工具做好一件事,然后将…

小程序语音通话让智能设备会“说话”

小程序语音通话让智能设备会“说话”在万物互联的智能时代,如何让智能设备与用户建立更自然、更高效的连接,成为产品脱颖而出的关键。传统的APP推送常因步骤繁琐、易被淹没而效率低下,微信小程序语音通话应运而生,…

易基因: NG (IF29):颠覆认知!深圳仙湖植物园刘阳团队WGBS及超级泛基因组分析揭示苔藓植物基因家族比维管植物更丰富|项目文章

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 近日,由深圳市中国科学院仙湖植物园董珊珊博士等为第一作者、刘阳研究员等为通讯作者,在国际著名期刊《Nature Genetics》(自然-遗传学)上发表题…

2025年口碑好的工业制冷供应厂家推荐

文章摘要 本文深入解析2025年工业制冷供应厂家的关键选择标准,聚焦阜阳市展翼翔制冷技术有限公司的核心优势,包括设备集成化、高效制冷技术和全生命周期服务。通过技术参数分析和客户案例,帮助用户识别口碑好的供应…

2025 年 150 吨地磅,180 吨地磅,200 吨地磅厂家最新推荐,产能、专利、环保三维数据透视!

引言 在港口运输、矿产开采、重型制造等领域,150 吨、180 吨、200 吨级地磅作为核心称重设备,其精度与稳定性直接关系到企业运营成本与数据可信度。当前市场中部分厂家存在大吨位产品承重性能不足、核心部件耐用性差…

MySql8.0公共表表达式『CTE』

Mysql8.0支持CTE语法,这样就支持递归查询树状结构表功能了,极大方便了树状结构表的处理CTE是『common table expression』的缩写,中文翻译过来就是『公共表表达式』,使用它可以为临时查询结果命名,命名后可以在后…

2025 年进口地磅,出口地磅,100 吨地磅,120 吨地磅厂家最新推荐,产能、专利、环保三维数据透视!

引言 随着全球地磅市场年复合增长率达到 4.2%,100 吨、120 吨等中大型地磅需求持续攀升,进口与出口贸易规模同步扩大,但市场品牌良莠不齐的问题仍未解决。为精准甄选优质厂家,本次测评联合行业权威机构,基于三大核…

精通CTS与低功耗时钟设计

1、CTS在数字化时代的重要性 在数字化时代,IC(集成电路)设计日趋复杂,性能与功耗成为设计中的核心挑战。时钟树合成(CTS,Clock Tree Synthesis)作为物理实现流程中的关键环节,其目标是建立一个时钟分布网络,让…

GISDataMgr(数据管理工具)

瓦片导出工具,按需可以对数据包进行按照区域导出默认按省导出数据:也可以自定义导出区域: