REC

Python 利用无头浏览器爬虫爬取笔趣阁小说

教主
1月23日发布 /正在检测是否收录...

前言

用户有需求,需要将笔趣阁的小说便捷地保存为文档到本地。笔趣阁有反爬措施,小说内容为JS动态生成,Python的requests库与requests_html已无法满足需求,因此使用类似selenium但非selenium的无头浏览器爬虫实现小说爬取。

教程步骤

  1. 下载安装Chromium
  2. 明确Chromium默认安装路径
  3. 编写代码
  4. 明白爬取参数与注意事项
  5. 开始爬取
  6. 查看结果

步骤1. 下载安装Chromium

下载方式一:官网下载 -> Chromium下载链接

下载方式二:夸克网盘下载保存 -> Chromium下载器

下载后,直接双击安装器完成安装。


步骤2. 明确Chromium默认安装路径

安装后,需要明确默认安装的位置,因为代码中会用到。我的电脑用户名为AW,因此被安装在了如下路径:C:\Users\AW\AppData\Local\Chromium\Application\chrome.exe


步骤3. 编写代码

这段代码中用到的库主要为pyppeteerpython-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文件,章节标题和内容将整齐排列,还可通过章节导航快速定位。
结语

此教程适用于Python初学者,后续可优化为PyQt程序,提升用户体验。

© 版权声明
本站用户发帖仅代表本站用户个人观点,并不代表本站赞同其观点和对其真实性负责。
转载本网站任何内容,请按照转载方式正确书写本站原文地址。
THE END
喜欢就支持一下吧
点赞 1 分享 赞赏
评论 抢沙发
取消 登录评论