在谷歌应用引擎上的代理后面发送 https 请求

问题描述 投票:0回答:1

有没有办法通过代理在GAE上的python中发送请求?我还需要在整个代码中更改代理,以便不同的请求使用不同的 ip。 我正在尝试在 GAE 实例上运行的 python 文件中发送请求。

这是代码的一部分

    proxy_dict = {
        'https': f'https://{proxy}'
    }
r = requests.post(url, json=payload, headers=headers, cookies=cookies, verify=False, proxies=proxy_dict)

当我运行代码并打印出状态代码时,我得到 200,但是,当我打印出 response.text 时,我得到的是乱码?当不在 GAE 上运行时,代码可以正常工作。

我看到这个旧的错误报告标记为“无法修复”:https://issuetracker.google.com/issues/35876512

但是,那里的解决方法不允许将不同的代理用于不同的请求。

python google-app-engine python-requests proxy
1个回答
0
投票

确保验证 GAE 环境限制:确保您的 GAE 环境允许外部 HTTP 请求并支持带有代理的请求库。如果您使用标准环境,与灵活环境相比,可能会有更严格的限制。

import requests

def get_new_proxy():
    # Replace this with the actual method of fetching a new proxy from your proxy provider
    proxy_list = ['proxy1:port', 'proxy2:port', 'proxy3:port']  # Example proxy list
    return random.choice(proxy_list)

def send_request(url, payload, headers, cookies):
    proxy = get_new_proxy()
    proxy_dict = {
        'https': f'https://{proxy}'
    }
    response = requests.post(url, json=payload, headers=headers, cookies=cookies, verify=False, proxies=proxy_dict)
    return response

url = "https://example.com/api"
payload = {'key': 'value'}
headers = {'Authorization': 'Bearer your_token'}
cookies = {'session_id': 'your_session_id'}

response = send_request(url, payload, headers, cookies)
print(response.status_code)
print(response.text)

处理响应编码:确保正确处理响应编码。如果您收到乱码,则响应可能不是 UTF-8 编码的。如果需要,显式设置编码: Python 复制代码 response.encoding = 'utf-8' # 或适当的编码 打印(响应.文本) 调试和日志记录:添加大量日志记录以帮助调试与代理连接和响应处理相关的问题。

GAE 限制的解决方法:

自定义域套接字:GAE 灵活的环境允许自定义域套接字,可用于连接到代理。 外部服务:如果 GAE 的限制过于严格,请考虑将请求处理卸载到外部服务或提供更大灵活性的其他云提供商。 这是一个更详细、更完整的日志记录示例:

import requests
import random
import logging

logging.basicConfig(level=logging.INFO)

def get_new_proxy():
    # Replace this with the actual method of fetching a new proxy from your proxy provider
    proxy_list = ['proxy1:port', 'proxy2:port', 'proxy3:port']  # Example proxy list
    selected_proxy = random.choice(proxy_list)
    logging.info(f"Selected proxy: {selected_proxy}")
    return selected_proxy

def send_request(url, payload, headers, cookies):
    proxy = get_new_proxy()
    proxy_dict = {
        'https': f'https://{proxy}'
    }
    try:
        response = requests.post(url, json=payload, headers=headers, cookies=cookies, verify=False, proxies=proxy_dict)
        response.encoding = 'utf-8'  # Ensure correct encoding
        logging.info(f"Response Status Code: {response.status_code}")
        logging.info(f"Response Text: {response.text[:200]}")  # Log first 200 chars of response
        return response
    except requests.exceptions.RequestException as e:
        logging.error(f"Request failed: {e}")
        return None

url = "https://example.com/api"
payload = {'key': 'value'}
headers = {'Authorization': 'Bearer your_token'}
cookies = {'session_id': 'your_session_id'}

response = send_request(url, payload, headers, cookies)
if response:
    print(response.status_code)
    print(response.text)

此代码可能无法工作,因为某些网络代理完全不同。

© www.soinside.com 2019 - 2024. All rights reserved.