当前位置: 首页 > news >正文

起点中文网小说爬虫实战:复用浏览器登录态,绕过登录墙

登录验证码、短信验证、滑块识别——爬虫最头疼的不是数据解析,而是登录认证。本文教你一个"降维打击"的思路:直接用浏览器已有的登录态,把爬虫变成浏览器的"搬运工"。


写在前面

写爬虫的人都知道,最难的不是解析 HTML,不是处理反爬,而是登录

起点中文网的登录体系相当健全:图形验证码、短信验证、滑块验证、设备指纹……你想要通过程序模拟登录,几乎每个环节都是一道坎。但换个思路:你已经在浏览器里登录了,Cookie 就在那,为什么还要再登一次?

这篇文章的核心技巧就是一句话:从 Chrome 浏览器中直接读取登录 Cookie,注入到 Python requests 中,让爬虫"继承"浏览器的登录态。

学完这篇文章,你将掌握:

  • 从 Chrome 本地数据库中提取 Cookie 的两种方法
  • requests.Session携带 Cookie 发起请求
  • 解析起点小说章节列表和正文内容
  • 反爬规避策略(User-Agent、Referer、请求频率控制)
  • 将爬取结果输出为 TXT 和 EPUB 格式

声明:本文仅供技术学习,爬取内容请仅用于个人阅读已购买的章节,请勿用于商业用途或大规模抓取。

第一部分:核心原理——Cookie 即身份

1.1 为什么 Cookie 就是"登录态"?

当你登录起点中文网后,服务器会在你的浏览器中种下一组 Cookie。之后你每次访问起点,浏览器自动携带这些 Cookie,服务器一看——“哦,是老用户,已登录”。

这组 Cookie 就是你的"数字身份证"。只要 Python 能伪造出同样的 Cookie,服务器就分不清是浏览器还是爬虫。

1.2 Chrome 把 Cookie 存在哪?

Chrome 将 Cookie 存储在本地 SQLite 数据库中:

Windows: %LOCALAPPDATA%\Google\Chrome\User Data\Default\Network\Cookies (或 ...\User Data\Default\Network\Cookies) macOS: ~/Library/Application Support/Google/Chrome/Default/Cookies Linux: ~/.config/google-chrome/Default/Cookies

如果你用的是 Edge 浏览器,路径类似,把Google\Chrome换成Microsoft\Edge即可。

注意:直接读取这个文件需要 Chrome 没有在运行(Chrome 运行时会锁住数据库)。解决方法有两个:

  • 方法一:关闭 Chrome 再读(简单但不优雅)
  • 方法二:复制 Cookie 文件到临时目录再读(不影响浏览器使用)

第二部分:实战——从提取 Cookie 到爬取小说

2.1 安装依赖

pipinstallrequests beautifulsoup4 pycryptodome lxml ebooklib --break-system-packages

各依赖的作用:

依赖用途
requests发送 HTTP 请求
beautifulsoup4解析 HTML
lxmlHTML 解析加速
pycryptodome解密 Chrome 加密的 Cookie
ebooklib生成 EPUB 电子书(可选)

2.2 方法一:browser-cookie3 库(最简单)

这是最省事的方法,一个库搞定所有浏览器 Cookie 提取:

importbrowser_cookie3defget_cookies_from_chrome(domain:str="qidian.com")->dict:""" 从 Chrome 浏览器中提取指定域名的 Cookie 返回 requests 可用的 cookies 字典 """try:# 加载 Chrome 的所有 Cookiecj=browser_cookie3.chrome(domain_name=domain)# 转换为字典cookies={}forcookieincj:cookies[cookie.name]=cookie.valuereturncookiesexceptExceptionase:print(f"提取 Cookie 失败:{e}")print("提示: 请确保 Chrome 已关闭,或使用手动导出方式")return{}

使用前先安装:

pipinstallbrowser-cookie3 --break-system-packages

方法一的局限browser-cookie3在某些新版 Chrome 上可能会因为加密方式变化而读取失败。此时可以用方法二。

