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è)可離線訪問(wèn)的網(wǎng)頁(yè)目錄
適合用于:
- 網(wǎng)頁(yè)備份
- 離線瀏覽
- 頁(yè)面模板保存
- 簡(jiǎn)單靜態(tài)站點(diǎn)克隆
二、環(huán)境準(zhǔn)備
1. Python 版本
建議使用 Python 3.7 及以上版本
2. 安裝依賴庫(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)制方式寫入文件
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 即可離線訪問(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)多線程網(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爬蟲 bilibili視頻彈幕提取過(guò)程詳解
這篇文章主要介紹了Python爬蟲 bilibili視頻彈幕提取過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07
python基礎(chǔ)入門學(xué)習(xí)筆記(Python環(huán)境搭建)
這篇文章主要介紹了python基礎(chǔ)入門學(xué)習(xí)筆記,這是開(kāi)啟學(xué)習(xí)python基礎(chǔ)知識(shí)的第一篇,夯實(shí)Python基礎(chǔ),才能走的更遠(yuǎn),感興趣的小伙伴們可以參考一下2016-01-01
用Python計(jì)算三角函數(shù)之a(chǎn)cos()方法的使用
這篇文章主要介紹了用Python計(jì)算三角函數(shù)之a(chǎn)cos()方法的使用,是Python學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-05-05
Python光學(xué)仿真理解Jones矩陣學(xué)習(xí)
這篇文章主要為大家介紹了Python光學(xué)仿真理解Jones矩陣的學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2021-10-10

