

一直到输出图片地址都是对的,就是后面从图片地址下载图片,打开后格式就不对了。
下午好🌅🌅🌅
本答案参考通义千问
你遇到的问题是:使用 BeautifulSoup(Bs4)爬虫下载图片时,虽然输出的图片地址是正确的,但下载后的图片无法打开,格式不正确。这通常是因为图片的实际数据没有被正确获取或保存。
图片链接是相对路径而非绝对路径
有些网页中的图片链接是相对于当前页面的,例如 src="/images/1.jpg",而不是完整的 URL 如 https://example.com/images/1.jpg。
未正确处理图片内容
有些网站会通过 JavaScript 动态加载图片,而 Bs4 只能解析静态 HTML,无法获取动态生成的内容。
下载时未正确设置编码或响应头
如果服务器返回的响应中包含错误的 Content-Type 或未正确设置 headers,可能导致下载的文件格式错误。
图片数据被压缩或损坏
在下载过程中可能由于网络问题、代码逻辑错误导致图片数据丢失或损坏。
在提取图片链接时,如果发现是相对路径,应将其转换为绝对路径。
from urllib.parse import urljoin
base_url = "https://example.com"
img_url = urljoin(base_url, img_tag.get("src"))
重点:始终使用
urljoin来拼接相对路径,避免下载失败或格式错误。
使用 requests 库发送 GET 请求,并将返回的二进制内容写入本地文件。
import requests
response = requests.get(img_url)
if response.status_code == 200:
with open("image.jpg", "wb") as f:
f.write(response.content)
else:
print("图片下载失败")
重点:使用
wb模式写入二进制内容,确保图像数据完整保存。
确保服务器返回的是图片类型,如 image/jpeg 或 image/png。
print(response.headers["Content-Type"])
重点:如果返回的是
text/html,说明你可能访问了错误的 URL 或服务器返回了错误内容。
部分网站会阻止非浏览器的请求,添加 User-Agent 可以避免被识别为爬虫。
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
}
response = requests.get(img_url, headers=headers)
重点:添加 User-Agent 是防止被网站屏蔽的常见做法。
以下是一个完整的 Bs4 图片下载示例:
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin
url = "https://example.com"
headers = {"User-Agent": "Mozilla/5.0"}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, "html.parser")
for img in soup.find_all("img"):
img_url = urljoin(url, img.get("src"))
print(f"正在下载: {img_url}")
try:
img_response = requests.get(img_url, headers=headers)
if img_response.status_code == 200:
with open(f"images/{img_url.split('/')[-1]}", "wb") as f:
f.write(img_response.content)
print("图片下载成功")
else:
print("图片下载失败")
except Exception as e:
print(f"发生错误: {e}")
重点:该代码包含了 URL 拼接、User-Agent 设置、异常处理和图片保存逻辑,适合大多数场景。
print(response.content[:100]) 查看前 100 字节内容,判断是否是图片数据。| 问题 | 解决方案 |
|------|----------|
| 相对路径 | 使用 urljoin 转换为绝对路径 |
| 无法打开图片 | 确保使用 wb 模式保存二进制内容 |
| 格式错误 | 检查 Content-Type 和实际数据 |
| 被网站屏蔽 | 添加 User-Agent 模拟浏览器访问 |
如果你愿意提供具体的图片 URL 或代码片段,我可以帮你进一步调试!