首页 > 编程语言 >Python借助Selenium,保留原样式拷贝网站资源

Python借助Selenium,保留原样式拷贝网站资源

时间:2024-08-16 14:39:18浏览次数:15  
标签:Python Selenium url tag file path 拷贝 save dir


import urllib3
from selenium import webdriver
from bs4 import BeautifulSoup
import os
import requests
from urllib.parse import urljoin, urlparse
import base64
import re
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry

# 屏蔽 InsecureRequestWarning 警告
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

# 创建保存文件的目录
save_dir = 'website_copy'
os.makedirs(save_dir, exist_ok=True)

# 设置Chrome浏览器的驱动路径
driver_path = 'chromedriver-win64/chromedriver.exe'

# 初始化Selenium
driver = webdriver.Chrome(executable_path=driver_path)

# 访问目标网站
url = 'https://example.com/'
driver.get(url)

# 获取页面源代码
page_source = driver.page_source

# 获取页面的URL,用于后续的相对路径处理
base_url = driver.current_url

# 关闭浏览器
driver.quit()


# 下载文件的函数,包含对data URL的处理,并保留原始目录结构
def download_file(url, save_dir):
    """下载文件并保存到指定目录,保留原始目录结构"""
    if url.startswith('data:'):
        # 处理 data URL
        match = re.match(r'data:(.*?);base64,(.*)', url)
        if match:
            mime_type = match.group(1)
            data = match.group(2)
            file_extension = mime_type.split('/')[-1]
            file_name = os.path.join(save_dir, f"embedded_image.{file_extension}")
            try:
                with open(file_name, 'wb') as file:
                    file.write(base64.b64decode(data))
                return file_name
            except Exception as e:
                print(f"Error saving embedded data URL: {e}")
    else:
        # 设置重试机制
        session = requests.Session()
        retry = Retry(total=5, backoff_factor=0.3, status_forcelist=[500, 502, 503, 504])
        adapter = HTTPAdapter(max_retries=retry)
        session.mount('https://', adapter)
        session.mount('http://', adapter)

        try:
            response = session.get(url, verify=False)  # 禁用SSL验证
            if response.status_code == 200:
                # 构造保存路径,保留原始目录结构
                parsed_url = urlparse(url)
                file_path = os.path.join(save_dir, parsed_url.path.lstrip('/'))
                file_dir = os.path.dirname(file_path)
                os.makedirs(file_dir, exist_ok=True)

                # 保存文件
                with open(file_path, 'wb') as file:
                    file.write(response.content)
                return parsed_url.path
        except Exception as e:
            print(f"Error downloading {url}: {e}")
    return None


# 解析HTML
soup = BeautifulSoup(page_source, 'html.parser')

# 处理CSS文件、JS文件、图片等资源
for tag in soup.find_all(['link', 'script', 'img']):
    if tag.name == 'link' and tag.get('rel') == ['stylesheet']:
        # CSS文件
        css_url = urljoin(base_url, tag['href'])
        local_css = download_file(css_url, save_dir)
        if local_css:
            tag['href'] = local_css

    elif tag.name == 'script' and tag.get('src'):
        # JS文件
        js_url = urljoin(base_url, tag['src'])
        local_js = download_file(js_url, save_dir)
        if local_js:
            tag['src'] = local_js

    elif tag.name == 'img' and tag.get('src'):
        # 图片文件
        img_url = urljoin(base_url, tag['src'])
        local_img = download_file(img_url, save_dir)
        if local_img:
            tag['src'] = local_img

# 保存修改后的HTML文件
with open(os.path.join(save_dir, 'index.html'), 'w', encoding='utf-8') as file:
    file.write(str(soup))

print("Website resources have been successfully copied and saved to:", save_dir)


标签:Python,Selenium,url,tag,file,path,拷贝,save,dir
From: https://www.cnblogs.com/felixwan/p/18362794

