用Python简单的实现一下六大主流小说平台小说下载(附源码)

news2024/12/24 2:46:49

很多小伙伴学习Python的初衷就是为了爬取小说,方便又快捷~

辣么今天咱们来分享6个主流小说平台的爬取教程~

一、流程步骤

流程基本都差不多,只是看网站具体加密反爬,咱们再进行解密。

实现爬虫的第一步?

1、去抓包分析,分析数据在什么地方。

1. 打开开发者工具
2. 刷新网页
3. 找数据 --> 通过关键字搜索

2、获取小说内容

1. 目标网址
2. 获取网页源代码请求小说链接地址,解析出来 。
3. 请求小说内容数据包链接:
4. 获取加密内容 --> ChapterContent
5. 进行解密 --> 分析加密规则 是通过什么样方式 什么样代码进行加密

3、获取响应数据

response.text 获取文本数据 字符串
response.json() 获取json数据 完整json数据格式
response.content 获取二进制数据 图片 视频 音频 特定格式文件

二、案例

1、书旗

环境模块

[环境使用]:
    Python 3.8
    Pycharm
 
[模块使用]:
    requests 
    execjs 
    re

源码展示

# 导入数据请求模块
import requests
# 导入正则模块
import re
import execjs
# 模拟浏览器
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.3'
}
# 请求链接 -> 目录页面链接
html = '网址屏蔽了,不然过不了'
# 发送请求
html_ = requests.get(url=html, headers=headers).text
# 小说名字
name = re.findall('<title>(.*?)-书旗网</title>', html_)[0]
# 提取章节名字 / 章节ID
info = re.findall('data-clog="chapter\$\$chapterid=(\d+)&bid=8826245">\d+\.(.*?)</a>', html_, re.S)
print(name)
# for 循环遍历
for chapter_id, index in info:
    title = index.strip()
    print(chapter_id, title)
    # 请求链接
    url = f'https://网址屏蔽了,不然过不了/reader?bid=8826245&cid={chapter_id}'
    # 发送请求 <Response [200]> 响应对象
    response = requests.get(url=url, headers=headers)
    # 获取响应数据
    html_data = response.text
    # 正则匹配数据
    data = re.findall('contUrlSuffix":"\?(.*?)","shelf', html_data)[0].replace('amp;', '')
    # 构建小说数据包链接地址
    link = 'https://c13.网址屏蔽了,不然过不了.com/pcapi/chapter/contentfree/?' + data
    # 发送请求
    json_data = requests.get(url=link, headers=headers).json()
    # 键值对取值, 提取加密内容
    ChapterContent = json_data['ChapterContent']
    # 解密内容 --> 通过python调用JS代码, 解密
    f = open('书旗.js', encoding='utf-8')
    # 读取JS代码
    text = f.read()
    # 编译JS代码
    js_code = execjs.compile(text)
    # 调用Js代码函数
    result = js_code.call('_decodeCont', ChapterContent).replace('<br/><br/>', '\n').replace('<br/>', '')
    # 保存数据
    with open(f'{name}.txt', mode='a', encoding='utf-8') as v:
        v.write(title)
        v.write('\n')
        v.write(result)
        v.write('\n')
    print(json_data)
    print(ChapterContent)
    print(result)

效果展示


2、塔读

环境模块

[环境使用]:
    Python 3.8
    Pycharm
 
[模块使用]:
    requests --> pip install requests
    execjs --> pip install pyexecjs
    re

源码

# 导入数据请求模块
import requests
# 导入正则表达式模块
import re
# 导入读取JS代码
import execjs

