吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5399|回复: 27
收起左侧

[Python 转载] 多线程任意网站小说下载配置版

[复制链接]
jayfox 发表于 2020-8-9 15:30
本帖最后由 jayfox 于 2020-8-17 20:37 编辑

疫情在家太无聊,就开始看小说,但是发现很多小说不是要开会员就是带有大量广告,
于是就有了爬取小说的想法,但是每次搜索到的网站都是不一样的,总不能每次都
重新写个爬虫啊,于是就有了这个整合版本的,这是第一版灵感来自于一个看书软件
但是软件被收购了以后就不维护了,现在不能用了,只能自己动手解决这些问题了
贴代码
[Python] 纯文本查看 复制代码
import configparser, os, requests, chardet, time, refrom lxml import etree
from multiprocessing import Pool
from requests.adapters import HTTPAdapter
from urllib.parse import urljoin  # 网址绝对路径与相对路径拼接

xzwz = ''  # 下载小说的网址
ml = ''  # 得到目录页连接
bt = ''  # 得到目录页标题
zw = ''  # 得到小说正文

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 

Safari/537.36',

}


def mkdir(path):  # 创建目录

    isExists = os.path.exists(path)  # 判断路径是否存在  # 存在     True  # 不存在   False
    if not isExists:  # 判断结果  # 如果不存在则创建目录
        os.makedirs(path)  # 创建目录操作函数
        print(path + ' 创建成功')
        return True
    else:
        # 如果目录存在则不创建,并提示目录已存在
        print(path + ' 目录已存在')
        return False


def duini():
    global xzwz, bt, zw, ml
    # print('读取网址列表')
    cf = configparser.ConfigParser()
    cf.read("网址接口.ini")

    wzlist = cf.options('下载页')
    # print(wzlist)
    # print(type(wzlist))
    wzm = wzlist[0]
    print(wzm)

    xzwz = cf.get('下载页', wzm)
    ml = cf.get(wzm, '目录连接')
    bt = cf.get(wzm, '目录标题')
    zw = cf.get(wzm, '正文')
    # print(pjt)
    # print(wzlist[0])
    # print(xzwz)
    # print(bt)
    path = os.getcwd() + '/小说下载'
    mkdir(path)
    os.chdir(path)


def huoqulist():
    global xzwz, ml, bt
    print('获取列表中.......')
    print(xzwz)
    # print(type(xzwz))
    # print(type(ml)  ,bt,zw)
    s = requests.Session()
    s.mount('http://', HTTPAdapter(max_retries=3))
    s.mount('https://', HTTPAdapter(max_retries=3))
    try:
        html = requests.get(xzwz, headers=headers)
        e = chardet.detect(html.content)['encoding']
        html.encoding = e
        # print(html.text)
        txt = etree.HTML(html.text)
        # print(txt)
        tlj = txt.xpath(ml)
        tbt = txt.xpath(bt)  # text() 为提取文字内容,不然就要在下面  写  i.text
        bturl = []
        print('一共有  %d   章' % len(tlj))
        if len(tlj) == 0 or len(tbt) == 0:
            print('目录获取失败,检查下载页面和正则配置是否正确')
        else:
            for i in range(len(tlj)):
                name = re.sub('[\/:*?"“”<>~  !,:‘’|]', '', tbt[i])#文件名安全化处理
                # print(name)
                fullurl = urljoin(xzwz, tlj[i])
                bturl.append(fullurl + '|' + name)
                # 分割写法   url = ulist.split('|')[0]
                # print(i)
            #print(bturl)
            return (bturl)
    except requests.exceptions.RequestException as e:
        print(e)


