【爬虫实战】手把手教你使用python爬取网络小说

article/2025/10/4 4:30:48

文章目录

  • 写作缘起
  • 上代码
  • 思路分析
  • 效果展示
  • 写在最后

写作缘起

南墙最近发现自己常用的看小说网站多了许多广告,果然商业化的现今网上几无净土啊,便决定自己写个小说下载器,这样看小说贼爽

上代码

import randomimport requests
from bs4 import BeautifulSoup
import re
import os
import time
# 构造请求头
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36','Connection': 'close','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8','Referer': 'http://www.quanshuwang.com/','Accept-Encoding': 'gzip, deflate, sdch','Accept-Language':'zh-CN,zh;q=0.9'
}# 代理列表
user_agent_list = ["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36","Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/61.0","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36","Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)","Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.5; en-US; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15",]
# 随机选取一个代理,总是使用同一个容易被封
headers['User-Agent'] = random.choice(user_agent_list)
# print(headers['User-Agent'])
# print(type(random.choice(user_agent_list)))def download(url):# url = 'http://www.quanshuwang.com/book/44/44683/15379610.html'res = requests.get(url,headers=headers)res.encoding ='gbk'if res.status_code != 200:print("爬取失败")html = res.textsoup = BeautifulSoup(html,'html.parser')# 获取内容content = soup.find('div',id='content')# print(content)# 获取标题title = re.findall(r'</script>.*?(.*?)<br/>',str(content))[0].strip()content = str(content).replace('<br/>','')# print(content)content = content[content.find('\n')+1:]content = content.split('<s',1)[0]content = content.replace('\n','')# 设置下载路径path = './book/'+title+'.txt'if not os.path.exists('./book'):os.mkdir('./book')# 下载到文件with open(path,'w') as f:f.write(content)f.close()# 程序入口
if __name__ =="__main__":num = int(input("请输入想要下载的章节数目:"))i = 0  # 已下载章节数j = 0  # 偏移量,一般来说加1 但存在无效链接 需要加n(n>1)while i < num:location = 15379609 + jurl = 'http://www.quanshuwang.com/book/44/44683/' + str(location) + '.html'try:download(url)except Exception as e: # 捕获异常并打印异常信息,跳过该urlprint(url+'  '+str(e))j = j + 1continueprint(url+'  第'+str(i)+'章下载完成')# 后移下载下一章节i = i + 1j = j + 1time.sleep(6)print('**下载完成**')

思路分析

思路分三步:
第一步 分析结构

在这里插入图片描述
这个的结构比较简单,文字内容都在id="content"的div元素下,为了方便起见,使用bs4库,用 content = soup.find('div',id='content')这段代码便可获取文字内容,然后再对字符串进行数据清洗,去空格符,去换行符等操作。同时把文章标题提取出来作为txt文件名。

	soup = BeautifulSoup(html,'html.parser')# 获取内容content = soup.find('div',id='content')# print(content)# 获取标题title = re.findall(r'</script>.*?(.*?)<br/>',str(content))[0].strip()content = str(content).replace('<br/>','')# print(content)content = content[content.find('\n')+1:]content = content.split('<s',1)[0]content = content.replace('\n','')

第二步 通过观察发现章节url之间的规律
在这里插入图片描述
在这里插入图片描述
从上面可以发现相邻章节的url链接只有后缀数字不同,而且是递增1,得到第1章的后缀便可以推断出后面所有章节的url(其实后面通过大批量的下载发现有无效链接,比如55应该是第45章,但第45章是到57、58了,说明中间有空缺,但是并不影响,我们通过累加下载的有效章节数依旧可以控制总章节数)

    i=0  # 已下载章节数j = 0  # 偏移量,一般来说加1 但存在无效链接 需要加n(n>1)while i < num:location = 15379609 + jurl = 'http://www.quanshuwang.com/book/44/44683/' + str(location) + '.html'try:download(url)

第三步 下载
这个相对而言就比较简单了,直接上代码吧

	# 下载到本地if not os.path.exists('./book'):os.mkdir('./book')path = './book/'+title+'.txt'with open(path,'w') as f:f.write(content)f.close()

后来发现其实可以在主界面把所有章节的url提取出来放入一个列表中,然后下载这样就比较方便了

效果展示

运行效果
在这里插入图片描述

打开txt看小说咯
在这里插入图片描述

噔噔噔噔,终于可以爽快地看小说了

