聚焦千千小说:一篇幽默风趣的网络小说爬虫教程

大家好!欢迎来到我的博客。今天,我要给你们带来一份超有趣、简单易懂的爬虫教程。我们的目标是爬取千千小说网站上的小说章节内容(而且能够实现章节的顺序排放哦)然后保存到本地文件。准备好了吗?现在就让我们开始这场精彩的编程之旅吧!
目标网址:万古神帝 https://www.qqxsnew.net/12/12776/

1. 首先,让我们来看看程序的主角——Novel类

class Novel:RIGHT = 0

这个类就是我们的爬虫主体,RIGHT属性用来记录成功下载的章节数量。下面,我们来为这个类添加一些方法。

2. 初始化函数__init__及其他常用函数

  def __init__(self):self.url = 'https://www.qqxsnew.net/12/12776/'self.headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0Safari/537.36'}

__init__方法用来初始化novel对象。其中,url是我们要爬取的小说网址,headers则是请求头信息,让我们的爬虫更像一个正常的用户。

3. 下载章节的异步方法download_chapter

这个方法会异步地下载小说的每个章节。首先,我们让爬虫稍微休息一下,以免给服务器带来太大压力。接着,获取网页内容并提取章节标题和内容。注意,我们使用了chinese2digits库来将中文数字转换成阿拉伯数字,让文件名更规范。

    async def download_chapter(self, session, url, title):await asyncio.sleep(random.randint(500, 800) / 1000)res = await session.get(url)data = await res.read()html_data = etree.HTML(data)# title=c2d.takeNumberFromString(html_data.xpath('//*[@id="main"]//div[2]/h1/text()')[0])['replacedText']try:if title.startswith('第'):ret = re.search(r'(第.*?章)(.*)', title)title = c2d.takeNumberFromString(ret.group(1))['replacedText']new_title = title + ret.group(2)content = html_data.xpath("string(//*[@id='content'])").strip()  # 获取所有文本pattern = re.compile(r'下载星星阅读app,阅读最新章节内容无广告免费|想要看最新章节内容,请下载星星阅读app,无广告免费阅读最新章节内容。网站已经不更新最新章节内容,已经星星阅读小说APP更新最新章节内容。|(无尽的昏迷过后,时宇猛地从床上起身。).*|QqXsΝεW.net|ωωw.qqχsΠéω.net',re.S)new_content = re.sub(pattern, '', content)await self.save(new_content, new_title)else:content = html_data.xpath("string(//*[@id='content'])").strip()pattern = re.compile(r'下载星星阅读app,阅读最新章节内容无广告免费|想要看最新章节内容,请下载星星阅读app,无广告免费阅读最新章节内容。网站已经不更新最新章节内容,已经星星阅读小说APP更新最新章节内容。|(无尽的昏迷过后,时宇猛地从床上起身。).*|QqXsΝεW.net|ωωw.qqχsΠéω.net',re.S)new_content = re.sub(pattern, '', content)await self.save(new_content, title)except Exception as e:print(e)

最后,我们调用save方法将内容保存到本地文件。

4. 保存章节内容的异步方法save

async def save(self, content, title):path = './小说/' #这里填写你要保存的路径哦if not os.path.exists(path):os.mkdir(path)async with aiofiles.open(path + f'/{title}.txt', 'a', encoding='utf-8') as f:self.RIGHT += 1await f.write(content)logger.success(f'download {title} right {self.RIGHT}...')

save方法将章节内容保存到本地文件。这里,我们使用了aiofiles库来异步地写入文件。logger.success会输出保存成功的信息。

5. 主函数main

async def main(self):async with aiohttp.ClientSession(headers=self.headers) as session:res = await session.get(self.url)data = await res.text()html_data = etree.HTML(data)dd_lst = html_data.xpath("//*[@id='list']/dl/dd[position()>15]/a")tasks = []for dd in dd_lst:title = dd.xpath('./text()')[0]chapter_url = 'https://www.qqxsnew.net/' + str(dd.xpath('./@href')[0])task = asyncio.create_task(self.download_chapter(session, chapter_url, title))tasks.append(task)await asyncio.gather(*tasks)

在main方法中,我们首先获取小说目录页的内容,然后提取出所有章节的链接。接着,我们创建一个任务列表,将下载章节的任务添加到列表中。最后,使用asyncio.gather同时运行所有任务。

6. 运行我们的爬虫

if __name__ == '__main__':t = time.time()novel = Novel()loop = asyncio.get_event_loop()loop.run_until_complete(novel.main())print("总耗时:", time.time() - t)

这是效果运行图,风一样的男子哇!

最后,我们创建一个Novel对象,并运行main方法,启动我们的爬虫。
到此,我们的爬虫教程就结束了。现在,你是否已经学会了呢?
友情提示:不建议用异步的方式来抓取页面,这样会给人家的服务器造程很大的伤害,如果一定要用,请加一定的延迟时间,最好两秒以上哦。

