群暉wordpress內(nèi)外網(wǎng)訪問網(wǎng)站整站優(yōu)化推廣方案
? ? ? ? 當(dāng)我們爬取圖片的URL地址時,我們要確保它們都是有效的絕對URL,這樣就可以直接用這些URL來下載圖片了。但是很多時候,它們都不是絕對URL地址,因此我們需要它進行URL轉(zhuǎn)換。
-
這個條件檢查URL是否以if img_url.startswith('//'):
//
開頭。這種形式的URL稱為協(xié)議相對URL(protocol-relative URL),它意味著URL的協(xié)議(如http:
或https:
)應(yīng)該與當(dāng)前頁面的協(xié)議相同。代碼通過將http:
添加到URL的前面來將其轉(zhuǎn)換為絕對URL。注意,這里假設(shè)頁面是通過HTTP協(xié)議加載的;如果頁面是通過HTTPS加載的,應(yīng)該使用https:
。在實際應(yīng)用中,你可能需要根據(jù)頁面的實際協(xié)議來動態(tài)確定這一點。 -
這個條件檢查URL是否以elif img_url.startswith('/'):
/
開頭。這種形式的URL是相對于網(wǎng)站根目錄的路徑。代碼通過將頁面的基礎(chǔ)URL(即不包含頁面具體路徑的URL)與相對路徑拼接起來,從而生成絕對URL。 -
這個條件檢查URL是否不以elif not img_url.startswith('http'):
http
開頭。這通常意味著URL是相對于當(dāng)前頁面路徑的。代碼通過在頁面基礎(chǔ)URL后面添加/
(如果需要的話,即如果基礎(chǔ)URL不以/
結(jié)尾)和相對路徑,從而生成絕對URL。
# 處理相對路徑,下面只考慮httpif img_url.startswith('//'):img_url = 'http:' + img_urlelif img_url.startswith('/'):img_url = url + img_urlelif not img_url.startswith('http'):img_url = url + '/' + img_url
下面介紹不同的數(shù)據(jù)類型在python中的處理方法:?
JSON
-
獲取 JSON 數(shù)據(jù):
- 使用?
requests.get(url)
?獲取 JSON 數(shù)據(jù)。 - 使用?
response.raise_for_status()
?檢查請求是否成功。
- 使用?
-
解析 JSON 數(shù)據(jù):
- 使用?
response.json()
?將 JSON 數(shù)據(jù)解析為 Python 字典。 - 假設(shè) JSON 數(shù)據(jù)中有一個鍵(例如?
images
)包含圖片 URL 列表。
- 使用?
-
提取圖片 URL 列表:
- 從解析后的 JSON 數(shù)據(jù)中提取圖片 URL 列表。
- 創(chuàng)建保存圖片的目錄。如果目錄不存在,使用?
os.makedirs(save_dir)
?創(chuàng)建目錄。
-
下載圖片并保存到本地:
- 處理圖片 URL 的相對路徑問題(例如,將協(xié)議相對 URL 轉(zhuǎn)換為絕對 URL)。
- 使用?
requests.get(img_url)
?下載圖片。 - 提取圖片的文件名,并保存到指定目錄。
????????如果網(wǎng)頁內(nèi)容是以 JSON 格式返回的,你可以直接使用?requests
?庫來獲取 JSON 數(shù)據(jù),然后解析并保存其中的圖片。以下是如何處理 JSON 數(shù)據(jù)并下載其中的圖片的示例代碼。
import requests
import os
import json# 1. 獲取 JSON 數(shù)據(jù)
url = 'https://api.example.com/data' # 替換為你的 JSON API URL
response = requests.get(url)
response.raise_for_status() # 檢查請求是否成功# 2. 解析 JSON 數(shù)據(jù)
data = response.json()# 3. 提取圖片 URL 列表
# 假設(shè) JSON 數(shù)據(jù)中有一個 'images' 鍵,包含圖片 URL 列表
image_urls = data.get('images', [])# 創(chuàng)建保存圖片的目錄
save_dir = 'downloaded_images'
if not os.path.exists(save_dir):os.makedirs(save_dir)# 4. 下載圖片并保存到本地
for img_url in image_urls:try:# 處理相對路徑if img_url.startswith('//'):img_url = 'http:' + img_urlelif not img_url.startswith('http'):img_url = url + '/' + img_url# 發(fā)送請求獲取圖片img_response = requests.get(img_url)img_response.raise_for_status() # 檢查請求是否成功# 提取文件名img_filename = os.path.join(save_dir, img_url.split('/')[-1])# 保存圖片with open(img_filename, 'wb') as f:f.write(img_response.content)print(f'Saved image: {img_filename}')except Exception as e:print(f'Failed to download image {img_url}: {e}')print('All images downloaded.')
XML(可擴展標(biāo)記語言)
- 特點:XML 是一種用于存儲和傳輸數(shù)據(jù)的標(biāo)記語言,結(jié)構(gòu)類似于 HTML,但更靈活。
- 處理方法:使用 Python 的?
xml.etree.ElementTree
?模塊解析 XML 數(shù)據(jù)。
import xml.etree.ElementTree as ET
import requests
import os# 獲取 XML 數(shù)據(jù)
url = 'https://api.example.com/data.xml'
response = requests.get(url)
response.raise_for_status()# 解析 XML 數(shù)據(jù)
root = ET.fromstring(response.content)# 提取圖片 URL 列表
image_urls = [elem.text for elem in root.findall('.//image')]# 創(chuàng)建保存圖片的目錄
save_dir = 'downloaded_images'
if not os.path.exists(save_dir):os.makedirs(save_dir)# 下載圖片并保存到本地
for img_url in image_urls:try:img_response = requests.get(img_url)img_response.raise_for_status()img_filename = os.path.join(save_dir, img_url.split('/')[-1])with open(img_filename, 'wb') as f:f.write(img_response.content)print(f'Saved image: {img_filename}')except Exception as e:print(f'Failed to download image {img_url}: {e}')
?CSV(逗號分隔值)
- 特點:CSV 是一種簡單的文件格式,用于存儲表格數(shù)據(jù)。
- 處理方法:使用 Python 的?
csv
?模塊讀取 CSV 文件,或者直接使用?pandas
?庫進行高級處理。
import csv
import requests
import os# 獲取 CSV 數(shù)據(jù)
url = 'https://api.example.com/data.csv'
response = requests.get(url)
response.raise_for_status()# 解析 CSV 數(shù)據(jù)
csv_data = response.text
csv_reader = csv.reader(csv_data.splitlines())
next(csv_reader) # 跳過表頭image_urls = [row[0] for row in csv_reader]# 創(chuàng)建保存圖片的目錄
save_dir = 'downloaded_images'
if not os.path.exists(save_dir):os.makedirs(save_dir)# 下載圖片并保存到本地
for img_url in image_urls:try:img_response = requests.get(img_url)img_response.raise_for_status()img_filename = os.path.join(save_dir, img_url.split('/')[-1])with open(img_filename, 'wb') as f:f.write(img_response.content)print(f'Saved image: {img_filename}')except Exception as e:print(f'Failed to download image {img_url}: {e}')
?Excel(.xls, .xlsx)
- 特點:Excel 文件是一種用于存儲表格數(shù)據(jù)的常見文件格式。
- 處理方法:使用?
openpyxl
?或?pandas
?庫讀取 Excel 文件。
import requests
import os
import openpyxl# 獲取 Excel 數(shù)據(jù)
url = 'https://api.example.com/data.xlsx'
response = requests.get(url)
response.raise_for_status()# 保存 Excel 文件到本地
temp_filename = 'temp.xlsx'
with open(temp_filename, 'wb') as f:f.write(response.content)# 讀取 Excel 數(shù)據(jù)
workbook = openpyxl.load_workbook(temp_filename)
sheet = workbook.activeimage_urls = [cell.value for cell in sheet['A']]# 刪除臨時文件
os.remove(temp_filename)# 創(chuàng)建保存圖片的目錄
save_dir = 'downloaded_images'
if not os.path.exists(save_dir):os.makedirs(save_dir)# 下載圖片并保存到本地
for img_url in image_urls:try:img_response = requests.get(img_url)img_response.raise_for_status()img_filename = os.path.join(save_dir, img_url.split('/')[-1])with open(img_filename, 'wb') as f:f.write(img_response.content)print(f'Saved image: {img_filename}')except Exception as e:print(f'Failed to download image {img_url}: {e}')
?HTML
- 特點:HTML 是網(wǎng)頁的標(biāo)準(zhǔn)標(biāo)記語言,常用于展示網(wǎng)頁內(nèi)容。
- 處理方法:使用?
BeautifulSoup
?或?lxml
?庫解析 HTML 內(nèi)容。
import requests
from bs4 import BeautifulSoup
import os# 獲取 HTML 數(shù)據(jù)
url = 'https://example.com'
response = requests.get(url)
response.raise_for_status()# 解析 HTML 數(shù)據(jù)
soup = BeautifulSoup(response.text, 'html.parser')# 提取圖片 URL 列表
image_tags = soup.find_all('img')
image_urls = [img['src'] for img in image_tags if 'src' in img.attrs]# 創(chuàng)建保存圖片的目錄
save_dir = 'downloaded_images'
if not os.path.exists(save_dir):os.makedirs(save_dir)# 下載圖片并保存到本地
for img_url in image_urls:try:img_response = requests.get(img_url)img_response.raise_for_status()img_filename = os.path.join(save_dir, img_url.split('/')[-1])with open(img_filename, 'wb') as f:f.write(img_response.content)print(f'Saved image: {img_filename}')except Exception as e:print(f'Failed to download image {img_url}: {e}')
其他數(shù)據(jù)格式
- YAML:使用?
PyYAML
?庫解析 YAML 數(shù)據(jù)。 - SQLite:使用?
sqlite3
?庫連接和查詢 SQLite 數(shù)據(jù)庫。 - 二進制文件:使用?
struct
?模塊解析二進制數(shù)據(jù)。