爬取小说资源的Python实践:从单线程到多线程的效率飞跃

爬取小说资源的Python实践:从单线程到多线程的效率飞跃

前提声明

  • 爬虫应遵守目标网站的robots.txt协议,尊重版权和用户隐私。
  • 本代码仅供学习和研究使用,不得用于商业用途。
  • 请确保在合法合规的前提下使用本代码。
  • 本代码所爬取的小说资源为公开可下载的内容。

目录

  1. 引言
  2. 环境准备
  3. 爬虫程序概述
  4. 代码实现
    • [1. 导入必要的库](#1. 导入必要的库)
    • [2. 定义下载小说文本的函数](#2. 定义下载小说文本的函数)
    • [3. 设置请求头和目标URL](#3. 设置请求头和目标URL)
    • [4. 获取小说章节链接](#4. 获取小说章节链接)
    • [5. 多线程下载小说](#5. 多线程下载小说)
    • [6. 计算下载时间](#6. 计算下载时间)
  5. 性能优化
  6. 结语
  7. 注意事项
  8. 全部代码

引言

在当今信息爆炸的时代,获取和处理数据的能力变得尤为重要。对于小说爱好者来说,能够快速下载并阅读自己喜欢的小说无疑是一种享受。本文将介绍如何使用Python编写一个简单的爬虫程序,从笔趣阁网站爬取小说内容,并通过多线程技术提高下载效率。

环境准备

在开始之前,请确保您的Python环境已经安装了以下库:

  • requests:用于发送HTTP请求。
  • BeautifulSoup:用于解析HTML文档。
  • concurrent.futures:提供线程池和进程池的高级接口。

如果尚未安装,可以通过以下命令安装:

bash 复制代码
pip install requests beautifulsoup4

爬虫程序概述

爬虫程序主要分为以下几个步骤:

  1. 发送HTTP请求获取网页内容。
  2. 解析HTML文档,提取小说章节链接。
  3. 多线程下载小说章节内容。

代码实现

1. 导入必要的库

python 复制代码
import requests
from bs4 import BeautifulSoup
from concurrent.futures import ThreadPoolExecutor
from datetime import datetime

2. 定义下载小说文本的函数

python 复制代码
def down_txts(url):
    html = requests.get(url, headers=headers).text
    soup = BeautifulSoup(html, 'lxml')
    # ... 省略部分代码 ...

3. 设置请求头和目标URL

点击获取小说

python 复制代码
headers = {
    "User-Agent": "Mozilla/5.0 ..."
}
url = "https://www.bqgka.com/book/159995/" 

4. 获取小说章节链接

python 复制代码
res = requests.get(url, headers=headers)
soup = BeautifulSoup(res.text, 'lxml')
# ... 省略部分代码 ...

5. 多线程下载小说

python 复制代码
print("多线程下载")
with ThreadPoolExecutor(max_workers=len(urls)) as exe:
    for url in urls:
        exe.submit(down_txts, url)

6. 计算下载时间

python 复制代码
starttime = datetime.now()
endtime = datetime.now()
print(f"总共用时:{(endtime - starttime).seconds}秒")

性能优化

通过使用ThreadPoolExecutor,我们能够显著提高下载小说的效率。在本例中,线程池的大小设置为章节链接的数量,这可以充分利用多核CPU的优势,实现并行下载。

结语

本篇文章介绍了如何使用Python编写一个简单的爬虫程序,从笔趣阁网站爬取小说内容,并使用多线程技术提高下载效率。希望这篇文章能够帮助到对爬虫技术感兴趣的读者,也希望大家在使用爬虫技术时遵守相关法律法规,尊重版权。

效果展示


注意事项

  • 在使用爬虫技术时,请确保遵守目标网站的robots.txt协议。
  • 本文提供的代码仅供学习和研究使用,请勿用于商业用途或侵犯版权。
  • 请确保下载的内容符合当地法律法规,尊重作者的知识产权。

总结

本文旨在介绍如何使用Python编写爬虫程序,从特定网站爬取小说内容,并利用多线程技术提高下载效率。文章首先强调了在使用爬虫技术时,应遵守目标网站的robots.txt协议,尊重版权和用户隐私,并确保在合法合规的前提下使用代码。接着,文章详细介绍了环境准备、爬虫程序概述、代码实现、性能优化、结语和注意事项等几个部分。

在环境准备阶段,读者需要确保Python环境中安装了requestsBeautifulSoupconcurrent.futures等库。这些库分别用于发送HTTP请求、解析HTML文档和提供线程池的高级接口。文章通过具体的命令指导读者如何安装这些库。

爬虫程序概述部分,文章简要描述了爬虫程序的主要步骤,包括发送HTTP请求获取网页内容、解析HTML文档提取小说章节链接以及多线程下载小说章节内容。

代码实现部分是文章的核心,详细讲解了如何通过Python实现爬虫程序。首先,导入必要的库,然后定义下载小说文本的函数,设置请求头和目标URL。文章通过示例代码展示了如何使用requests库发起HTTP请求,并使用BeautifulSoup解析HTML文档,提取小说章节链接。接着,文章介绍了如何使用ThreadPoolExecutor实现多线程下载,以及如何计算下载时间。

性能优化部分,文章讨论了通过使用ThreadPoolExecutor实现多线程下载,可以显著提高下载小说的效率。这是因为线程池能够充分利用多核CPU的优势,实现并行下载。

结语部分,文章总结了如何使用Python编写爬虫程序,并利用多线程技术提高下载效率。文章强调了遵守相关法律法规、尊重版权的重要性,并鼓励读者将所学应用到更多有趣和有益的项目中去。

注意事项部分,文章再次提醒读者在使用爬虫技术时,要遵守目标网站的robots.txt协议,确保下载的内容符合当地法律法规,并尊重作者的知识产权。

最后,文章提供了完整的代码示例,包括导入库、定义下载函数、设置请求头和目标URL、获取小说章节链接、多线程下载小说和计算下载时间等步骤。通过这些步骤,读者可以学习如何发送HTTP请求、解析HTML文档,并使用线程池实现多线程下载,从而显著提高下载效率。

通过本文的学习和实践,读者不仅能够掌握如何使用Python爬取小说资源,还能深入理解网络请求、HTML解析和多线程编程的相关知识。希望读者能在遵守法律法规的前提下,将所学技能应用于实际项目中,提升自己的编程能力。

全部代码

python 复制代码
import requests
from bs4 import BeautifulSoup
from concurrent.futures import ThreadPoolExecutor
from datetime import datetime

def down_txts(url):
    html = requests.get(url, headers=headers).text
    soup = BeautifulSoup(html, 'lxml')

    # 修正查找元素的语法
    title_obj = soup.find("h1", class_="wap_none")
    con_obj = soup.find("div", id ="chaptercontent")

    if title_obj and con_obj:
        title = title_obj.get_text()  # 修正获取文本内容的方法
        title1 = con_obj.get_text()

        with open(f"D:\\小说\\{title}.txt", "w", encoding="utf-8") as f:  # 添加编码参数
            f.write(title1)
        print(f"{title}已经下载...")

starttime=datetime.now()

headers = {"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36"}

url ="https://www.bqgka.com/book/159995/"  #引入网址
res = requests.get(url , headers=headers)  #可以发送一个http get请求,返回服务器响应内容.
soup = BeautifulSoup(res.text, 'lxml')  #将文档传入BeautifulSoup,得到文档的对象
info =soup.find("div",class_="listmain").find_all("a")

urls=[]

for i in info:
    href = i["href"]
    if href != "javascript:dd_show()":
        # print(href)
        href = "https://www.bqgka.com"+href
        urls.append(href)


print(urls)

# print("单线程下载")
# for url in urls:
#     down_txts(url)

print("多线程下载")
with ThreadPoolExecutor(max_workers=len(urls)) as exe:
    for url in urls:
        exe.submit(down_txts,url)

endtime = datetime.now()
print(f"总共用,{(endtime-starttime).seconds}秒")
相关推荐
databook3 小时前
Manim实现闪光轨迹特效
后端·python·动效
Juchecar4 小时前
解惑:NumPy 中 ndarray.ndim 到底是什么?
python
用户8356290780514 小时前
Python 删除 Excel 工作表中的空白行列
后端·python
Json_4 小时前
使用python-fastApi框架开发一个学校宿舍管理系统-前后端分离项目
后端·python·fastapi
数据智能老司机11 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机12 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机12 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机12 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i12 小时前
drf初步梳理
python·django
每日AI新事件12 小时前
python的异步函数
python