在代理后面使用MechanicalSoup

时间:2017-12-19 14:06:26

标签: python mechanicalsoup

我正在尝试使用MechanicalSoup在Windows上使用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作为参数。

2 个答案:

答案 0 :(得分:2)

似乎必须在会话级别指定代理。然后在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")。

答案 1 :(得分:1)

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

browser.get(url, proxies=proxy)

尝试传递代理'你的要求的论据。