2.3 方法二:手动导出 Cookie(最稳定)

如果方法一不生效,可以用一个更稳的方式——从 Chrome 开发者工具手动导出:

步骤

1. 打开起点中文网并登录 2. 按 F12 打开开发者工具 3. 切换到 Application(应用程序)标签 4. 左侧找到 Storage → Cookies → https://www.qidian.com 5. 全选所有 Cookie → 右键 → 导出为 JSON 6. 保存为 cookies.json

加载导出的 Cookie

importjsondefload_cookies_from_json(filepath:str="cookies.json")->dict:"""从 Chrome 导出的 JSON 文件加载 Cookie"""withopen(filepath,"r",encoding="utf-8")asf:cookies_list=json.load(f)cookies={}foritemincookies_list:cookies[item["name"]]=item["value"]print(f"✓ 成功加载{len(cookies)}个 Cookie")returncookies

Chrome 导出的每个 Cookie 对象的结构:

[{"name":"token_key","value":"eyJhbGciOiJSUzI1NiJ9...","domain":".qidian.com","path":"/","expires":1748563200,"httpOnly":true,"secure":true}]

2.4 方法三:直接读取 Chrome 的 SQLite 数据库(进阶)

如果你不想手动导出,又想让程序全自动运行:

importosimportsysimportsqlite3importshutilfrompathlibimportPathdefget_chrome_cookies(domain:str="qidian.com")->dict:""" 直接从 Chrome 的 SQLite 数据库中读取 Cookie 自动处理数据库锁定问题(复制到临时目录) """# 确定 Chrome Cookie 文件路径ifsys.platform=="win32":cookie_path=Path(os.environ["LOCALAPPDATA"])/\"Google/Chrome/User Data/Default/Network/Cookies"elifsys.platform=="darwin":cookie_path=Path.home()/\"Library/Application Support/Google/Chrome/Default/Cookies"else:cookie_path=Path.home()/\".config/google-chrome/Default/Cookies"ifnotcookie_path.exists():raiseFileNotFoundError(f"Chrome Cookie 文件未找到:{cookie_path}")# 复制到临时目录(绕过 Chrome 的文件锁)temp_path=Path.home()/"temp_chrome_cookies.db"shutil.copy2(cookie_path,temp_path)try:conn=sqlite3.connect(str(temp_path))cursor=conn.cursor()# 查询指定域名的 Cookiecursor.execute("SELECT name, encrypted_value FROM cookies WHERE host_key LIKE ?",(f"%{domain}%",))cookies={}forname,encrypted_valueincursor.fetchall():try:# Chrome v80+ 使用 AES-256-GCM 加密value=decrypt_chrome_cookie(encrypted_value)ifvalue:cookies[name]=valueexceptException:# 某些 Cookie 可能未加密ifencrypted_value:cookies[name]=encrypted_value.decode("utf-8",errors="ignore")conn.close()returncookiesfinally:# 清理临时文件iftemp_path.exists():temp_path.unlink()defdecrypt_chrome_cookie(encrypted_value:bytes)->str:""" 解密 Chrome 加密的 Cookie 值 Chrome 在 Windows 上使用 DPAPI (Data Protection API) 加密 macOS 上使用 Keychain Linux 上使用 GNOME Keyring 或明文 """importsysifsys.platform=="win32":# Windows: 使用 DPAPI 解密importwin32crypttry:returnwin32crypt.CryptUnprotectData(encrypted_value,None,None,None,0)[1].decode("utf-8")exceptException:return""elifsys.platform=="darwin":# macOS: 使用 Security 框架# Chrome 在 macOS 上的加密方式较复杂,建议用 browser-cookie3return""else:# Linux: Chrome 通常不加密returnencrypted_value.decode("utf-8",errors="ignore")

Windows 用户额外安装

pipinstallpywin32 --break-system-packages

第三部分:构建起点小说爬虫

有了 Cookie,剩下的就是标准的爬虫流程了。

3.1 爬虫主类

