易优CMS PHP原生标签调用

简介: 这段代码实现了一个自动化工具,用于从指定的漫画网站下载章节内容,并将其转换为PDF格式。它首先通过用户输入的链接获取网页信息,然后根据用户的选择下载整个章节或特定章节的图片,并保存到本地文件夹中。下载完成后,工具会将这些图片合并成一个PDF文件,并添加书签以便于浏览。此外,代码还包含了异常处理机制,确保在网络不稳定时能够重试下载。

import requests
from lxml import etree
import os
import time
import random
from PIL import Image
import re
from PyPDF2 import PdfWriter, PdfReader
//代码效果参考:https://www.tvdy.cn/sitemap/post.xml
//代码效果参考:https://www.nbhbjx.cn/sitemap/post.xml
//代码效果参考:https://www.vipwb.com/sitemap/post.xml
//代码效果参考:https://www.257342.com/sitemap/post.xml
//代码效果参考:https://www.uagu.cn/sitemap/post.xml
//代码效果参考:https://www.szworkshop.com.cn/sitemap/post.xml
//代码效果参考:http://www.603393.com/sitemap/post.xml
//代码效果参考:https://www.weibow.com/sitemap/post.xml
//代码效果参考:https://www.xx-ph.com/sitemap/post.xml
//代码效果参考:https://www.h3cw.com/sitemap/post.xml
//代码效果参考:http://www.mwgw.cn/sitemap/post.xml
//代码效果参考:http://www.intpipe.com/sitemap/post.xml
def get_zj_url(url):
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.53"
}
try:
response = requests.get(url=url, headers=headers)
if response.status_code == 200:
html = response.text
all_doc_page = etree.HTML(html)

        # 获取网站标题
        title = all_doc_page.xpath('//title/text()')[0]
        zj_url = all_doc_page.xpath('//*[@id="chapters_other_list"]/div/a/@href')
        zj_title = all_doc_page.xpath('//*[@id="chapters_other_list"]/div/a/div/span/text()')
        dir2 = os.path.join(dir1, title)
        os.makedirs(dir2, exist_ok=True)
        return zj_url,zj_title,dir2
except Exception as e:
    print("【请求失败,请检查URL和网络环境!】")
    print(e)

def get_chapter(url,title,dir2):
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.53"
}
count = 0 # 记录当前重试次数
while True:
try:
response = requests.get(url=url, headers=headers)
if response.status_code == 200:
html = response.text
all_doc_page = etree.HTML(html)
tp_url = all_doc_page.xpath('//ul[@class="comic-contain"]/div/amp-img/@data-src')

            #print(tp_url)
            if "\\" in title:
                title = title.replace("\\", "")
            if "?" in title:
                title = title.replace("?", "")
            download_images(tp_url, dir2 ,title)
            jpg2pdf(dir2, title)
            #return tp_url
            break
    except Exception as e:
        if count < 1: # 最多重试5次
            print("【请求失败,5秒钟后将重新尝试!】")
            print(e)
            count += 1
            time.sleep(5) # 等待5秒后再次发送请求
        else:
            print("【已达到最大重试次数,请检查URL和网络环境!】")
            print(e)
            break

def get_chapter_list(url_list,url_title,dir2):
for i , url in enumerate(url_list):
url_a='https://cn.baozimh.com/'+url[1:]
get_chapter(url_a,url_title[i],dir2)
time.sleep(5)

def main():
url = input("请输入链接:")
creat_dir(dir1)
global dir2

# 判断输入是否是 URL 链接
if url.startswith("http://") or url.startswith("https://"):
    # 判断链接类型
    if "comic" in url:
        download_type = input("这是一个目录页,请选择下载类型(1-只下载最新,2-下载全部, 3-从某章节开始):")
        if download_type == "1":
            print("执行下载最新内容操作!")
            # TODO: 实现下载最新内容的代码
            zj_url,zj_title,dir2=get_zj_url(url)
            get_chapter('https://cn.baozimh.com/'+zj_url[0],zj_title[0],dir2)
            #download_images(url_list, folder_name,chapter_name)
        elif download_type == "2":
            print("执行下载完整内容操作!")
            # TODO: 实现下载完整内容的代码
            zj_url,zj_title,dir2=get_zj_url(url)
            get_chapter_list(zj_url,zj_title,dir2)
        elif download_type == "3":
            zj_url,zj_title,dir2=mouzj(url)
            get_chapter_list(zj_url,zj_title,dir2)
        else:
            print("输入不正确,请重新运行程序!")
    elif "chapter" in url:
        print("这是一篇内容页!")
        # TODO: 实现下载内容页的代码
        tp_url=get_chapter(url)
        print(tp_url)
    else:
        print("这不是一个漫画网站!")
else:

    print("输入不是合法的 URL 链接!")

def mouzj(url):
zj_int = input("请输入章节:")
zj_url,zj_title,dir2=get_zj_url(url)

#zj_url,zj_title=zj_url[::-1],zj_title[::-1]#转置
element=f"{zj_int}"
for i, s in enumerate(zj_title):
    if element in s: # 判断元素中是否包含字符串 "第24话"
        zj_title = zj_title[i:] # 根据索引值获取从该位置开始的所有元素
        zj_url = zj_url[i:]
        return zj_url,zj_title,dir2
        break
else:
    print(f"转置数组中不存在元素 {element}")
    return 

下载图片并保存到指定文件夹中

def download_images(url_list, folder_name, chapter_name):