聚焦千千小说:一篇幽默风趣的网络小说爬虫教程相关推荐

  1. 如何把自己的经历写成小说_教你如何把一本小说写成太监

    文/不追猫 2016年过完春节我决定开始写小说,当时我辞职了,前一份的工作是工程管理,其实是什么都做,需要去工地,去找甲方监理办事,做工程资料.决算送审等等,属于跑腿打杂的那种. 那不是我喜欢的工作, ...

  2. DTOJ 1552:网络小说分组(novel)

    DTOJ 1552:网络小说分组(novel) [题目描述] YK酷爱阅读网络小说,读起来便是没日没夜废寝忘题的.YK在机房中,花了数个月阅读完了N本网络小说,并且对N本网络小说设定了一个喜爱值,可正 ...

  3. 找不到网络名_书荒粮草,网络小说推荐大合集:文笔一流,拒绝套路

    网络小说走过这么多年,已经成为大家日常生活离不开的陪伴,也涌现出了众多经典.但是网文看多了,难免会感到书荒,特别是对满满的套路文和小白文丧失了兴趣. 关注小编,每天给书荒的朋友提供粮草.今天给大家介绍 ...

  4. PTCMS千千小说规则

    *************************************** PTCMS 规则导出文件 <千千小说_更新(1-8)> ************************** ...

  5. 第二十九篇 ajax动态网页爬取,豆瓣电影,网易云音乐,千千音乐

    心得:每天进步一点点,不懂得去查询,去学习,自己慢慢会进步的更多. 自己在学习过程中总结出来的爬虫的过程: 1.导入库,确定要用到的库 2.确定要爬取的url: 动态网页往往隐藏了在XHR,JS页面内 ...

  6. 太合音乐领千千音乐突围:在线音乐铜墙铁壁难闯

    6月下旬,百度音乐宣布更名为千千音乐,并将LOGO和版面全换成了红色,此番调整引发了用户的热烈讨论,以及对"千千静听"的缅怀.如今事件已经过去一段时间,当事件和大众情绪都冷却之后, ...

  7. 用 Java 演奏《千千阙歌》是什么体验?

    JFugue简介 ​JFugue 是一个开放源代码编程库,它允许人们使用 Java 编程语言来编程音乐,而无需 MIDI 的复杂性.它由 David Koelle 于 2002 年首次发布.当前版本是 ...

  8. 劝你们,千千千万不要当一个程序员!!!!!!

    劝你们,千千千万不要当一个程序员!!!!!! 你们可知道- 听到这些还愿意干? 那咱继续往下看 想当程序员"必须"这样穿 ↓ 夏天二次元文化衫(T恤)+拖鞋 冬天优衣库黑色羽绒服 ...

  9. 教你唱千千阙歌,粤语版的

    原词:                                枫丹白露的注音: 徐徐回望,曾属于彼此的晚上        缺缺为谋,曾虽愚悲凄地满桑 红红仍是你,赠我的心中艳阳         ...

最新文章

  1. Web页面布局方式小结
  2. EasyX实现推箱子游戏
  3. 【中级软考】函数参数传递传值与传引用的区别(global关键字,函数内定义全局变量)
  4. JFreeChart 1.0.6 用户开发指南(中文)
  5. 1.2 如何在visual studio 中建立C#程序
  6. 前端学习(2663):vue3.0的todolist
  7. php免费根据ip查城市,根据ip获取城市的方法
  8. 注塑模介绍、设计中文语音多媒体教学光盘 1CD
  9. 云通讯赛道掀起并购潮 背后有哪些新趋势暗流涌动?
  10. stm32中typedef的用法
  11. android 蓝牙耳机插拔,一种插拔式蓝牙耳机的制作方法
  12. c++小学生信息学奥赛变量练习(魔方)
  13. matlab newton插值,(最新整理)Newton插值法
  14. 尚学堂1811期python视频_尚学堂1811期人工智能全套视频教程震撼发布,转型百万年薪工程师!...
  15. < Linux > 守护进程
  16. 加载R包unloadNamespace时,我该怎么办
  17. js日历控件html,jQuery日历插件sys-calendar.js
  18. token防止表单重复提交
  19. Alpine Linux添加Let's Encrypt CA证书或者自签CA证书
  20. MySQL主从架构、读写分离、集群相关面试问题

热门文章

  1. 【智能驾驶】基于计算机视觉的自动驾驶算法研究综述
  2. 好心人救了一只瘦成骷髅的狗,没想到这个善举却让自闭症的儿子不药而愈…
  3. pandas读取excel,遍历数据
  4. VML实例-画像画板
  5. 企业win10批量部署之Windows部署服务(WDS)
  6. 符号三角形-计算机算法设计与分析【1600+字解析 dfs全排列 列举情况】【题意分析】【算法分析】【思路是怎么来的】【过程是什么】
  7. mysql如何存储bitmap_[MySQL] mysql中bitmap的简单运用
  8. js正则表达式:密码至少8位,要求必须字母、数字加英文符号
  9. Komorebi的数学课 (快速幂
  10. Inline Hook Syscall 详解