def test(i, url_1, zw):
    # print(i, pjt, url_1)
    time.sleep(1)
    wjm = url_1.split('|')[1]
    lj = url_1.split('|')[0]

    wj = os.getcwd() + '/{}.txt'.format(wjm)
    if not os.path.exists(wj):
        print(i, wjm)
        s = requests.Session()
        s.mount('http://', HTTPAdapter(max_retries=3))
        s.mount('https://', HTTPAdapter(max_retries=3))
        try:
            html = requests.get(lj, headers=headers, timeout=5)
            e = chardet.detect(html.content)['encoding']
            html.encoding = e
            txt = etree.HTML(html.text)
            nr = txt.xpath(zw)
            wb = ''
            for x in nr:
                # print(x)
                wb = wb + x
            # print(wb)
            time.sleep(0.5)
            # print(wj)
            with open(wj, 'w', encoding='GBK') as f:
                f.write(wb)
        except requests.exceptions.RequestException as e:
            print(e)


def is_number(s):  # 判断是否为数字
    try:
        float(s)
        return True
    except ValueError:
        pass

    try:
        import unicodedata
        unicodedata.numeric(s)
        return True
    except (TypeError, ValueError):
        pass

    return False


if __name__ == '__main__':
    print('start')
    duini()
    time.sleep(1)
    clist = huoqulist()
    #input()
    pool = Pool(processes=30)
    if len(clist) > 0:
        for i in range(len(clist)):
            # print(i)
            url_1 = clist[i]
            pool.apply_async(test, args=(i, url_1, zw))  # 维持执行的进程总数为10,当一个进程执行完后启动一

个新进程.test  为进程名字
        pool.close()
        pool.join()
    else:
        print('clist  列表为空列表')

# test(1, 'http://www.xbiquge.la/10/10489/9700534.html|第459章冥丹')
#下面是修改后的  增加了一个合并因为很多下载下来的片段文本不方便阅读

    fname = open('./new.txt', "w")
    for x in range(len(clist)):
        print('正在合并文件第     %s    章' % x)
        name = clist[x].split('|')[1]
        xx = open('./{}.txt'.format(name), 'r')
        fname.write(xx.read())
        xx.close()
    fname.close()

   


使用方法:把附件解压出来跟程序放在同一文件夹就可以了
需要xpath正则基础,各目录提取需要自己写
我自己适配了几个网址,其他的自己添加
大部分可以用第一种配置就可以了
图片说明粉色是下载的网址  一定要是小说的目录那一页
红色是用的那个配置   名字要一样
G%9W3]SUIO6UD5983_X1RNJ.png

网址接口.zip

392 Bytes, 下载次数: 208, 下载积分: 吾爱币 -1 CB

免费评分

参与人数 6吾爱币 +5 热心值 +6 收起 理由
lunker2019 + 1 + 1 用心讨论,共获提升!
LOVEFYL + 1 + 1 我很赞同!
qq9953 + 1 我很赞同!
lin_xop + 1 + 1 热心回复!
CharlieRichard + 1 + 1 很有用
辰迷星海 + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| jayfox 发表于 2020-8-9 15:44
辰迷星海 发表于 2020-8-9 15:36
收藏了,同为书友很实用!

小说看完了,还有漫画和电影呢,
我正在整合漫画的
后面再整个电影的就完美了
辰迷星海 发表于 2020-8-9 15:36
星星之夜 发表于 2020-8-9 15:38
wjx790 发表于 2020-8-9 15:39
搞下来,学习学习
玄冥岚 发表于 2020-8-9 15:39
能爬飞卢刺猬猫的吗?
 楼主| jayfox 发表于 2020-8-9 15:43
玄冥岚 发表于 2020-8-9 15:39
能爬飞卢刺猬猫的吗?

理论上是可以  你把地址给我测试一下
chenqin19940109 发表于 2020-8-9 15:46
大神666,收藏先
绫音 发表于 2020-8-9 15:49
感谢分享
辰迷星海 发表于 2020-8-9 15:50
jayfox 发表于 2020-8-9 15:44
小说看完了,还有漫画和电影呢,
我正在整合漫画的
后面再整个电影的就完美了

期待漫画
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-1 05:23

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表