# 创建文件夹
if not os.path.exists(folder_name):
    os.makedirs(folder_name)

for i, url in enumerate(url_list):
    count = 0 # 记录重试次数
    while count < 3: # 最多重试 3 次
        try:
            res = requests.get(url)
            if res.status_code == 200:
                with open(os.path.join(folder_name, chapter_name + '-' + str(i) + '.jpg'), 'wb') as f:
                    f.write(res.content)
                print('下载完成:', os.path.join(folder_name, chapter_name + '-' + str(i) + '.jpg'))
                break # 下载成功,退出循环
            else:
                count += 1 # 下载失败,重试
        except Exception as e:
            print(e)
            count += 1 # 下载失败,重试

        # 随机等待 0~2 秒再进行下一次请求
        time.sleep(random.uniform(0, 2))

    if count == 3:
        print('下载失败:', url)

def creat_dir(dir_name):
os.makedirs(dir_name, exist_ok=True)

def jpg2pdf(images_folder, doc_id):

#image_list = []
#for i, file_name in enumerate(os.listdir(images_folder)):
#    if file_name.endswith((".jpg", ".png")):
#        image_path = os.path.join(images_folder, file_name)
#        img = Image.open(image_path)
#        if img.mode != "RGB":
#            img = img.convert("RGB")
#        image_list.append(img)
        #os.remove(image_path)
pdf_path = os.path.join(images_folder, f"{doc_id}.pdf")
# 获取所有图片文件的路径
folder_path = images_folder
image_paths = [os.path.join(folder_path, f) for f in os.listdir(folder_path) if f.endswith(".jpg") or f.endswith(".png")]
image_paths = natural_sort(image_paths)
# 将所有图片合并成一个 PDF 文档
image_list = [Image.open(img) for img in image_paths]
image_list[0].save(pdf_path, "PDF", resolution=100.0, save_all=True, append_images=image_list[1:])
if os.path.exists(pdf_path):
    print(f"{doc_id} 【转换为pdf成功!】")
    for image_path in [os.path.join(images_folder, file_name) for file_name in os.listdir(images_folder) if file_name.endswith((".jpg", ".png"))]:
        os.remove(image_path)
    print(f"{doc_id} 【文件夹图片删除!---添加书签】")
    add_bookmark_to_pdf(pdf_path, doc_id)
else:
    print(f"{doc_id} 【转换失败,请检查!】")

def add_bookmark_to_pdf(pdf_file, bookmark_title):

# 读取PDF文件
pdf_reader = PdfReader(open(pdf_file, 'rb'))
pdf_writer = PdfWriter()

# 添加第一页的书签
first_page = pdf_reader.pages[0]
first_page_title = pdf_writer.add_outline_item(bookmark_title, 0)
pdf_writer.add_page(first_page)

# 将其余页面添加到新的PDF文件中
for page_num in range(1, len(pdf_reader.pages)):
    page = pdf_reader.pages[page_num]
    pdf_writer.add_page(page)

# 写入新的PDF文件
with open(pdf_file, 'wb') as out_pdf_file:
    pdf_writer.write(out_pdf_file)
    print(f"{bookmark_title} 【添加书签成功!】")

def natural_sort(l):
"""
对列表中的元素进行自然排序
"""
convert = lambda text: int(text) if text.isdigit() else text.lower()
alphanum_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key)]
return sorted(l, key=alphanum_key)

dir1='output'

if name == "main":
main()

相关文章
|
11天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
8天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2520 17
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
7天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1522 15
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
|
3天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
9天前
|
编解码 JSON 自然语言处理
通义千问重磅开源Qwen2.5,性能超越Llama
击败Meta,阿里Qwen2.5再登全球开源大模型王座
574 14
|
1月前
|
运维 Cloud Native Devops
一线实战:运维人少,我们从 0 到 1 实践 DevOps 和云原生
上海经证科技有限公司为有效推进软件项目管理和开发工作,选择了阿里云云效作为 DevOps 解决方案。通过云效,实现了从 0 开始,到现在近百个微服务、数百条流水线与应用交付的全面覆盖,有效支撑了敏捷开发流程。
19282 30
|
10天前
|
人工智能 自动驾驶 机器人
吴泳铭:AI最大的想象力不在手机屏幕,而是改变物理世界
过去22个月,AI发展速度超过任何历史时期,但我们依然还处于AGI变革的早期。生成式AI最大的想象力,绝不是在手机屏幕上做一两个新的超级app,而是接管数字世界,改变物理世界。
481 49
吴泳铭:AI最大的想象力不在手机屏幕,而是改变物理世界
|
1月前
|
人工智能 自然语言处理 搜索推荐
阿里云Elasticsearch AI搜索实践
本文介绍了阿里云 Elasticsearch 在AI 搜索方面的技术实践与探索。
18839 20
|
1月前
|
Rust Apache 对象存储
Apache Paimon V0.9最新进展
Apache Paimon V0.9 版本即将发布,此版本带来了多项新特性并解决了关键挑战。Paimon自2022年从Flink社区诞生以来迅速成长,已成为Apache顶级项目,并广泛应用于阿里集团内外的多家企业。
17528 13
Apache Paimon V0.9最新进展
|
2天前
|
云安全 存储 运维
叮咚!您有一份六大必做安全操作清单,请查收
云安全态势管理(CSPM)开启免费试用
364 4
叮咚!您有一份六大必做安全操作清单,请查收