关键词搜索

源码搜索 ×
×

Python制作读者下载器,实现随时随地免费看

发布2022-12-10浏览797次

详情内容

前言

嗨喽,大家好呀~这里是爱看美女的茜茜呐

又到了学Python时刻~

一个看书党一年有多少money投入小说行业呢~

碰上一本好看的书,你能购买上多少章呢~

其中的投入,无法想象,尤其是兴致上来了,不得投上个礼物给作者催催更?

最近,我朋友发现了我有着个小说下载器,立马找上我

要我给她下上个几千张,可以随时观看,这样即省了钱,又看了小说

(当然,如果你手上还算富裕,可以支持作者正版小说哦~)

基本四个步骤:

采集一章小说内容

  1. 发送请求, 模拟浏览器对于url地址发送请求

  2. 获取数据, 获取网页源代码

  3. 解析数据, 提取我们想要的数据内容

    小说章节名

    小说内容

  4. 保存数据, 把小说内容本地文件 txt

代码展示

导入模块

# 导入数据请求模块
import requests
# 导入数据解析模块
import parsel
# 导入正则
import re
# 导入格式化打印
import prettytable as pt
# 导入进度条
from tqdm import tqdm
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

伪装

请求头 字典数据类型, 构建完整键值对

headers = {
    # user-agent 用户代理 表示浏览器基本身份信息
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36'
}


def get_response(html_url):
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

发送请求

自定义函数:

  • def 关键字 定义函数

  • get_response 函数名 自定义

html_url 形式参数

  • :param html_url: 给个网址就可以了

  • :return:response 返回响应对象

模拟浏览器对于url地址发送请求

headers 请求头 --> 可以直接复制粘贴

    # 发送请求
    response = requests.get(url=html_url, headers=headers)
    return response
  • 1
  • 2
  • 3

return 关键字 返回 response 响应对象

<Response [200]> 响应对象 表示请求成功

获取小说名字 / 小说章节url

def get_novel_info(novel_url):
    """
    获取小说名字 / 小说章节url
    :param novel_url: 小说目录页url地址
    :return:
    """
    # 发送请求, 获取网页源代码
    html_data = get_response(html_url=novel_url).text
    # 把获取下来 html字符串数据 <response.text>, 转成可解析对象
    selector = parsel.Selector(html_data)
    # 提取小说名字
    name = selector.css('.novel_info_title h1::text').get()
    # 提取小说章节url  attr 属性选择器, 提取标签里面属性内容
    link_list = selector.css('.chapter_list a::attr(href)').getall()
    # https://ssbiqu.com/book/5613/4217210.html  列表推导式
    link_list = ['https://****.com' + i for i in link_list]
    return name, link_list
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

获取小说内容函数

def get_content(html_url):
    """
    获取小说内容函数
    :param html_url: 形参 传入小说章节url地址
    :return: 章节名 / 小说内容
    """
    # 调用前面定义好的发送请求函数
    response = get_response(html_url=html_url)
    # 获取网页源代码, html字符串数据
    # print(response.text)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

解析提取,

小说章节名, 以及小说内容

  • 根据标签属性提取数据内容

    1. 小说章节名字

      .style_h1 定位标签

      get() 获取第一个标签内容 相当于获取一个, 返回字符串

      getall() 获取所有标签内容, 返回列表

html字符串数据 <response.text>, 转成可解析对象

selector = parsel.Selector(response.text)
  • 1

提取标题

title = selector.css('.style_h1::text').get()
  • 1

提取内容

content_list = selector.css('#article>p::text').getall()
  • 1

保存文字, 保存字符串数据

所有要把 列表转成字符串数据类型

列表转成字符串数据类型?

for 遍历提取列表里面元素

str 强制转换数据类型

str.join()列表合并为字符串

'\n'.join(content_list) 以换行符, 把列表里面元素一个一个合并起来变成一个字符串

content = '\n'.join(content_list)
  • 1

返回标题, 小说内容

return title, content
  • 1

保存函数

def save(name, title, content):
    """
    python学习交流Q裙:261823976 ### 源码领取
    保存函数
    :param title: 小说章节名
    :param content: 小说内容
    :return:
    """
    # # replace 字符串替换, 把 / 替换成 -
    # title = title.replace('/', '-')  保存 a 追加 w 写入会覆盖
    with open(name + '.txt', mode='a', encoding='utf-8') as f:
        f.write(title)
        f.write('\n')
        f.write(content)
        f.write('\n')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

搜索函数

def search(word):
    """
    搜索函数
    :param word: 小说名
    :return:
    """
    search_url = 'https://*****.com/search/'
    data = {
        'searchkey': word
    }
    search_data = requests.post(url=search_url, data=data, headers=headers).text
    novel_id_list = re.findall('<a href="/book/(\d+)/">', search_data)
    name_list = re.findall('<h3>(.*?)<span class="hot">(.*?)</span>(.*?)</h3>', search_data)
    name_list = [''.join(j) for j in name_list]
    # 仅匹配中文
    writer_list = re.findall('<i class="fa fa-user-circle-o">&nbsp;</i>.*?(.*?)&nbsp;&nbsp;<span class="s_gray">', search_data)
    writer_list = [z.replace('<span class="hot">', '').replace('</span>', '') for z in writer_list]
    tb = pt.PrettyTable()
    tb.field_names = ['序号', '书名', '作者', '书ID']
    page = 0
    novel_info_list = []
    for novel_id, name, writer in zip(novel_id_list, name_list, writer_list):
        dit = {
            '书名': name,
            '作者': writer,
            '书ID': novel_id,
            '信息': '完整源码获取加Q裙: 261823976'
        }
        print(dit)
        novel_info_list.append(dit)
        tb.add_row([page, name, writer, novel_id])
        page += 1
    print(tb)
    num = input('请输入你想要下载小说序号: ')
    novel = novel_info_list[int(num)]['书ID']
    return novel
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

获取小说名字

ef main(word):
    """
    主函数
    :return:
    """
    novel_id = search(word)
    # 小说目录页 https://ssbiqu.com/book/5613/
    url = f'https://****.com/book/{novel_id}/'
    # 获取小说名字
    name, link_list = get_novel_info(novel_url=url)
    # for循环遍历 提取内容
    for link in tqdm(link_list):
        # 获取小说内容
        title, content = get_content(html_url=link)
        save(name, title, content)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

PS:源码如有需要的小伙伴可以加下方的群去找管理员免费领取

尾语 ?

我给大家准备了一些资料,包括:

2022最新Python视频教程、Python电子书10个G

(涵盖基础、爬虫、数据分析、web开发、机器学习、人工智能、面试题)、Python学习路线图等等

直接在文末名片自取即可!

有更多建议或问题可以评论区或私信我哦!一起加油努力叭(ง •_•)ง

喜欢就关注一下博主,或点赞收藏评论一下我的文章叭!!!

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载