1

我正在尝试使用 Bing 的实体搜索 API,但是我需要通过代理才能建立连接。

我的公司给了我一个使用以下格式的代理:'http://username:password@webproxy.subdomain.website.com:8080'

我试过使用 HTTPConnection.set_tunnel(host, port=None, headers=None) 无济于事。有谁知道如何使用我提供的代理运行下面的 Python 查询?

import http.client, urllib.parse
import json


proxy = 'http://username:pwd@webproxy.subdomain.website.com:8080' 
subscriptionKey = 'MY_KEY_HERE'
host = 'api.cognitive.microsoft.com'
path = '/bing/v7.0/entities'
mkt = 'en-US'
query = 'italian restaurants near me'

params = '?mkt=' + mkt + '&q=' + urllib.parse.quote (query)

def get_suggestions ():
    headers = {'Ocp-Apim-Subscription-Key': subscriptionKey}
    conn = http.client.HTTPSConnection(host)
    conn.request("GET", path + params, None, headers)
    response = conn.getresponse()
    return response.read()

result = get_suggestions ()
print (json.dumps(json.loads(result), indent=4))

作为旁注,我能够使用代理成功运行以下命令。

nltk.set_proxy('http://username:pwd@webproxy.subdomain.website.com:8080')
nltk.download('wordnet')
4

2 回答 2

1

我最终使用了 requests 包,它们使通过代理传递您的请求变得非常简单,下面的示例代码供参考:

import requests

proxies = {
    'http':  f"http://username:pwd@webproxy.subdomain.website.com:8080",
    'https': f"https://username:pwd@webproxy.subdomain.website.com:8080"
}
url = 'https://api.cognitive.microsoft.com/bing/v7.0/entities/'
# query string parameters

params = 'mkt=' + 'en-US' + '&q=' + urllib.parse.quote (query)

# custom headers
headers = {'Ocp-Apim-Subscription-Key': subscriptionKey}

#start session
session = requests.Session()
#persist proxy across request
session.proxies = proxies

# make GET request
r = session.get(url, params=params, headers=headers)
于 2020-10-08T16:02:23.327 回答
0

如果您使用 urlib2 或 requests,配置代理的最简单方法是设置 HTTP_PROXY 或 HTTPS_PROXY 环境变量:

export HTTPS_PROXY=https://user:pass@host:port

这种方式库为您处理代理配置,如果您的代码在容器内运行,您可以在运行时传递该信息。

于 2020-10-11T23:31:21.400 回答