写在最后

但是下载还是有些地方需要注意,爬取速度不要太快,设置一个间隔如 time.sleep(6),不然容易爬崩别人的网站。虽然设置了,但效果不太佳还是会出现ip被封。关于出现异常报错connection absorted / requests. exceptions.ConnectionError 解决方案我是参考大佬的,附上链接 python爬虫 requests异常requests.exceptions.ConnectionError: HTTPSConnectionPool Max retries exceeded
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210131183008518.png![在这里插入图片描述](https://img-blog.csdnimg.cn/20210131183703292.png

在这里插入图片描述

还有可以拓展到搜索一本指定的书,这个网站也提供了搜索框,只是由于作者还不会浏览器模拟和表单提交,而且无法从url的后缀数字中发现书籍规律,只能告一段落了,之后再补上吧


http://chatgpt.dhexx.cn/article/6MFilnA5.shtml

相关文章

Python网络爬虫快速上手

环境准备&#xff1a; 事先安装好&#xff0c;pycharm 打开File——>Settings——>Projext——>Project Interpriter 点击加号&#xff08;图中红圈的地方&#xff09; 点击红圈中的按钮 选中第一条&#xff0c;点击铅笔&#xff0c;将原来的链接替换为&#xff0…

【爬虫系列】爬虫实战--获取电影短评并生成词云

最近看完了口碑大赞的国产科幻电影&#xff0c;感觉非常的不错&#xff0c;刷新了对未来科幻的认知啊。在大饱眼福的同时&#xff0c;也想着大家对这部电影都是怎么评价的呢&#xff1f; 打开豆瓣网&#xff0c;找到电影短评页面&#xff0c;该网页是分页类型的&#xff0c;我…

selenium 快乐爬虫实战之 电影链接的爬取

文章目录 思路源码分析初始化 Chrome获取搜索引擎页面给出的网页链接循环遍历网页链接&#xff0c;过滤电影链接第二次过滤并输出链接最后加上程序入口 完整源码 复制即用效果 思路 手动用搜索引擎找电影链接慢而且不方便&#xff0c;找到的链接也有限。各大电影网站的链接不是…

作为一名爬虫人如何实现千万级数据爬取?

爬虫人,爬虫魂!爬虫路上莫乱行 爬虫门槛不高,高就高在往后余生的每一次实操都随时会让你崩溃 在这个大数据智能时代,数据就是金钱!所以越来越多的企业都很重视数据,然后通过爬虫技术等手段获取一些公开数据,为公司业务及项目进行赋能 在原始资本积累的初期,使用一些低…

爬虫攻守道 - 2023最新 - JS逆向 - Python Scrapy实现 - 爬取某天气网站历史数据

目录 背景介绍 网站分析 第1步&#xff1a;找到网页源代码 第2步&#xff1a;分析网页源代码 Python 实现 成果展示 后续 Todo 背景介绍 今天这篇文章&#xff0c;3个目的&#xff0c;1个是自己记录&#xff0c;1个是给大家分享&#xff0c;还有1个是向这个被爬网站的前…

如何使用爬虫一键批量采集新浪微博内容

信息时代如何真正做到&#xff0c;秀才不出门&#xff0c;能知天下事。不知道你们用的是啥&#xff0c;反正小喵我用的是微博。现在微博上新闻是多的不得了&#xff0c;国家大事&#xff0c;社会日常&#xff0c;娱乐新闻。微博热搜上随便一个话题都可以引起网民们的激烈讨论。…

scrapy爬虫实战——米哈游官网数据爬取

项目总览 前言项目建立爬虫代码编写爬虫运行导出到Excel后记 前言 scrapy是一个强大的爬虫框架&#xff0c;熟练地使用它几乎可以随心所欲地抓取任何网页上想要获得的数据。笔者初学爬虫&#xff0c;需要项目练手&#xff0c;适逢有不少朋友热衷于《原神》这款由米哈游开发的游…

一个神器,大幅提升爬虫爬取效率!

这是「进击的Coder」的第 575 篇技术分享 作者&#xff1a;崔庆才 在做爬虫的时候&#xff0c;我们往往可能这些情况&#xff1a; 网站比较复杂&#xff0c;会碰到很多重复请求。有时候爬虫意外中断了&#xff0c;但我们没有保存爬取状态&#xff0c;再次运行就需要重新爬取。 …

python爬虫基本功(一)--初识python爬虫与爬虫学习路径

大家好&#xff0c;这里是Kaiser。&#x1f44f;&#x1f44f;今天想给大家介绍下python爬虫的知识&#xff0c;我将与大家一起去揭开python爬虫的神秘面纱&#xff0c;字不多敲&#xff0c;让我们进入今天的主题&#xff1a;初识python爬虫。 文章目录 1️⃣什么是爬虫2️⃣爬…

神箭手 爬虫操作(1)

今天有一个任务&#xff0c;是要将微博用户的昵称从数据库导入到神箭手中。 以前一直是手动操作&#xff0c;现在有一个需求是要直接导入到设置中。 数据库使用的是mysql&#xff0c;数据库连接使用的是JDBCtemplate&#xff0c;使用spring构建&#xff0c;还要用到神箭手的S…

如何在神箭手云爬虫上写爬虫

摘要 上一篇博客跟大家详细介绍了如何写出《黄焖鸡米饭是怎么火起来的》这样的数据分析类的文章&#xff0c;相信很多人都对数据来源也就是如何爬取到黄焖鸡米饭商家信息很感兴趣。那么今天我就跟大家具体讲一讲怎么使用神箭手云爬虫写爬虫&#xff0c;以上篇博客的…

神箭手云爬虫平台 如何在1小时内编写简单爬虫

既然你来到了这里&#xff0c;想必你肯定已经知道了神箭手云爬虫平台是干什么的&#xff0c;目的也是非常的明确。 那么接下来的过程中&#xff0c;我将给你演示如何在最快时间内编写一个简单的爬虫&#xff0c;每一个属性的讲解&#xff0c;将会让你一路顺风。 demo项目GitHu…

神箭手云爬虫工具

title: 神箭手云爬虫 categories: 神箭手 tags:爬虫 分为&#xff1a; 入口页&#xff0c;帮助页&#xff0c;内容页 入口页&#xff1a; scanUrl 爬虫网页的入口 帮助页&#xff1a;helperurl 一帮包含大量的内容页&#xff08;列表&#xff09;&#xff0c;多数情况下事业…

JS求绝对值

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 需求&#xff0c;一个变量&#xff0c;需要判断它的值为负数时不能小于-20&#xff0c;正数也不能小于20&#xff0c;这个时候就需要用到求绝对值了。 Math.abs(num) > 求绝对值 使用示例&#xf…

javascript:求绝对值最小的数

问题来源&#xff1a;http://androidguy.blog.51cto.com/974126/1129543 有一个已经排序的数组&#xff08;升序&#xff09;&#xff0c;数组中可能有正数、负数或0&#xff0c;求数组中元素的绝对值最小的数&#xff0c;要求&#xff0c;不能用顺序比较的方法&#xff08;复杂…

力扣 -----最小绝对值(JavaScript解法)

一、题目描述 二、示例 三、解题思路 先进行一个排序&#xff0c;然后使用双指针&#xff0c;依次进行比较&#xff0c;将比较的值进行存储&#xff0c;最小值改变的话&#xff0c;数组置空&#xff0c;最小值改变&#xff0c;如果和最小值相等的话直接push。我刚开始写的排序…

python3 绝对值_python3对序列求绝对值

原博文 2018-11-08 11:27 − http://www.cnblogs.com/itdyb/p/5731804.html 一开始我是这样写的&#xff0c;据说这样写python2是可以的&#xff1a; myList [-1,2,-3,4,-5,6]absList map(abs, myList) &... 0 1936 相关推荐 2019-12-23 10:33 − ## Python3使用sud…

【前端】JavaScript基础(二)

目录 一、内置对象 Math对象 Data日期 数组对象 字符串对象 字符串的不可变 根据字符返回位置 根据位置返回字符&#xff08;重点&#xff09; 字符串基本方法&#xff08;重点&#xff09; 字符串的替换与转换 二、简单类型和复杂类型 简单类型传参 复杂类型传参 一、内…

LeetCode 任意子数组和绝对值的最大值(JavaScript)

这道题目&#xff0c;我是通过看题解&#xff0c;然后通过自己思考才写出来的&#xff0c;第一次写博客&#xff0c;如果有不好之处&#xff0c;请谅解。 写这个题目之前&#xff0c;我们先了解一下前缀和&#xff0c;通过下面例子&#xff0c;或许你就明白了什么是前缀和了。…