当我们爬取图片的URL地址时,我们要确保它们都是有效的绝对URL,这样就可以直接用这些URL来下载图片了。但是很多时候,它们都不是绝对URL地址,因此我们需要它进行URL转换。
-
这个条件检查URL是否以if img_url.startswith('//'):
//
开头。这种形式的URL称为协议相对URL(protocol-relative URL),它意味着URL的协议(如http:
或https:
)应该与当前页面的协议相同。代码通过将http:
添加到URL的前面来将其转换为绝对URL。注意,这里假设页面是通过HTTP协议加载的;如果页面是通过HTTPS加载的,应该使用https:
。在实际应用中,你可能需要根据页面的实际协议来动态确定这一点。 -
这个条件检查URL是否以elif img_url.startswith('/'):
/
开头。这种形式的URL是相对于网站根目录的路径。代码通过将页面的基础URL(即不包含页面具体路径的URL)与相对路径拼接起来,从而生成绝对URL。 -
这个条件检查URL是否不以elif not img_url.startswith('http'):
http
开头。这通常意味着URL是相对于当前页面路径的。代码通过在页面基础URL后面添加/
(如果需要的话,即如果基础URL不以/
结尾)和相对路径,从而生成绝对URL。
# 处理相对路径,下面只考虑http
if img_url.startswith('//'):
img_url = 'http:' + img_url
elif img_url.startswith('/'):
img_url = url + img_url
elif not img_url.startswith('http'):
img_url = url + '/' + img_url
下面介绍不同的数据类型在python中的处理方法:
JSON
-
获取 JSON 数据:
- 使用
requests.get(url)
获取 JSON 数据。 - 使用
response.raise_for_status()
检查请求是否成功。
- 使用
-
解析 JSON 数据:
- 使用
response.json()
将 JSON 数据解析为 Python 字典。 - 假设 JSON 数据中有一个键(例如
images
)包含图片 URL 列表。
- 使用
-
提取图片 URL 列表:
- 从解析后的 JSON 数据中提取图片 URL 列表。
- 创建保存图片的目录。如果目录不存在,使用
os.makedirs(save_dir)
创建目录。
-
下载图片并保存到本地:
- 处理图片 URL 的相对路径问题(例如,将协议相对 URL 转换为绝对 URL)。
- 使用
requests.get(img_url)
下载图片。 - 提取图片的文件名,并保存到指定目录。
如果网页内容是以 JSON 格式返回的,你可以直接使用 requests
库来获取 JSON 数据,然后解析并保存其中的图片。以下是如何处理 JSON 数据并下载其中的图片的示例代码。
import requests
import os
import json
# 1. 获取 JSON 数据
url = 'https://api.example.com/data' # 替换为你的 JSON API URL
response = requests.get(url)
response.raise_for_status() # 检查请求是否成功
# 2. 解析 JSON 数据
data = response.json()
# 3. 提取图片 URL 列表
# 假设 JSON 数据中有一个 'images' 键,包含图片 URL 列表
image_urls = data.get('images', [])
# 创建保存图片的目录
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_url
elif not img_url.startswith('http'):
img_url = url + '/' + img_url
# 发送请求获取图片
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(可扩展标记语言)
- 特点:XML 是一种用于存储和传输数据的标记语言,结构类似于 HTML,但更灵活。
- 处理方法:使用 Python 的
xml.etree.ElementTree
模块解析 XML 数据。
import xml.etree.ElementTree as ET
import requests
import os
# 获取 XML 数据
url = 'https://api.example.com/data.xml'
response = requests.get(url)
response.raise_for_status()
# 解析 XML 数据
root = ET.fromstring(response.content)
# 提取图片 URL 列表
image_urls = [elem.text for elem in root.findall('.//image')]
# 创建保存图片的目录
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 是一种简单的文件格式,用于存储表格数据。
- 处理方法:使用 Python 的
csv
模块读取 CSV 文件,或者直接使用pandas
库进行高级处理。
import csv
import requests
import os
# 获取 CSV 数据
url = 'https://api.example.com/data.csv'
response = requests.get(url)
response.raise_for_status()
# 解析 CSV 数据
csv_data = response.text
csv_reader = csv.reader(csv_data.splitlines())
next(csv_reader) # 跳过表头
image_urls = [row[0] for row in csv_reader]
# 创建保存图片的目录
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 文件是一种用于存储表格数据的常见文件格式。
- 处理方法:使用
openpyxl
或pandas
库读取 Excel 文件。
import requests
import os
import openpyxl
# 获取 Excel 数据
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 数据
workbook = openpyxl.load_workbook(temp_filename)
sheet = workbook.active
image_urls = [cell.value for cell in sheet['A']]
# 删除临时文件
os.remove(temp_filename)
# 创建保存图片的目录
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 是网页的标准标记语言,常用于展示网页内容。
- 处理方法:使用
BeautifulSoup
或lxml
库解析 HTML 内容。
import requests
from bs4 import BeautifulSoup
import os
# 获取 HTML 数据
url = 'https://example.com'
response = requests.get(url)
response.raise_for_status()
# 解析 HTML 数据
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]
# 创建保存图片的目录
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}')
其他数据格式
- YAML:使用
PyYAML
库解析 YAML 数据。 - SQLite:使用
sqlite3
库连接和查询 SQLite 数据库。 - 二进制文件:使用
struct
模块解析二进制数据。