【问题标题】:Using MechanicalSoup behind proxy在代理后面使用 MechanicalSoup
【发布时间】:2017-12-19 14:06:25
【问题描述】:

我正在尝试在 Windows 上使用 MechanicalSoup 在 Python 中构建一个简单的 webbot。不幸的是,我坐在(公司强制执行的)代理后面。我找不到为 MechanicalSoup 提供代理的方法。有这样的选择吗?如果没有,我的替代方案是什么?

编辑:按照 Eytan 的提示,我在代码中添加了 proxiesverify,这让我更进一步,但我仍然无法提交表单:

import mechanicalsoup

proxies = {
    'https': 'my.https.proxy:8080',
    'http':  'my.http.proxy:8080'
}
url = 'https://stackoverflow.com/'
browser = mechanicalsoup.StatefulBrowser()
front_page = browser.open(url, proxies=proxies, verify=False)
form = browser.select_form('form[action="/search"]')
form.print_summary()
form["q"] = "MechanicalSoup"
form.print_summary()
browser.submit(form, url=url)

代码挂在最后一行,submit不接受proxies作为参数。

【问题讨论】:

  • 您能否提供一些代码或示例以便清楚起见?

标签: python mechanicalsoup


【解决方案1】:

似乎必须在会话级别指定代理。那么browser.open 不需要它们,并且提交表单也可以:

import mechanicalsoup

proxies = {
    'https': 'my.https.proxy:8080',
    'http':  'my.http.proxy:8080'
}
url = 'https://stackoverflow.com/'
browser = mechanicalsoup.StatefulBrowser()
browser.session.proxies = proxies   # THIS IS THE SOLUTION!
front_page = browser.open(url, verify=False)
form = browser.select_form('form[action="/search"]')
form["q"] = "MechanicalSoup"
result = browser.submit(form, url=url)
result.status_code

返回 200(即“OK”)。

【讨论】:

    【解决方案2】:

    根据他们的文档,这应该有效:

    browser.get(url, proxies=proxy)
    

    尝试将“代理”参数传递给您的请求。

    【讨论】:

    • 我明白了:browser.get 是 requests.Session.get 的包装器,它接受代理。但是,仍然没有运气。现在我得到“HTTPSConnectionPool(host='stackoverflow.com', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLError("bad handshake: Error([('SSL routines', 'ssl3_get_server_certificate', '证书验证失败')],)",),))"
    • 这是一个单独的问题。将 verify=False 添加到函数参数。这会给你一个警告 - 但应该有效 - 还有一种方法可以抑制警告。 -- browser.get(url, proxies=proxy, verify=False)
    猜你喜欢
    • 2016-08-06
    • 2015-10-04
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-10
    • 2012-12-24
    • 2012-10-21
    相关资源
    最近更新 更多