Python實現(xiàn)下載網(wǎng)頁并將資源改為本地相對路徑
一、教程目標
本教程實現(xiàn)以下功能:
1、下載指定 URL 的 HTML 頁面
2、自動下載頁面中引用的:
- CSS 文件
- JS 文件
- 圖片(img)
3、解析 CSS 文件中的:
- 背景圖片(url(…))
- 字體文件(@font-face)
4、將 HTML 和 CSS 中的外鏈資源全部修改為本地相對路徑
5、最終生成一個可離線訪問的網(wǎng)頁目錄
適合用于:
- 網(wǎng)頁備份
- 離線瀏覽
- 頁面模板保存
- 簡單靜態(tài)站點克隆
二、環(huán)境準備
1. Python 版本
建議使用 Python 3.7 及以上版本
2. 安裝依賴庫
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):
"""
下載單個文件并保存到指定目錄
:param url: 文件的絕對 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)
# 以二進制方式寫入文件
with open(save_path, 'wb') as f:
f.write(response.content)
def download_and_modify_links(html_url, save_folder, domain_to_remove):
"""
下載 HTML 頁面,并將其中的 CSS、JS、IMG 等資源下載到本地,
同時把所有鏈接修改為相對路徑
:param html_url: 目標網(wǎng)頁 URL
:param save_folder: 本地保存目錄
:param domain_to_remove: 預留參數(shù)(當前版本未使用)
"""
response = requests.get(html_url)
if response.status_code != 200:
print(f"頁面下載失敗,狀態(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 標簽
# 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]
# 將相對路徑轉換為絕對路徑
absolute_link = urljoin(html_url, original_link)
# 提取文件名
filename = os.path.basename(urlparse(absolute_link).path)
if not filename:
continue
# 修改 HTML 中的引用為相對路徑
element[attribute] = f"./{filename}"
# 下載資源文件
download_file(absolute_link, save_folder)
# 單獨處理 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 中的路徑為本地相對路徑
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 頁面及相關資源已成功下載并本地化")
四、主程序入口示例
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)
五、運行結果目錄結構示例
downloaded_files/
├── index.html
打開 index.html 即可離線訪問網(wǎng)頁。
到此這篇關于Python實現(xiàn)下載網(wǎng)頁并將資源改為本地相對路徑的文章就介紹到這了,更多相關Python下載網(wǎng)頁資源內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python基礎入門學習筆記(Python環(huán)境搭建)
這篇文章主要介紹了python基礎入門學習筆記,這是開啟學習python基礎知識的第一篇,夯實Python基礎,才能走的更遠,感興趣的小伙伴們可以參考一下2016-01-01
用Python計算三角函數(shù)之a(chǎn)cos()方法的使用
這篇文章主要介紹了用Python計算三角函數(shù)之a(chǎn)cos()方法的使用,是Python學習中的基礎知識,需要的朋友可以參考下2015-05-05

