前言
用户有需求,需要将笔趣阁的小说便捷地保存为文档到本地。笔趣阁有反爬措施,小说内容为JS动态生成,Python的requests
库与requests_html
已无法满足需求,因此使用类似selenium但非selenium的无头浏览器爬虫实现小说爬取。
教程步骤
- 下载安装Chromium
- 明确Chromium默认安装路径
- 编写代码
- 明白爬取参数与注意事项
- 开始爬取
- 查看结果
步骤1. 下载安装Chromium
下载方式一:官网下载 -> Chromium下载链接
下载方式二:夸克网盘下载保存 -> Chromium下载器
下载后,直接双击安装器完成安装。
步骤2. 明确Chromium默认安装路径
安装后,需要明确默认安装的位置,因为代码中会用到。我的电脑用户名为AW
,因此被安装在了如下路径:C:\Users\AW\AppData\Local\Chromium\Application\chrome.exe
步骤3. 编写代码
这段代码中用到的库主要为pyppeteer
和python-docx
,这两个库需额外下载。
最终代码如下:
import asyncio
import os
from docx import Document
from pyppeteer import launch
# 禁用自动下载Chromium
os.environ["PYPPETEER_SKIP_CHROMIUM_DOWNLOAD"] = "true"
async def main():
wordName = "宿命之环1~3章.docx" # Word文件名
netName = "https://www.22biqu.com" # 笔趣阁域名
firstPagePath = "/biqu5251/5259122.html" # 起始页路径
endPagePath = "/biqu5251/5259124.html" # 结束页路径
catchUrl = netName + firstPagePath
pageCount = 0
endFlag = False
while True:
try:
doc = Document(wordName)
except:
doc = Document()
browser = await launch(executablePath=r'C:\Users\AW\AppData\Local\Chromium\Application\chrome.exe', headless=True)
page = await browser.newPage()
await page.goto(catchUrl)
element = await page.querySelector('h1.title')
if element:
text = await page.evaluate('(element) => element.innerText', element)
doc.add_heading(text, level=1)
else:
print('Element not found.')
content_element = await page.querySelector('#content')
if content_element:
paragraphs = await content_element.querySelectorAll('p')
for paragraph in paragraphs:
text = await page.evaluate('(p) => p.innerText', paragraph)
doc.add_paragraph(text)
else:
print('Content element not found.')
element = await page.querySelector('#next_url')
next_url = ""
if element:
next_url = await page.evaluate('(element) => element.getAttribute("href")', element)
catchUrl = netName + next_url
else:
print('Element not found.')
await browser.close()
doc.save(wordName)
if endFlag:
break
pageCount += 1
print("已完成页码" + str(pageCount))
if next_url == endPagePath:
print("匹配到结束链接:" + str(endPagePath))
print("即将结束")
endFlag = True
asyncio.run(main())
步骤4. 明白爬取参数与注意事项
在使用上述代码时,需要注意以下参数:wordName
:爬取后Word保存的名称,建议爬什么就取什么名,且加上多少章到多少章。firstPagePath
:起始页路径,比如从《宿命之环》第3章开始爬起,则路径为/biqu5251/5259124.html。endPagePath
:结束页路径,建议不要与起始页隔得太远,否则Word文件会因字数过多而卡顿。建议分章节爬取。
步骤5. 开始爬取
设置好参数后,直接运行代码即可。爬取完成后,小说将以Word文档形式保存到本地。
步骤6. 查看结果
打开保存的Word文件,章节标题和内容将整齐排列,还可通过章节导航快速定位。
结语