游客发表
第一次用Python写爬虫下小说,爬虫是小说下载因为追的一部连载断更了。作者跑路,爬虫网站还在,小说下载章节页面挂着,爬虫就是小说下载没法批量保存。手动复制粘贴了三十多章之后,爬虫我放弃了。小说下载打开编辑器,爬虫写了不到五十行代码,小说下载二十分钟后,爬虫整本书躺在本地文件夹里。小说下载那一刻的爬虫感觉,比读完小说本身还爽。小说下载
爬虫小说下载器的爬虫核心逻辑其实很朴素:找到目录页,提取所有章节链接,逐个请求章节页面,把正文抠出来,按顺序写进一个txt文件。难的不是写代码,难的是对付各种网站的反爬机制和页面结构差异。
我第一个版本用的是requests加BeautifulSoup。目标站点很友好,没有JS渲染,没有加密,章节内容直接嵌在<div id="content">里。代码跑通那一刻,我甚至觉得爬虫不过如此。然后换了一个站,同样的代码返回的全是乱码。查了半天才发现对方用了gbk编码,而requests默认按utf-8解码。加一行response.encoding = 'gbk'就解决了。这种坑踩过一次就忘不了。
真正麻烦的是那些把正文拆成多段、中间穿插广告的站点。有一回我抓下来的内容里混着“请收藏本站最新地址”和“本章未完,请点击下一页继续阅读”。前者用正则过滤就行,后者意味着章节被分页了。你得在页面里找到“下一页”的链接,循环请求,直到没有下一页为止。这个逻辑写起来不复杂,但调试的时候容易陷入死循环——如果判断条件写错,爬虫会一直在同一页打转。
速度也是个问题。单线程逐个请求,一章大概零点几秒,一千章就是好几分钟。后来我加了concurrent.futures的线程池,同时开十个请求,时间直接压到几十秒。但线程开多了会被封IP。有一次我设了二十个线程,爬到第三百章的时候服务器返回403,等了半小时才恢复。从那以后我学乖了,线程数控制在五到八之间,每个请求之间加time.sleep(0.3)。慢是慢了点,但稳定。
还有一类站点用JavaScript动态加载内容。你直接请求HTML,拿到的只是一个空壳,正文得等浏览器执行完JS才出现。这种就得换Selenium或者Playwright,启动一个无头浏览器去渲染页面。资源消耗大,速度慢,但没办法。我见过一个小说站,目录页是静态的,章节页却是动态的,典型的防爬设计。用Selenium跑完一本书,风扇呼呼转,但至少能拿到完整内容。
写多了之后,我慢慢攒出一套自己的模板。配置文件里放站点域名、目录页URL、章节链接的选择器、正文的选择器、编码方式、是否需要浏览器渲染。换一个站,改几行配置就能跑。这套东西谈不上优雅,但够用。有次朋友让我帮忙下本小说,我花了三分钟改配置,五分钟跑完,他以为我写了什么了不起的工具。其实核心代码不到两百行。
说到底,爬虫小说下载器就是一个把“手动操作”翻译成“自动流程”的东西。它不神秘,也不万能。遇到验证码、登录墙、加密接口,照样得跪。但对付大多数普通小说站,它足够让你把喜欢的书安安静静存到本地,不再受网络和广告的打扰。这大概就是技术控最朴素的快乐。
友情链接