# 模拟浏览器
headers = {
    'Host': '网址屏蔽了,以免不过',
    'Referer': '网址屏蔽了,以免不过',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36',
}
# 请求链接
link = '网址屏蔽了,以免不过'
# 发送请求
link_data = requests.get(url=link, headers=headers).text
# 小说名字
name = re.findall('book_name" content="(.*?)">', link_data)[0]
# 章节ID 和 章节名字
info = re.findall('href="/book/\d+/(\d+)/" target="_blank">(.*?)</a>', link_data)[9:]
page = 1
# for 循环遍历
for chapter_id, title in info:
    print(chapter_id, title)
    # 获取广告 data-limit 参数
    j = open('塔读.js', encoding='utf-8')
    # 读取JS代码
    text = j.read()
    # 编译JS代码
    js_code = execjs.compile(text)
    # 调用js代码函数
    data_limit = js_code.call('o', chapter_id)
    print(data_limit)
    # 请求链接
    url = f'网址屏蔽了,以免不过/{page}'
    # 发送请求 <Response [200]> 响应对象 表示请求成功
    response = requests.get(url=url, headers=headers)
    # 获取响应json数据 --> 字典数据类型
    json_data = response.json()
    # 解析数据 -> 键值对取值 content 获取下来
    content = json_data['data']['content']
    # 处理小说内容广告 初级版本 --> 后续需要升级
    content_1 = re.sub(f'<p data-limit="{data_limit}">.*?</p>', '', content)
    # 提取小说内容 -> 1. 正则表达式提取数据 2. css/xpath 提取
    result = re.findall('<p data-limit=".*?">(.*?)</p>', content_1)
    # 把列表合并成字符串
    string = '\n'.join(result)
    # 保存数据
    with open(f'{name}.txt', mode='a', encoding='utf-8') as f:
        f.write(title)
        f.write('\n')
        f.write(string)
        f.write('\n')
    print(string)
    page += 1

效果展示

3、飞卢

环境模块

[环境使用]:
    Python 3.8
    Pycharm
 
[模块使用]:
    requests >>> 数据请求模块
    parsel >>> 数据解析模块
    re 正则表达式

源码展示

# 数据请求模块
import requests
# 数据解析模块
import parsel
# 正则表达式模块
import re
import base64
 
 
def get_content(img):
    url = "https://aip.网址屏蔽,不然不过审.com/oauth/2.0/token"
    params = {
        "grant_type": "client_credentials",
        "client_id": "",
        "client_secret": ""
    }
    access_token =  str(requests.post(url, params=params).json().get("access_token"))
 
    content = base64.b64encode(img).decode("utf-8")
    url_ = "网址屏蔽,不然不过审" + access_token
    data = {
        'image': content
    }
    headers = {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Accept': 'application/json'
    }
    response = requests.post(url=url_, headers=headers, data=data)
    words = '\n'.join([i['words'] for i in response.json()['words_result']])
    return words
 
 
# 模拟伪装
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36'
}
# 请求链接
link = '网址屏蔽,不然不过审'
# 发送请求
link_response = requests.get(url=link, headers=headers)
# 获取响应文本数据
link_data = link_response.text
# 把html文本数据, 转成可解析对象
link_selector = parsel.Selector(link_data)
# 提取书名
name = link_selector.css('#novelName::text').get()
# 提取链接
href = link_selector.css('.DivTr a::attr(href)').getall()
# for循环遍历
for index in href[58:]:
    # 请求链接
    url = 'https:' + index
    print(url)
    # 发送请求 <Response [200]> 响应对象
    response = requests.get(url=url, headers=headers)
    # 获取响应文本数据
    html_data = response.text
    # 把html文本数据, 转成可解析对象 <Selector xpath=None data='<html xmlns="http://www.w3.org/1999/x...'>
    selector = parsel.Selector(html_data)
    # 解析数据, 提取标题
    title = selector.css('.c_l_title h1::text').get() # 根据数据对应标签直接复制css语法即可
    # 提取内容
    content_list = selector.css('div.noveContent p::text').getall() # get提取第一个
    # 列表元素大于2 --> 能够得到小说内容
    if len(content_list) > 2:
        # 把列表合并成字符串
        content = '\n'.join(content_list)
        # 保存数据
        with open(name + '.txt', mode='a', encoding='utf-8') as f:
            f.write(title)
            f.write('\n')
            f.write(content)
            f.write('\n')

效果展示

因为这玩意爬下来是图片,所以还要进行文字识别,

    else:
        # 提取图片内容
        info = re.findall("image_do3\((.*?)\)", html_data)[0].split(',')
        img = 'https://read.faloo.com/Page4VipImage.aspx'
        img_data = {
            'num': '0',
            'o': '3',
            'id': '724903',
            'n': info[3],
            'ct': '1',
            'en': info[4],
            't': '0',
            'font_size': '16',
            'font_color': '666666',
            'FontFamilyType': '1',
            'backgroundtype': '0',
            'u': '15576696742',
            'time': '',
            'k': info[6].replace("'", ""),
        }
        img_content = requests.get(url=img, params=img_data, headers=headers).content
        # 文字识别, 提取图片中文字内容
        content = get_content(img=img_content)
 
        # 保存数据
        with open(name + '.txt', mode='a', encoding='utf-8') as f:
            f.write(title)
            f.write('\n')
            f.write(content)
            f.write('\n')

