在线浏览“秀人网合集”的新思路:30 行 Python 把封面图链接秒变本地可点图库

在线浏览“秀人网合集”的新思路:30 行 Python 把封面图链接秒变本地可点图库

用 30 行 Python 把秀人网公开合集“搬”进本地数据库

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

“秀人网”近日上线的新主题合集页采用前端渲染,数据通过 /api/v2/theme/list 接口一次性返回 JSON,无需模拟点击“加载更多”。接口无登录限制,但带 5 秒滑动窗口的 IP 频次校验:单 IP >30 次/分即返回 429。本文示范如何遵守 robots 协议、放缓速率,仅采集“公开可见”字段,并给出断点续抓、User-Agent 随机化、异常重试等常用技巧。
核心思路三步走:
分析列表接口:在浏览器 DevTools 里筛选 XHR,发现真实请求 URL 形如
https://www.xiuren.net/api/v2/theme/list?page={page}&size=20,返回体含 data.total 与 data.list。
解析单条记录:字段 title、author、coverUrl 即为我们需要的元数据,无需再进详情页。
限速+重试:用 tenacity 的 @retry(stop=stop_after_attempt(3)) 装饰器,遇到 429 自动退避 10 秒;全局速率 time.sleep(random.uniform(1, 2)),确保平均 <30 次/分。
运行环境:Python≥3.7,依赖如下
pip install requests pandas tenacity fake-useragent
代码(文件 save_xiuren_meta.py):

#!/usr/bin/env python3# -*- coding: utf-8 -*-""" 抓取秀人网公开主题合集元信息,仅采集 title/author/coverUrl 三字段。 仅供学习,请遵守平台 robots.txt 与相关法律法规。 """import csv, time, random, requests from tenacity import retry, stop_after_attempt, wait_fixed from fake_useragent import UserAgent BASE_URL ="https://www.xiuren.net/api/v2/theme/list" CSV_FILE ="xiuren_meta.csv" PAGE_SIZE =20 MAX_PAGE =50# 按需调整,0 表示抓全量 SLEEP_RANGE =(1,2)# 秒,随机休眠 ua = UserAgent() session = requests.Session() session.headers.update({"Referer":"https://www.xiuren.net/"})@retry(stop=stop_after_attempt(3), wait=wait_fixed(10))deffetch_one_page(page:int): session.headers.update({"User-Agent": ua.random}) params ={"page": page,"size": PAGE_SIZE} resp = session.get(BASE_URL, params=params, timeout=10)if resp.status_code ==429:raise Exception("Rate limited") resp.raise_for_status()return resp.json()defmain(): writer =Nonefor p inrange(1, MAX_PAGE +1):print(f"[+] 正在抓取第 {p} 页 …") js = fetch_one_page(p) rows =[{"title": item["title"],"author": item["author"],"coverUrl": item["coverUrl"]}for item in js["data"]["list"]]ifnot writer: writer = csv.DictWriter(open(CSV_FILE,"w", newline="", encoding="utf-8"), fieldnames=["title","author","coverUrl"]) writer.writeheader() writer.writerows(rows)if js["data"]["total"]<= p * PAGE_SIZE:break time.sleep(random.uniform(*SLEEP_RANGE))print(f"[√] 抓取完成,已写入 {CSV_FILE}")if __name__ =="__main__": main()

运行后同级目录生成 xiuren_meta.csv,可导入 Excel 或数据库二次分析。若需增量更新,可把 CSV_FILE 改为 SQLite,并在写入前按 title 做唯一索引去重。
再次提醒:
仅抓取“公开可见”字段,不绕过登录、不破解加密参数;
速率温和,不干扰站点正常服务;
数据勿商用,尊重原作者版权。
祝各位读者调试顺利,也欢迎把改进方案提交到开源社区,共同维护良好的技术交流氛围。

Read more

C++ 继承入门(上):从基础概念定义到默认成员函数,吃透类复用的核心逻辑

C++ 继承入门(上):从基础概念定义到默认成员函数,吃透类复用的核心逻辑

🔥小叶-duck:个人主页 ❄️个人专栏:《Data-Structure-Learning》 《C++入门到进阶&自我学习过程记录》《算法题讲解指南》--从优选到贪心 ✨未择之路,不须回头 已择之路,纵是荆棘遍野,亦作花海遨游 目录 前言 一. 继承的概念与定义   1、继承的核心概念   2、继承的定义格式   3、继承方式与成员访问权限 二. 基类与派生类的转换:子类对象能当父类用吗? 三. 继承中的作用域:同名成员会冲突吗?   1、变量隐藏   2、函数隐藏 四、派生类的默认成员函数:构造、拷贝、析构怎么写?   1、构造函数:先调用父类构造,再初始化子类成员   2、拷贝构造:先拷贝父类,再拷贝子类   3、 赋值重载:

By Ne0inhk
2024第十五届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组

2024第十五届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组

记录刷题的过程、感悟、题解。 希望能帮到,那些与我一同前行的,来自远方的朋友😉 大纲:  1、握手问题-(解析)-简单组合问题(别人叫她 鸽巢定理)😇,感觉叫高级了  2、小球反弹-(解析)-简单物理问题,不太容易想  3、好数-(解析)-简单运用分支计算  4、R 格式-(解析)-高精度,不是快速幂😉  5、宝石组合-(解析)-lcm推论(gcd、lcm结合)  6、数字接龙-(解析)-DFS(蓝桥专属、每年必有一道)  7、拔河-(解析)-定一端,动一端😎 题目: 1、握手问题 问题描述

By Ne0inhk