importreimporttimeimportrandomimportrequestsfrompathlibimportPathfromtypingimportOptionalfrombs4importBeautifulSoupclassQidianNovelSpider:"""起点中文网小说爬虫"""BASE_URL="https://www.qidian.com"def__init__(self,cookies:dict=None,cookie_file:str=None):self.session=requests.Session()# 设置请求头——伪装成正常浏览器self.session.headers.update({"User-Agent":("Mozilla/5.0 (Windows NT 10.0; Win64; x64) ""AppleWebKit/537.36 (KHTML, like Gecko) ""Chrome/130.0.0.0 Safari/537.36"),"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language":"zh-CN,zh;q=0.9,en;q=0.8","Accept-Encoding":"gzip, deflate, br","Connection":"keep-alive","Cache-Control":"max-age=0",})# 加载 Cookieifcookies:self._set_cookies(cookies)elifcookie_file:self._load_cookies_from_file(cookie_file)def_set_cookies(self,cookies:dict):"""设置 Cookie"""forname,valueincookies.items():self.session.cookies.set(name,value,domain=".qidian.com")print(f"✓ 已注入
http://www.jsqmd.com/news/737795/

相关文章:

  • 抖音批量下载工具:免费开源的高效内容管理解决方案
  • qmcdump:一键解锁QQ音乐加密文件的音乐自由神器
  • 终极文档下载解决方案:kill-doc浏览器脚本完全指南
  • Windows 11任务栏歌词插件:让歌词显示在任务栏上的完美解决方案
  • 对比直接使用厂商API体验Taotoken在计费透明与观测方面的差异
  • 0501晨间日记
  • 从Inception到Xception:深度可分离卷积如何让我的模型参数量减半,效果反而更好?
  • Taskmaster:AI编程任务管理神器,告别碎片化指令,实现结构化协作
  • 基于Go的分布式爬虫调度框架goclaw:从原理到实战部署
  • 如何用Nucleus Co-Op在PC上实现终极分屏多人游戏体验
  • 微信好友检测终极指南:3步找出谁偷偷删了你
  • 别再让电源噪声搞砸你的DSP时钟!手把手教你为TI/ADI DSP的PLL设计Pi/T型滤波电路
  • 如何在Windows上轻松使用Switch图形化注入工具:TegraRcmGUI完整指南
  • 保姆级教程:在ROS Noetic上配置Husky机器人,用frontier_exploration实现指定区域自动建图
  • 揭秘Windows HEIC缩略图的神奇魔法:让iPhone照片在Windows上“活“起来
  • 如何通过3步实现115网盘视频在Kodi中的智能播放
  • Swoole WebSocket + LLM上下文持久化方案:支持10万+并发会话的RedisJSON+LRU-GC混合缓存设计
  • 如何彻底解决机械键盘按键抖动问题:终极键盘防抖软件指南
  • 鸣潮自动化助手:基于图像识别的智能游戏辅助解决方案终极指南
  • VMware Workstation Pro 17许可证密钥:1000+免费密钥获取与激活完全指南
  • 别再只用ASPP了!手把手教你用PyTorch给ASPP加上CBAM注意力模块(附完整代码)
  • Bioicons:3000+免费科学矢量图标库 - 科研工作者的终极可视化解决方案
  • 终极键盘连击修复方案:KeyboardChatterBlocker完整使用手册
  • ICode竞赛Python四级通关秘籍:用while循环解决‘等待消失’和‘能量收集’关卡
  • 3个强力功能让老旧iOS设备重获新生:Legacy-iOS-Kit全面指南
  • TCL空调借AI冲击高端,能否打破空调赛道格局?
  • GEOScore MCP:AI搜索优化工具实战指南,提升网站GEO表现
  • 【maaath】 Flutter for OpenHarmony 快捷工具箱应用实战开发
  • 观察接入Taotoken前后API调用的平均延迟与成功率变化
  • RimSort权限问题深度解析:SteamCMD下载失败的3种系统级解决方案