识别效果

在这里插入图片描述

4、纵横中文

环境模块

解释器: python 3.8
编辑器: pycharm 2022.3
crypto-js 
requests  

源码展示

import execjs
import requests
import re
 
cookies = {
}
 
headers = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive',
    'Pragma': 'no-cache',
    'Referer': '网址屏蔽了,不过审',
    'Sec-Fetch-Dest': 'document',
    'Sec-Fetch-Mode': 'navigate',
    'Sec-Fetch-Site': 'same-site',
    'Sec-Fetch-User': '?1',
    'Upgrade-Insecure-Requests': '1',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36',
    'sec-ch-ua': '"Chromium";v="116", "Not)A;Brand";v="24", "Google Chrome";v="116"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Windows"',
}
 
response = requests.get('网址屏蔽了,不过审', cookies=cookies, headers=headers)
 
html_data = response.text
i = re.findall('<div style="display:none" id="ejccontent">(.*?)</div>', html_data)[0]
f = open('demo.js', mode='r', encoding='utf-8').read()
ctx = execjs.compile(f)
result = ctx.call('sdk', i)
print(result)

5、笔趣阁

模块环境

[相关模块]<第三方模块>
        requests >>> pip install requests
        parsel
    <内置模块>
        re

[开发环境]:
    环 境: python  3.8
    编辑器:pycharm 2021.2

源码展示

import requests  # 第三方模块  pip install requests
import parsel # 第三方模块
import re   # 内置模块   

url = 'https://网址屏蔽/book/88109/'
# 伪装
headers = {
    # 键值对   键  --》用户代理 模拟浏览器的基本身份
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36'
}
# 发送请求  response 响应体
response = requests.get(url=url, headers=headers)
print(response)

selector = parsel.Selector(response.text)
title = selector.css('.zjlist dd a::text').getall()

# 章节链接
link = selector.css('.zjlist dd a::attr(href)').getall()
# print(link)
# replace  re.sub()
 
# zip()
zip_data = zip(title, link)
for name, p in zip_data:
    # print(name)
    # print(p)
    passage_url = '网址屏蔽'+ p
    # print(passage_url)
    # 发送请求
    response_1 = requests.get(url=passage_url, headers=headers)
    # print(response_1.text)
    # 解析数据  content  二进制  图片  视频
    # re    
    # 查找所有
    re_data = re.findall('<div id="content"> (.*?)</div>', response_1.text)[0]
    # print(re_data)
    # replace  替换
    text = re_data.replace('笔趣阁 www.网址屏蔽.net,最快更新<a href="https://网址屏蔽/book/88109/">盗墓笔记 (全本)</a>', '')
 
    text = text.replace('最新章节!<br><br>', '').replace('    ', '')
    # print(text)
    text = text.replace('<br /><br />', '\n')
    print(text)
    passage = name + '\n' + text

    with open('盗墓笔记.txt',mode='a') as file:
        file.write('')

6、起点

环境模块

python3.8   解释器版本
pycharm     代码编辑器
requests    第三方模块  

代码展示

import re
 
import requests     # 第三方模块 额外安装
import subprocess
from functools import partial
# 处理execjs编码报错问题, 需在 import execjs之前
subprocess.Popen = partial(subprocess.Popen, encoding="utf-8")
import execjs
 
headers = {
    'cookie': 用自己的,我的删了
}
ctx = execjs.compile(open('起点.js', mode='r', encoding='utf-8').read())
url = 'https://网址屏蔽/chapter/1035614679/755998264/'
response = requests.get(url=url, headers=headers)

html_data = response.text

arg1 = re.findall('"content":"(.*?)"', html_data)[0]
arg2 = url.split('/')[-2]
arg3 = '0'
arg4 = re.findall('"fkp":"(.*?)"', html_data)[0]
arg5 = '1'
result = ctx.call('sdk', arg1, arg2, arg3, arg4, arg5)
print(result)
 
