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

举报
HUAWEIXIAZHI 发表于 2024/11/26 10:28:21 2024/11/26
【摘要】 爬取小说资源的Python实践:从单线程到多线程的效率飞跃

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

前提声明

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

目录

  1. 引言
  2. 环境准备
  3. 爬虫程序概述
  4. 代码实现
  5. 性能优化
  6. 结语
  7. 注意事项
  8. 全部代码

引言

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

环境准备

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

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

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

pip install requests beautifulsoup4

爬虫程序概述

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

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

代码实现

1. 导入必要的库

import requests
from bs4 import BeautifulSoup
from concurrent.futures import ThreadPoolExecutor
from datetime import datetime

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

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

3. 设置请求头和目标URL

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

4. 获取小说章节链接

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

5. 多线程下载小说

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

6. 计算下载时间

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

性能优化

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

结语

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

效果展示
image.png
image.png
image.png

注意事项

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

总结

在数字化时代,快速获取和处理数据的能力变得尤为重要。本文介绍了如何使用Python编写爬虫程序,从笔趣阁网站爬取小说内容,并利用多线程技术提高下载效率。通过实践,我们不仅学会了如何发送HTTP请求、解析HTML文档,还学会了如何使用线程池实现多线程下载,从而显著提高了下载效率。

本文首先介绍了爬虫的前提声明,强调了遵守目标网站的robots.txt协议,尊重版权和用户隐私的重要性。接着,我们进行了环境准备,确保开发环境中安装了必要的Python库,如requests、BeautifulSoup和concurrent.futures。

在代码实现部分,我们详细讲解了如何通过导入必要的库、定义下载小说文本的函数、设置请求头和目标URL、获取小说章节链接、多线程下载小说和计算下载时间等步骤来实现爬取小说资源的功能。我们使用requests库发起对小说网站页面的请求,并设置合适的User-Agent以模拟浏览器访问。通过BeautifulSoup解析HTML文档,提取小说章节链接,然后使用线程池实现多线程下载,最后计算下载时间。

通过本文,读者已经学会了如何使用Python爬取小说资源,并利用多线程技术提高下载效率。这不仅是一次编程实践,更是对网络请求、HTML解析和多线程编程的深入理解。希望读者能将所学应用到更多有趣和有益的项目中去,并在实践中不断提升自己的编程能力。如果有任何问题或需要进一步的帮助,请随时联系作者。

全部代码

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}秒")
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。