mirror of
https://gitee.com/insArvin/nypc_python_advanced.git
synced 2026-04-18 02:22:28 +08:00
Compare commits
2 Commits
b4aacf97a9
...
2ce1f13d8e
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2ce1f13d8e | ||
|
|
3c4315c40f |
@@ -42,6 +42,8 @@
|
|||||||
|
|
||||||
:calendar: 2025-12-18:提交案例代码“[豆瓣电影表格展示](./Web/DoubanMovieWeb)”
|
:calendar: 2025-12-18:提交案例代码“[豆瓣电影表格展示](./Web/DoubanMovieWeb)”
|
||||||
|
|
||||||
|
:calendar: 2026-01-03:提交DEMO代码“[图片代理接口](./Web/ProxyImagesDemo)”
|
||||||
|
|
||||||
【:warning: 本仓库代码保持更新......】
|
【:warning: 本仓库代码保持更新......】
|
||||||
|
|
||||||
#### 关于课程视频
|
#### 关于课程视频
|
||||||
|
|||||||
121
Web/ProxyImagesDemo/readme.md
Normal file
121
Web/ProxyImagesDemo/readme.md
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
# 图片代理接口 - README.md
|
||||||
|
## 项目介绍
|
||||||
|
这段代码是基于 **Flask 框架**实现的图片代理接口,核心目标是解决前端页面直接加载第三方图片时出现的**跨域访问限制**问题,同时通过模拟浏览器请求头,提高第三方图片资源的获取成功率,避免被第三方服务器拦截拒绝。
|
||||||
|
|
||||||
|
## 代码核心作用
|
||||||
|
1. **跨域绕过**:作为中间代理服务,接收前端本地请求,再由后端向第三方图片服务器发起请求,规避浏览器的同源策略限制,实现图片正常加载。
|
||||||
|
2. **URL 兼容处理**:自动判断传入的图片地址是否带有 `http://` 或 `https://` 协议头,无协议头时自动补充 `https://`,保证请求 URL 有效性。
|
||||||
|
3. **模拟浏览器请求**:设置符合浏览器规范的 `User-Agent`、`Referer`、`Accept` 请求头,伪装成浏览器正常访问,避免被第三方服务器识别为爬虫而拒绝。
|
||||||
|
4. **图片响应与异常处理**:成功获取图片后,将图片数据以二进制流形式返回给前端,并保留图片原有的 Content-Type;请求失败(状态码非200)或出现异常(超时、网络错误等)时,返回 404 错误。
|
||||||
|
|
||||||
|
## 前置准备
|
||||||
|
1. 已安装 Python 3.6 及以上版本。
|
||||||
|
2. 安装所需的 Python 第三方库:Flask 和 requests。
|
||||||
|
|
||||||
|
## 安装依赖
|
||||||
|
打开终端/命令行,执行以下安装命令:
|
||||||
|
```bash
|
||||||
|
pip install flask requests
|
||||||
|
```
|
||||||
|
|
||||||
|
## 完整可运行代码
|
||||||
|
```python
|
||||||
|
# 导入必要的模块
|
||||||
|
from flask import Flask, send_file, abort
|
||||||
|
import requests
|
||||||
|
from io import BytesIO
|
||||||
|
|
||||||
|
# 初始化 Flask 应用
|
||||||
|
app = Flask(__name__)
|
||||||
|
|
||||||
|
@app.route('/proxy-image/<path:image_url>')
|
||||||
|
def proxy_image(image_url):
|
||||||
|
"""
|
||||||
|
图片代理路由,用于绕过跨域限制
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
# 重新构建完整URL(如果需要的话)
|
||||||
|
if not image_url.startswith(('http://', 'https://')):
|
||||||
|
full_url = 'https://' + image_url.lstrip('/')
|
||||||
|
else:
|
||||||
|
full_url = image_url
|
||||||
|
|
||||||
|
# 添加请求头来模拟浏览器请求
|
||||||
|
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',
|
||||||
|
'Referer': 'https://movie.douban.com/',
|
||||||
|
'Accept': 'image/webp,image/apng,image/*,*/*;q=0.8'
|
||||||
|
}
|
||||||
|
|
||||||
|
# 向第三方图片服务器发起请求,设置10秒超时
|
||||||
|
response = requests.get(full_url, headers=headers, timeout=10)
|
||||||
|
|
||||||
|
if response.status_code == 200:
|
||||||
|
# 将图片内容存入BytesIO二进制流,用于send_file返回
|
||||||
|
image_data = BytesIO(response.content)
|
||||||
|
# 获取图片原有的Content-Type,无则默认image/jpeg
|
||||||
|
content_type = response.headers.get('Content-Type', 'image/jpeg')
|
||||||
|
# 以二进制流形式返回图片给前端
|
||||||
|
return send_file(image_data, mimetype=content_type)
|
||||||
|
else:
|
||||||
|
# 第三方服务器返回非200状态码,返回404
|
||||||
|
abort(404)
|
||||||
|
except Exception as e:
|
||||||
|
# 捕获超时、网络错误等异常,打印错误信息并返回404
|
||||||
|
print(f"Error fetching image: {e}")
|
||||||
|
abort(404)
|
||||||
|
|
||||||
|
# 启动Flask应用
|
||||||
|
if __name__ == '__main__':
|
||||||
|
app.run(debug=True, host='0.0.0.0', port=5000)
|
||||||
|
```
|
||||||
|
|
||||||
|
## 使用方法
|
||||||
|
### 步骤1:启动代理服务
|
||||||
|
1. 将完整代码保存为 `image_proxy.py` 文件。
|
||||||
|
2. 终端/命令行进入该文件所在目录,执行以下启动命令:
|
||||||
|
```bash
|
||||||
|
python image_proxy.py
|
||||||
|
```
|
||||||
|
3. 启动成功后,终端会显示类似以下信息,说明代理服务已在本地 5000 端口运行:
|
||||||
|
```
|
||||||
|
* Serving Flask app 'image_proxy'
|
||||||
|
* Debug mode: on
|
||||||
|
* Running on all addresses (0.0.0.0)
|
||||||
|
* Running on http://127.0.0.1:5000
|
||||||
|
* Running on http://192.168.x.xxx:5000
|
||||||
|
```
|
||||||
|
|
||||||
|
### 步骤2:调用代理接口加载图片
|
||||||
|
前端页面或直接在浏览器中,通过以下格式的 URL 调用代理接口,即可加载第三方图片:
|
||||||
|
```
|
||||||
|
http://127.0.0.1:5000/proxy-image/[第三方图片完整URL或无协议头图片URL]
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 调用示例
|
||||||
|
1. 第三方图片完整 URL:`https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2807886870.jpg`
|
||||||
|
代理访问地址:
|
||||||
|
```
|
||||||
|
http://127.0.0.1:5000/proxy-image/https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2807886870.jpg
|
||||||
|
```
|
||||||
|
2. 无协议头图片 URL:`img9.doubanio.com/view/photo/s_ratio_poster/public/p2807886870.jpg`
|
||||||
|
代理访问地址(服务自动补充 `https://`):
|
||||||
|
```
|
||||||
|
http://127.0.0.1:5000/proxy-image/img9.doubanio.com/view/photo/s_ratio_poster/public/p2807886870.jpg
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 前端使用示例(HTML img 标签)
|
||||||
|
```html
|
||||||
|
<!-- 直接加载第三方图片可能出现跨域错误 -->
|
||||||
|
<img src="https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2807886870.jpg" alt="电影海报">
|
||||||
|
|
||||||
|
<!-- 通过代理接口加载,规避跨域问题 -->
|
||||||
|
<img src="http://127.0.0.1:5000/proxy-image/https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2807886870.jpg" alt="电影海报">
|
||||||
|
```
|
||||||
|
|
||||||
|
## 注意事项
|
||||||
|
1. **超时设置**:当前请求超时时间为 10 秒,若第三方图片服务器响应较慢,可适当调整 `requests.get` 中的 `timeout` 参数值。
|
||||||
|
2. **请求头调整**:`Referer` 字段当前设置为 `https://movie.douban.com/`,若访问其他域名的图片被拦截,可将 `Referer` 修改为对应第三方图片的域名,或删除该字段。
|
||||||
|
3. **调试模式**:代码中 `app.run` 开启了 `debug=True` 调试模式,生产环境部署时请关闭(改为 `debug=False`),避免泄露敏感信息。
|
||||||
|
4. **跨域配置(可选)**:若前端与代理服务不在同一端口/域名,需在 Flask 应用中添加跨域支持(安装 `flask-cors` 库,配置 `CORS(app)`),否则前端可能无法正常请求代理接口。
|
||||||
|
5. **资源限制**:该代理服务仅用于个人开发/测试场景,大规模商用需考虑图片缓存、并发限制、服务器带宽等问题。
|
||||||
Reference in New Issue
Block a user