text = re.findall('"content":"(.*?)","riskInfo"', html_data)[0]
text = text.replace('\\u003cp>', '\n')

f = open('1.txt', mode='w', encoding='utf-8')
f.write(text)

源码我都打包好了,还有详细视频讲解,文末名片自取,备注【小说】快速通过。

好了,今天的分享就到这里了,下次见~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1073842.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从零开始:制作出色的产品原型图的详细教程

在设计产品的初始版本或模型时&#xff0c;产品原型起着非常重要的作用&#xff0c;可以帮助设计师和团队更好地了解产品需求和用户需求&#xff0c;优化和改进设计&#xff0c;确保设计最终满足用户的需求和期望。如果你不知道如何绘制产品原型图&#xff0c;绘制产品原型图的…

应用开发平台集成工作流系列之14——流程表单实现示例

背景 流程审批&#xff0c;通常对应一个业务表单。这个表单一般有两种实现模式&#xff0c;一是不同的环节对应不同表单&#xff0c;二是做一张大表单&#xff0c;分为不同的区域&#xff0c;从业务角度考虑&#xff0c;前者通常对应复杂业务处理&#xff1b;后面一种则更常见…

苹果手机如何设置软件提醒功能?苹果手机哪个软件有提醒功能?

作为苹果手机用户&#xff0c;我们都希望能够准时接收待办事项或日程提醒&#xff0c;高效完成各项任务和待办事项&#xff0c;例如无论是工作中的重要会议&#xff0c;还是生活中的约会安排&#xff0c;我们都不能够忘记。那么苹果手机如何设置软件的提醒功能呢&#xff1f;苹…

解决 Git:This is not a valid source path/URL

由于sourcetree 可以获取不同仓库的代码&#xff0c;而我的用户名密码比较杂乱&#xff0c;导致经常会修改密码&#xff0c;在新建拉去仓库代码的时候sourcetree 不会提示你密码错误&#xff0c;直接提示 This is not a valid source path/URL。 在已存在的代码仓库&#xff0…

QT UI控件汇总介绍

按钮 ToolButton 和pushbutton没什么区别&#xff0c;可以用来设置图标 设置展示策略 RadioButton 一般用Container可以将其框起来设置互斥域&#xff0c;推荐选用GroupBox 使用方法 qDebug()<<ui->radioButton_3->isChecked(); CheckBox 可以勾选三态 stat…

动态代理IP常见超时原因及解决方法

在使用动态代理IP时&#xff0c;常常会遇到代理超时的问题。网络环境的不稳定性以及代理IP的质量问题&#xff0c;都可能会引起代理超时。这种情况下&#xff0c;代理服务器无法在规定时间内响应我们的请求&#xff0c;导致请求失败。 使用动态代理IP时&#xff0c;哪些原因会引…

SpringBoot和Hibernate——如何提高数据库性能

摘要&#xff1a;本文由葡萄城技术团队发布。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 前言 在软件开发领域&#xff0c;性能是重中之重。无论您是构建小型 Web 应用程序还是大型企业系统…

MySQL详解 七:数据库高级语句(视图表、存储过程)

文章目录 1. create view ---- (视图表)1.1 视图的简单介绍1.2 基本语法1.2.1 创建视图表1.2.2 查看视图表1.2.3 删除视图表1.2.4 修改视图表 1.3 通过视图表得出无交集 2. case语句3. 空值&#xff08;null&#xff09; 和 无值&#xff08; &#xff09; 的区别4. 正则表达式…

大型语言模型:DistilBERT — 更小、更快、更便宜、更轻

一、介绍 近年来&#xff0c;大型语言模型的演进速度飞速发展。BERT成为最流行和最有效的模型之一&#xff0c;可以高精度地解决各种NLP任务。在BERT之后&#xff0c;一组其他模型随后出现在现场&#xff0c;也展示了出色的结果。 很容易观察到的明显趋势是&#xff0c;随着时间…

Vulnhub系列靶机-The Planets Earth

文章目录 Vulnhub系列靶机-The Planets: Earth1. 信息收集1.1 主机扫描1.2 端口扫描1.3 目录爆破 2. 漏洞探测2.1 XOR解密2.2 解码 3. 漏洞利用3.1 反弹Shell 4. 权限提升4.1 NC文件传输 Netcat&#xff08;nc&#xff09;文件传输 Vulnhub系列靶机-The Planets: Earth 1. 信息…

