Python實(shí)現(xiàn)下載網(wǎng)頁(yè)并將資源改為本地相對(duì)路徑
一、教程目標(biāo)
本教程實(shí)現(xiàn)以下功能:
1、下載指定 URL 的 HTML 頁(yè)面
2、自動(dòng)下載頁(yè)面中引用的:
- CSS 文件
- JS 文件
- 圖片(img)
3、解析 CSS 文件中的:
- 背景圖片(url(…))
- 字體文件(@font-face)
4、將 HTML 和 CSS 中的外鏈資源全部修改為本地相對(duì)路徑
5、最終生成一個(gè)可離線(xiàn)訪問(wèn)的網(wǎng)頁(yè)目錄
適合用于:
- 網(wǎng)頁(yè)備份
- 離線(xiàn)瀏覽
- 頁(yè)面模板保存
- 簡(jiǎn)單靜態(tài)站點(diǎn)克隆
二、環(huán)境準(zhǔn)備
1. Python 版本
建議使用 Python 3.7 及以上版本
2. 安裝依賴(lài)庫(kù)
pip install requests beautifulsoup4
三、完整代碼(中文注釋版)
import os
import requests
from bs4 import BeautifulSoup
from urllib.parse import urlparse, urljoin
import re
def download_file(url, folder):
"""
下載單個(gè)文件并保存到指定目錄
:param url: 文件的絕對(duì) URL
:param folder: 保存目錄
"""
response = requests.get(url)
if response.status_code == 200:
# 從 URL 中解析出文件名
filename = os.path.basename(urlparse(url).path)
save_path = os.path.join(folder, filename)
# 以二進(jìn)制方式寫(xiě)入文件
with open(save_path, 'wb') as f:
f.write(response.content)
def download_and_modify_links(html_url, save_folder, domain_to_remove):
"""
下載 HTML 頁(yè)面,并將其中的 CSS、JS、IMG 等資源下載到本地,
同時(shí)把所有鏈接修改為相對(duì)路徑
:param html_url: 目標(biāo)網(wǎng)頁(yè) URL
:param save_folder: 本地保存目錄
:param domain_to_remove: 預(yù)留參數(shù)(當(dāng)前版本未使用)
"""
response = requests.get(html_url)
if response.status_code != 200:
print(f"頁(yè)面下載失敗,狀態(tài)碼:{response.status_code}")
return
# 使用 BeautifulSoup 解析 HTML
soup = BeautifulSoup(response.text, 'html.parser')
# 創(chuàng)建保存資源的目錄
os.makedirs(save_folder, exist_ok=True)
# 處理 link、img、script 標(biāo)簽
# link -> CSS
# img -> 圖片
# script -> JS
for tag, attribute in [('link', 'href'), ('img', 'src'), ('script', 'src')]:
elements = soup.find_all(tag, {attribute: True})
for element in elements:
original_link = element[attribute]
# 將相對(duì)路徑轉(zhuǎn)換為絕對(duì)路徑
absolute_link = urljoin(html_url, original_link)
# 提取文件名
filename = os.path.basename(urlparse(absolute_link).path)
if not filename:
continue
# 修改 HTML 中的引用為相對(duì)路徑
element[attribute] = f"./{filename}"
# 下載資源文件
download_file(absolute_link, save_folder)
# 單獨(dú)處理 CSS 文件,解析其中的圖片和字體
css_elements = soup.find_all('link', {'rel': 'stylesheet'})
for css_element in css_elements:
css_url = urljoin(html_url, css_element['href'])
css_response = requests.get(css_url)
if css_response.status_code != 200:
continue
css_text = css_response.text
# 處理 CSS 中的 url(...) 圖片
image_urls = re.findall(r'url\((.*?)\)', css_text)
for image_url in image_urls:
clean_url = image_url.strip('\'"')
absolute_image_url = urljoin(css_url, clean_url)
filename = os.path.basename(urlparse(absolute_image_url).path)
if not filename:
continue
# 替換 CSS 中的路徑為本地相對(duì)路徑
css_text = css_text.replace(image_url, f"./{filename}")
# 下載圖片
download_file(absolute_image_url, save_folder)
# 處理 @font-face 中的字體文件
font_urls = re.findall(r'@font-face.*?url\((.*?)\)', css_text, re.S)
for font_url in font_urls:
clean_url = font_url.strip('\'"')
absolute_font_url = urljoin(css_url, clean_url)
filename = os.path.basename(urlparse(absolute_font_url).path)
if not filename:
continue
css_text = css_text.replace(font_url, f"./{filename}")
download_file(absolute_font_url, save_folder)
# 保存修改后的 CSS 文件
css_filename = os.path.basename(urlparse(css_url).path)
css_save_path = os.path.join(save_folder, css_filename)
with open(css_save_path, 'w', encoding='utf-8') as f:
f.write(css_text)
# 修改 HTML 中的 CSS 引用路徑
css_element['href'] = f"./{css_filename}"
# 保存最終修改后的 HTML 文件
html_save_path = os.path.join(save_folder, 'index.html')
with open(html_save_path, 'w', encoding='utf-8') as f:
f.write(str(soup))
print("HTML 頁(yè)面及相關(guān)資源已成功下載并本地化")
四、主程序入口示例
if __name__ == "__main__":
html_url = "http://example.com/"
save_folder = "downloaded_files"
domain_to_remove = "http://example.com"
download_and_modify_links(html_url, save_folder, domain_to_remove)
五、運(yùn)行結(jié)果目錄結(jié)構(gòu)示例
downloaded_files/
├── index.html
打開(kāi) index.html 即可離線(xiàn)訪問(wèn)網(wǎng)頁(yè)。
到此這篇關(guān)于Python實(shí)現(xiàn)下載網(wǎng)頁(yè)并將資源改為本地相對(duì)路徑的文章就介紹到這了,更多相關(guān)Python下載網(wǎng)頁(yè)資源內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python+wxPython打造一個(gè)網(wǎng)頁(yè)圖片一鍵下載神器(附完整源碼)
- Python selenium如何打包靜態(tài)網(wǎng)頁(yè)并下載
- 用Python下載一個(gè)網(wǎng)頁(yè)保存為本地的HTML文件實(shí)例
- python實(shí)現(xiàn)多線(xiàn)程網(wǎng)頁(yè)下載器
- 利用Python2下載單張圖片與爬取網(wǎng)頁(yè)圖片實(shí)例代碼
- Python實(shí)現(xiàn)的下載網(wǎng)頁(yè)源碼功能示例
- Python3實(shí)現(xiàn)Web網(wǎng)頁(yè)圖片下載
- Python3訪問(wèn)并下載網(wǎng)頁(yè)內(nèi)容的方法
- Python獲取網(wǎng)頁(yè)上圖片下載地址的方法
相關(guān)文章
深入淺析Python 中 is 語(yǔ)法帶來(lái)的誤解
這篇文章主要介紹了Python 中 is 語(yǔ)法帶來(lái)的誤解,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-05-05
Python訪問(wèn)本地deepseek示例【含deepseek本地部署】
這篇文章主要介紹了Python訪問(wèn)本地deepseek功能,結(jié)合實(shí)例形式分析了使用Ollama本地部署deepseek以及python訪問(wèn)本地deepseek的過(guò)程,需要的朋友可以參考下2018-06-06
快速上手基于Anaconda搭建Django環(huán)境的教程
Django具有完整的封裝,開(kāi)發(fā)者可以高效率的開(kāi)發(fā)項(xiàng)目,Django將大部分的功能進(jìn)行了封裝,開(kāi)發(fā)者只需要調(diào)用即可,接下來(lái)通過(guò)本文給大家介紹基于Anaconda搭建Django環(huán)境的教程,需要的朋友可以參考下2021-10-10
教你使用Python建立任意層數(shù)的深度神經(jīng)網(wǎng)絡(luò)
這篇文章主要介紹了Python建立任意層數(shù)的深度神經(jīng)網(wǎng)絡(luò),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08
Python實(shí)現(xiàn)圖像手繪效果的方法詳解
這篇文章主要為大家詳細(xì)介紹了如何利用Python語(yǔ)言實(shí)現(xiàn)圖像手繪效果,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下2022-09-09
nginx黑名單和django限速,最簡(jiǎn)單的防惡意請(qǐng)求方法分享
今天小編就為大家分享一篇nginx黑名單和django限速,最簡(jiǎn)單的防惡意請(qǐng)求方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08
對(duì)python當(dāng)中不在本路徑的py文件的引用詳解
今天小編就為大家分享一篇對(duì)python當(dāng)中不在本路徑的py文件的引用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
Python使用百度通用API進(jìn)行翻譯實(shí)現(xiàn)
本文主要介紹了Python使用百度通用API進(jìn)行翻譯實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02