相关文章

  • Python魔法应用:自动化日常任务:让Python成为你的私人助理
    自动化日常任务:让Python成为你的私人助理引言自动化文本处理:批量重命名文件、整理数据批量重命名文件整理数据自动化邮件发送:使用smtplib发送邮件自动化网页交互:使用requests库获取网页数据结语引言在日常工作和学习中,我们常常会遇到大量重复且繁琐的任务,这些任务......
  • python 之 pytest框架
    一、pytest单元测试框架1、什么是单元测试,针对软件的最小单位(函数,方法,接口)进行正确性的检查测试。 2、单元测试框架(按语言分)java:junit和testingpython:unittest和pytest 3、单元测试主要是做什么呢?(1)、测试发现:从多个文件里面去找到测试用例(2)、测试执行:按......
  • python蟒蛇绘制
    turtle海龟绘图setup()设置窗体大小及位置setup()不是必须的importturtleturtle.setup(650,350,200,200)turtle.penup()turtle.fd(-250)turtle.pendown()turtle.pensize(25)turtle.pencolor("purple")turtle.seth(-40)foriinrange(4):turtle.circle(40,80)......
  • Python温度的转换
    神清气爽哈哈哈程序代码:#温度的转换TempStr=input("请输入带有符号的温度值:")ifTempStr[-1]in['F','f']:#判断字符转最后一个字符是否为F或fc=(eval(TempStr[0:-1])-32)/1.8#将摄氏度转化为华氏度print("转换后的温度是{:.2f}C".format(c))#eva......
  • 【Python SHA256 摘要算法】
    SHA256是一种广泛使用的密码散列函数,用于生成数据的唯一指纹,即散列值。它属于SHA-2家族,该家族还包括SHA-384和SHA-512算法。SHA256算法在许多领域都有应用,例如:数据完整性验证:用于验证数据在传输或存储过程中是否被篡改。例如,在下载软件时,通常会提供软件的SHA256哈......
  • 使用Python创建省份城市地图选择器
    在这篇博客中,我们将探讨如何使用Python创建一个简单而实用的省份城市地图选择器。这个项目不仅能帮助我们学习Python的基础知识,还能让我们了解如何处理JSON数据和集成网页浏览器到桌面应用程序中。C:\pythoncode\new\geographicgooglemap.py全部代码importwximportwx.......
  • 【Python-办公自动化】1秒提取PPT文本内容形成目录保存至WORD
    欢迎来到"花花ShowPython",一名热爱编程和分享知识的技术博主。在这里,我将与您一同探索Python的奥秘,分享编程技巧、项目实践和学习心得。无论您是编程新手还是资深开发者,都能在这里找到有价值的信息和灵感。自我介绍:我热衷于将复杂的技术概念以简单易懂的方式呈现给大家,......
  • 【Python-办公自动化】几分钟生成上万份合同(用此思路可以用于写作固定格式的文章)
    欢迎来到"花花ShowPython",一名热爱编程和分享知识的技术博主。在这里,我将与您一同探索Python的奥秘,分享编程技巧、项目实践和学习心得。无论您是编程新手还是资深开发者,都能在这里找到有价值的信息和灵感。自我介绍:我热衷于将复杂的技术概念以简单易懂的方式呈现给大家,......
  • SSM-国外鞋服代购平台-97782(免费领源码+开发文档)可做计算机毕业设计JAVA、PHP、爬虫、
    SSM国外鞋服代购平台摘 要随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,鞋服代购平台当然也不例外。代购平台是以实际运用为开发背景,运用软件工程原理和开发方法,采用Java技术构建的一个管理系统。整个开发过......
  • 使用magicAPI对接python 文件,上传参数获取不到回参问题
    1、在python文件中,创建post请求 @app.route('/post_endpoint',methods=['POST'])defhandle_post_request():#从请求中获取JSON数据data=request.form#打印接收到的数据(可选,用于调试)print(data)returnjsonify(data),200 这个方法,是得到form-data返回的参......