工矿企业电力运维云平台:提升效率与降低成本的关键

针对工矿企业用户&#xff0c;聚焦供配电领系统“安全监控、能耗管理、智能运维” 的三大需求&#xff0c;研发推出了“电易云”--智慧电力物联网&#xff0c;为工矿企业用户提供智慧电力数字化解决方案及数据服务&#xff0c;实现供配电系统的数字化、云端化、智能化、绿色化&…

笔记36:CNN的多通道卷积到底是什么样的

总结&#xff1a; &#xff08;1&#xff09;输入卷积层的feature_map的通道数&#xff0c;就是该卷积层每个卷积核所含有的通道数 &#xff08;2&#xff09;输出卷积层的feature_map的通道数&#xff0c;就是该卷积层所含有的卷积核的个数 a a a a 解释&#xff1a;【…

【数据结构C/C++】稀疏矩阵的压缩

文章目录 什么是稀疏矩阵&#xff1f;使用C语实现对稀疏矩阵的压缩408考研各数据结构C/C代码&#xff08;Continually updating&#xff09; 什么是稀疏矩阵&#xff1f; 稀疏矩阵&#xff08;Sparse Matrix&#xff09;是一种矩阵&#xff0c;其中大多数元素都是零。与稠密矩…

Floorplanning with Graph Attention

Floorplanning with Graph Attention DAC ’22 目录 Floorplanning with Graph Attention摘要1.简介2.相关工作3.问题公式化4. FLORA的方法4.1 解决方案概述4.2 C-谱聚类算法 4.3 基于GAT的模型4.4 合成训练数据集生成 摘要 布图规划一直是一个关键的物理设计任务&#xff0…

mac(M1)安装anaconda3

首先下载 然后正常安装即可&#xff0c;之所以我现在测试了anaconda,因为我发现miniconda后&#xff0c;jupyter notebook的安装就出现问题&#xff0c;所以就直接卸载miniconda&#xff0c;而直接安装anaconda了 (base) yxkbogon ~ % pip list Package …

算法通过村第十三关-术数|白银笔记|术数高频问题

文章目录 前言数组实现加法专题数组实现整数加法字符串加法二进制加法 幂运算专题求2的次幂求3的次幂求4的次幂 总结 前言 提示&#xff1a;人心本易趋死寂&#xff0c;苦难之后&#xff0c;焕然重建&#xff0c;激荡一阵&#xff0c;又趋麻木。 --苏枕书《有鹿来》 我们继续看…

连续子数组的最大和

这其实用到的是一个dp的动态规划数组来描写的。 用两个变量就能解决了&#xff0c;一个是max(记录前i个数中子数组的最大的和), 一个是sum是记录前i个数组的和最大值和自己去比较&#xff0c;就是前i-1个和是8&#xff0c;自己是-2&#xff0c; 8 - 2 > -2&#xff0c;所以…

Qt内置的图标与图标字体库加载应用实例(内置图标与加载外置的图标字体库)

一、前言 当涉及到创建应用程序的图形用户界面(GUI)时,图标是不可或缺的一部分。Qt作为一个流行的跨平台开发框架,不仅提供了丰富的UI组件和功能,还内置了许多精美的图标供开发者使用。这些内置图标提供了一种简便的方式,使开发者可以在应用程序中轻松地添加各种图标,提…

科技云报道:联络中心效能与体验齐飞,容联云AICC是如何做到的?

科技云报道原创。 AI与大模型为千行万业带来的进化与改造&#xff0c;远比想象来得更加猛烈。作为数字化升级改造的核心场景之一&#xff0c;联络中心在AI与大模型加持下&#xff0c;正在从基础云通讯迈入智能化的3.0时代。 身处行业智能化浪潮之中&#xff0c;容联云AICC作为…

【Linux】冯诺依曼体系结构初识操作系统

文章目录 1. 冯诺依曼体系结构2. 初识操作系统2.1 操作系统是什么&#xff1f;2. 为什么要有操作系统3. 操作系统是怎么管理的4. 系统调用&#xff08;System Call&#xff09; 1. 冯诺依曼体系结构 我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服…