第二次作业:requests + JSON 数据采集与存储实践
第二次作业:requests + JSON 数据采集与存储实践
本次作业采用 Python 的 requests 库作为核心请求工具,分别对中国气象网、东方财富网和软科排名进行了数据采集。技术路线涵盖了两个方向:针对静态网页的 requests + BeautifulSoup 解析,以及针对动态网页通过 F12 抓包分析的 requests + json 解析。最终将清洗后的结构化数据统一存入 MySQL 数据库中。
作业①:中国气象网7日天气预报爬取
1)、爬取与存储实验
实验说明:
给定 3 个城市(北京 101010100、上海 101020100、广州 101280101),通过浏览器访问发现中国气象网的 7 日天气预报属于静态渲染页面,数据直接嵌套在 HTML 的 <ul class="t clearfix"> 标签下的 7 个 <li> 中。
因此使用 requests.get 发送请求获取网页源码,利用 BeautifulSoup 精准定位节点,提取了日期(h1)、天气状况(p.wea)、最高温(p.tem span)和最低温(p.tem i),最后使用 pymysql 的 executemany 批量将数据存入 MySQL 数据库。
F12调试:

数据库创建截图:
DBeaver建库建表

核心代码:发送请求 -> BeautifulSoup 解析 -> 提取 li 标签下的文本
import requests
from bs4 import BeautifulSoup
def get_weather_data(city_name, city_code):
url = f"http://www.weather.com.cn/weather/{city_code}.shtml"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0"}
response = requests.get(url, headers=headers)
response.encoding = 'utf-8'
soup = BeautifulSoup(response.text, 'lxml')
weather_list = []
for li in soup.select('ul.t.clearfix li'): # 核心选择器
date = li.select_one('h1').get_text(strip=True)
wea = li.select_one('p.wea').get_text(strip=True)
high = li.select_one('p.tem span').get_text(strip=True)
low = li.select_one('p.tem i').get_text(strip=True)
weather_list.append((city_name, date, wea, high, low))
return weather_list
运行结果截图:

MySQL 中 SELECT * FROM weather; 的数据:

Gitee文件夹链接:https://gitee.com/lilyluna/2026shujucaiji/blob/master/2/1.py
2)、心得体会
本次实验让我深刻认识到,判断网页的数据加载方式是选择爬虫方案的前提。而气象网属于典型的服务端渲染页面,数据直接嵌在 HTML 中,使用 requests + BeautifulSoup 就能高效完成采集,完全不需要引入复杂的浏览器自动化工具。此外,在入库过程中,我体会到了批量插入(executemany)在处理多条数据时的性能优势,让我对数据的持久化有了更直观的认识。
作业②:东方财富网股票信息定向爬取
1)、定向爬取与存储实验
实验说明:
通过 F12 的 Network 面板(切换至 Fetch/XHR)抓包,发现东方财富网的股票列表数据并非直接写在 HTML 里,而是由后端 API 动态返回 JSON 数据。
我定位到了接口地址 https://push2.eastmoney.com/api/qt/clist/get,并分析了请求参数:通过指定页码(pn)、每页数量(pz)以及所需的字段列表(fields,如 f12 代表代码、f14 代表名称、f2 代表最新价等)。使用 requests.get 构造对应参数请求后,直接调用 response.json() 将返回的 JSON 字符串解析为字典,提取数据后写入 MySQL。
F12调试:

数据库创建截图:
DBeaver建库建表

核心代码:构造 params 字典 -> 发送请求 -> 提取 response.json() 中的数据
import requests
import json
def fetch_stock_data(page=1, page_size=50):
url = "https://push2.eastmoney.com/api/qt/clist/get"
params = {
"pn": page, "pz": page_size, "po": 1, "np": 1,
"ut": "bd1d9ddb04089700cf9c27f6f7426281",
"fltt": 2, "invt": 2, "fid": "f3",
"fs": "m:0+t:6,m:0+t:13,m:0+t:80,m:1+t:2,m:1+t:23",
"fields": "f12,f14,f2,f3,f4,f5,f7,f15,f16,f17,f18"
}
headers = {"User-Agent": "Mozilla/5.0", "Referer": "https://quote.eastmoney.com/"}
response = requests.get(url, params=params, headers=headers)
data_dict = json.loads(response.text)
return data_dict.get("data", {}).get("diff", [])
运行结果截图:
控制台输出解析入库的股票数据:

MySQL 中 SELECT * FROM stocks; 的数据:

Gitee文件夹链接:https://gitee.com/lilyluna/2026shujucaiji/blob/master/2/2.py
2)、心得体会
本次实验的关键在于读懂并分析 API 的请求参数。通过 F12 抓包,我学会了如何从繁杂的网络请求中筛选出真正的数据接口。同时我发现,fields 参数可以直接控制服务器返回的字段,删减不需要的字段能有效减小响应体积。东方财富的 API 返回的是标准 JSON 格式,使用 json.loads 解析比去正则匹配或解析 HTML 表格要稳定、高效得多。这次实践让我掌握了“抓包 → 分析参数 → 构造请求 → 解析 JSON”的完整闭环。
作业③:软科2021中国大学排名爬取
1)、软科排名爬取实验
实验说明:
软科排名的网页属于前端动态渲染,直接按 F5 刷新时,Network 面板中找不到独立的 XHR 数据请求。通过分析发现,网页采用了 Nuxt.js 的服务端渲染 (SSR) 技术,首屏数据被直接打包在 payload.js 文件中。在 Network 面板点击 payload.js,发现其核心渲染函数为 NUXT_JSONP("/rankings/bcur/202611", ...),确认了数据源。结合路由缩写 202611 以及网页的 URL 规律,我推断出后两位 11 对应接口参数 bcur_type=11,前四位 2021(或 2026)对应接口参数 year。
然后我使用 requests 携带对应的 params 发起请求,通过 json 解析后提取了排名、学校名称、省市、类型和总分,并成功入库。
F12 调试:

数据库创建截图:
DBeaver建库建表

核心代码:通过逆向 API 请求,直接拿取 JSON 数据
import requests
import json
def fetch_ranking_data():
url = "https://www.shanghairanking.cn/api/pub/v1/bcur"
params = {"bcur_type": "11", "year": "2021"}
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0"}
response = requests.get(url, params=params, headers=headers)
data_dict = json.loads(response.text)
return data_dict.get("data", {}).get("rankings", [])
运行结果截图:
控制台输出入库结果:

MySQL 中 SELECT * FROM rankings; 的数据:

Gitee文件夹链接:https://gitee.com/lilyluna/2026shujucaiji/blob/master/2/3.py
2)、心得体会
软科排名的作业让我进一步熟练了F12抓包定位API的全过程。通过录制 GIF,我完整复盘了自己从“打开开发者工具”到“筛选出目标请求”的排查思路。
三次作业做完,我有了一个核心的领悟:数据的定位,决定了解析手段的选择。静态网页用 BeautifulSoup 解析 DOM 树,动态网页抓包后直接用 json 解析字典,都是在 requests 生态下的数据采集方法。

浙公网安备 33010602011771号