Python克隆单个网页

网上所有代码都无法完全克隆单个网页,不是Css,Js下载不下来就是下载下来也不能正常显示,只能自己写了,记得点赞~

 效果如图:

源码与所需的依赖:

pip install requests
pip install requests beautifulsoup4 lxml 
requests.packages.urllib3.disable_warnings()
pip install urllib3
pip install pyOpenSSL requests[security] urllib3[secure]
import os
import time
import requests
from urllib.parse import urljoin
from bs4 import BeautifulSoup

# 配置requests,不验证SSL证书
requests.packages.urllib3.disable_warnings()
session = requests.Session()
session.verify = False  # 不推荐,仅用于测试目的

def sanitize_filename(filename):
    return "".join(i for i in filename if i not in "\/:*?<>|").split('?')[0]

def ensure_dir(file_path):
    if file_path:
        directory = os.path.dirname(file_path)
        if directory and not os.path.exists(directory):
            os.makedirs(directory)

def download_resource(url, dest_folder, local_path):
    try:
        r = session.get(url, stream=True)
        r.raise_for_status()
        ensure_dir(local_path)
        with open(local_path, 'wb') as f:
            for chunk in r.iter_content(chunk_size=8192):
                f.write(chunk)
        return True
    except requests.exceptions.RequestException as e:
        print(f"Error downloading {url}: {e}")
        return False

def update_resource_links(soup, tag, attribute, base_url, dest_folder, sub_folder):
    resources = soup.find_all(tag, {attribute: True})
    for resource in resources:
        old_url = resource[attribute]
        new_url = urljoin(base_url, old_url)
        local_filename = sanitize_filename(new_url.split('/')[-1])
        local_path = os.path.join(dest_folder, sub_folder, local_filename)
        full_local_path = os.path.abspath(local_path)
        if download_resource(new_url, dest_folder, full_local_path):
            resource[attribute] = os.path.join(sub_folder, local_filename).replace('\\', '/')

def save_complete_webpage(url, dest_folder):
    response = session.get(url)
    response.raise_for_status()

    # 尝试从响应头部或内容中获取编码
    if response.encoding is None:
        response.encoding = response.apparent_encoding

    soup = BeautifulSoup(response.content, 'html.parser', from_encoding=response.encoding)

    base_url = url
    update_resource_links(soup, 'img', 'src', base_url, dest_folder, 'images')
    update_resource_links(soup, 'link', 'href', base_url, dest_folder, 'css')
    update_resource_links(soup, 'script', 'src', base_url, dest_folder, 'js')

    ensure_dir(os.path.join(dest_folder, 'index.html'))
    with open(os.path.join(dest_folder, 'index.html'), 'w', encoding=response.encoding) as file:
        file.write(soup.prettify())

if __name__ == "__main__":
    timestamp = str(int(time.time()))[-5:]  # 获取当前时间戳的最后5位数字
    target_url = input("请输入网址:")  # 目标网址
    destination_folder = f'downloaded_website_{timestamp}'  # 添加时间戳后5位的本地文件夹路径

    save_complete_webpage(target_url, destination_folder)
    print(f"已完整,保存到{destination_folder}文件夹中")

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Zigbee—网络层地址分配机制

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;孤雏 0:21━━━━━━️&#x1f49f;──────── 4:14 &#x1f504; ◀️ ⏸ ▶️ ☰ &#x1f497;关注…

CSS特效004:hover图片,显示文字或附加层

css实战中&#xff0c;时常会碰见鼠标放在某个区块上&#xff0c;显示出一段文字或者其他附加信息。思路是利用position的层叠关系&#xff0c;将文字层放在图片的上面&#xff0c;display:none; hover的时候层 display&#xff1a;block。 效果图 源代码 /* * Author: 大剑师…

windows系统自动更新中断电导致系统无法开启

windows系统自动更新中断电导致系统无法开启 现象原因解决进入bios拆机更新系统重新安装内存条 现象 前一天晚上电脑出现合上之后风扇继续转的现象&#xff0c;拔掉电源后&#xff0c;第二天开不了机。现象为按压电源键&#xff0c;电源键和充电指示灯亮一次后熄灭&#xff0c…

复盘一个诡异的Bug

该Bug的诡异之处在于这是一个由多种因素综合碰撞之后形成的综合体。纵观整个排查过程&#xff0c;一度被错误的目标误导&#xff0c;花费大量功夫后才找到问题点所在&#xff0c;成熟的组件在没有确凿证据之前不能随意怀疑其稳定性。 前言 此前在接入两台粒径谱仪&#xff08;…

SPASS-探索性分析

探索性分析的意义 探索性分析更加强大,它是一种在对资料的性质、分布特点等完全不清楚的情况下,对变量进行更深入研究的描述性统计方法。在进行统计分析前,通常需要寻求和确定适合所研究的问题的统计方法, SPSS提供的探索性分析是解决此类问题的有效办法 探索性分析提供了很…

消息中间件 - RocketMQ基础

一个进程内能够创建的线程数量是有限的。 所有中间件的目的&#xff1a; 性能效率上的一个提升代理&#xff1a;帮你去完成一些额外的事情 MQ介绍 MQ概述 MQ全称Message Queue&#xff08;消息队列&#xff09;&#xff0c;是在消息的传输过程中保存消息的容器&#xff0…

