1. 为什么选择Python爬取笔趣阁小说作为一个经常追更网络小说的老书虫我深知手动复制粘贴章节的痛苦。去年我用Python写了个笔趣阁小说下载器之后每周能省下至少3小时追更时间。这个项目特别适合Python初学者练手——既能学到requests网络请求、XPath解析这些核心技能又能做出实用的工具。相比其他爬虫项目笔趣阁有三大优势一是网页结构简单没有复杂反爬二是内容纯文本不需要处理图片验证码三是数据量大单本小说就有几百个章节页面能充分练习循环和异常处理。我带的编程新手学员第一个实战项目基本都是这个成功率高达90%。2. 环境准备与依赖安装2.1 Python版本选择推荐使用Python 3.8版本我在Windows 10和MacOS Monterey上都测试通过。用以下命令检查版本python --version # 或 python3 --version如果版本低于3.8建议通过 Python官网 升级。安装时务必勾选Add Python to PATH选项。2.2 必备库安装打开终端运行这些命令pip install requests lxml tqdmrequests比urllib更人性化的HTTP库lxml解析HTML的神器比BeautifulSoup快3倍tqdm给循环加进度条避免程序假死焦虑遇到过安装报错的同学可以试试清华源pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests lxml tqdm3. 网页结构分析与爬取策略3.1 笔趣阁的页面特点以《圣墟》为例它的目录页URL是http://www.biquzw.com/13/13959/。打开开发者工具F12能看到所有章节链接都在dd标签下的a标签里章节URL是相对路径需要拼接域名正文内容在div idcontent中段落用br分隔3.2 反爬机制应对笔趣阁的反爬比较温和但建议添加User-Agent头模拟浏览器每请求一个页面sleep 1秒遇到503错误时自动重试这是我常用的请求头headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 }4. 核心代码实现4.1 目录爬取与解析def get_chapter_list(url): import requests from lxml import etree from tqdm import tqdm res requests.get(url).content html etree.HTML(res) chapters [] base_url http://www.biquzw.com for link in tqdm(html.xpath(//dd/a/href), desc解析目录): full_url base_url link chapters.append(full_url) return chapters这段代码的关键点用etree.HTML将HTML转为可查询对象//dd/a/href这个XPath获取所有章节链接tqdm包装迭代对象显示进度条4.2 正文内容提取def get_chapter_content(url): res requests.get(url).content html etree.HTML(res) content html.xpath(//div[idcontent]/text()) cleaned [text.strip() for text in content if text.strip()] return \n.join(cleaned)处理正文时的常见问题用strip()去除首尾空白过滤空字符串if text.strip()用换行符连接段落5. 批量下载与本地存储5.1 文件存储优化不建议一次性写入所有内容改用追加模式with open(novel.txt, a, encodingutf-8) as f: for i, url in enumerate(chapters): content get_chapter_content(url) f.write(f第{i1}章\n{content}\n\n) time.sleep(1) # 礼貌爬取5.2 断点续爬实现突然中断后重新爬取很麻烦可以记录已下载章节if os.path.exists(progress.log): with open(progress.log, r) as f: downloaded set(f.read().splitlines()) else: downloaded set() for url in chapters: if url in downloaded: continue # 下载代码... with open(progress.log, a) as f: f.write(url \n)6. 功能扩展小说搜索6.1 搜索接口分析通过抓包发现笔趣阁搜索是POST请求search_url http://www.biquzw.com/modules/article/search.php params { searchkey: 圣墟, submit: } response requests.post(search_url, dataparams)6.2 搜索结果解析用XPath提取书名和URLhtml etree.HTML(response.text) books html.xpath(//tr[idnr]/td[1]/a) for book in books: title book.xpath(./text())[0] link book.xpath(./href)[0]7. 完整源码与使用教程项目已上传GitHub包含基础爬取版basic_crawler.py带搜索功能版search_crawler.py图形界面版用PySimpleGUI实现使用方法git clone https://github.com/example/novel-crawler cd novel-crawler python search_crawler.py输入书名后会自动搜索并显示结果列表选择要下载的书籍显示实时下载进度生成格式化的TXT文件8. 常见问题解决方案Q1 中文乱码怎么办确保文件用utf-8编码打开请求后设置response.encoding utf-8Q2 被封IP了怎么处理使用代理IP池需自行搭建降低请求频率到2秒/页修改User-Agent模拟不同设备Q3 章节顺序错乱检查目录页的排序是否正常在文件名前补零f{i:04d}.txt最后提醒爬取公开数据请遵守robots.txt协议不要给服务器造成过大压力。这个项目仅用于学习交流建议下载后24小时内删除。