ArcGIS小技巧|四种计算图斑面积的方法

ArcGIS中有多种方法可计算出图斑面积&#xff0c;本文总结了四种方法&#xff0c;是否可堪称史上最全&#xff1f; 1、计算几何 这是最适合非专业人士的方法&#xff0c;直接利用ArcGIS中的计算几何功能进行计算。 a、首先添加一double类型字段&#xff0c;用来存储面积数值。…

论文阅读——Detection Hub(cvpr2023)

Detection Hub: Unifying Object Detection Datasets via Query Adaptation on Language Embedding 一、要解决的问题 大规模数据集可以提高模型性能&#xff0c;但是当训练多类别单一模型时&#xff0c;大规模数据集不能用在目标检测任务上&#xff0c;因为两个困难&#xff1…

【qemu逃逸】XCTF 华为高校挑战赛决赛-pipeline

前言 虚拟机用户名: root 无密码 设备逆向与漏洞分析 程序没有去符合, 还是比较简单. 实例结构体如下: 先总体说一下流程: encode 为 base64 编码函数, decode 为 base64 解码函数. 然后 encPipe 和 decPipe 分别存放编码数据和解码数据, 分别有四个: 其中 EncPipeLine 中…

简单选择排序(c语言代码实现)

选择排序&#xff1a;简单选择排序&#xff08;不稳定的排序&#xff09; 简单选择排序是一种基础的排序算法&#xff0c;它的基本思路是在未排序的序列中选择最小&#xff08;或最大&#xff09;的元素&#xff0c;将其与序列的第一个元素进行交换&#xff0c;然后在剩余的未…

解决idea启动tomcat控制台中文乱码

#1.tomcat日志中文乱码# 如图这种情况&#xff0c;一般在idea用tomcat跑一个web项目启动后tomcat日志在控制台打印出来会出现中文乱码的情况 解决方案1&#xff1a;tomcat的日志配置文件的编码修改&#xff0c;找到tomcat安装目录conf下的logging.properties&#xff0c;encod…

2022年06月 Python(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 有如下Python程序,包含lambda函数,运行该程序后,输出的结果是?( ) g = lambda x,y:x*y print(g(2,3)

【数据结构】树与二叉树(七):二叉树的遍历

文章目录 5.1 树的基本概念5.1.1 树的定义5.1.2 森林的定义5.1.3 树的术语5.1.4 树的表示 5.2 二叉树5.2.1 二叉树1. 定义2. 特点3. 性质引理5.1&#xff1a;二叉树中层数为i的结点至多有 2 i 2^i 2i个&#xff0c;其中 i ≥ 0 i \geq 0 i≥0。引理5.2&#xff1a;高度为k的二叉…

从0到1的Springcloud Alibaba项目,一篇入门!!!

1、新建项目 我们用maven管理项目 第一步&#xff1a;选择maven 第二步&#xff1a;项目命名&#xff0c;项目路径 第三步&#xff1a;进入项目&#xff0c;把src文件夹删掉&#xff08;不删也没事&#xff0c;主要是用不到这个文件夹&#xff09; 2、引入项目依赖 在父项目…

【vue会员管理系统】篇六之退出系统功能

一、效果图 点击之后跳转到登陆界面 二、实现步骤 2.1Easy Mock新增接口 打开Easy Mock新建接口 方法:post URL:user/logout 描述&#xff1a;退出系统 2.2新增api 在api/login.js下添加以下代码 export function logout(token) {return request({url: /user/logout,method:…

小白学安全-KunLun-M静态白盒扫描工具

一、KunLun-M简介 KunLun-M是一个完全开源的静态白盒扫描工具&#xff0c;支持PHP、JavaScript的语义扫描&#xff0c;基础安全、组件安全扫描&#xff0c;Chrome Ext\Solidity的基础扫描。开源地址&#xff1a;https://github.com/LoRexxar/Kunlun-M Cobra是一款源代码安全审计…

板刷codeforces 1000分

练习 1.Problem - 1A - Codeforces AC代码: #include <bits/stdc.h> #define endl \n #define int long long using namespace std; int n,m,a; void solve() {cin>>n>>m>>a;cout<<(n/a(n%a!0))*(m/a(m%a!0))<<endl; } signed main() {…

两数相加 js

道阻且长&#xff0c;行而不辍&#xff0c;未来可期 两数相加 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 …

ElementUI的Dialog弹窗实现拖拽移动功能

实现ElementUI的Dialog弹窗可以拖拽移动 实现步骤&#xff1a; 1.创建自定义指令 在utils文件夹下新建文件夹 utils/directive/el-dragDialog/index.js import drag from ./dragconst install function(Vue) {Vue.directive(el-drag-dialog, drag) }if (window.Vue) {windo…

操作系统·进程管理

2.1 前趋图和程序执行 2.1.1 前趋图 前趋图是一个有向无循环图&#xff0c;记为DAG&#xff0c;可用于描述程序/进程之间执行的前后关系&#xff0c;无循环关系可实现顺序执行。 2.1.2 程序的顺序执行 在计算机系统中只有一个程序在运行&#xff0c;这个程序独占系统中所有资…