2017-12-19 27 views
0

私はPythonで、Windows上で、MechanicalSoupを使って簡単なwebbotを構築しようとしています。残念ながら、私は(企業が強制する)プロキシの後ろに座っています。私はMechanicalSoupに代理人を提供する方法を見つけることができませんでした。そんなオプションはありますか?そうでない場合は、私の選択肢は何ですか?プロキシの後ろにMechanicalSoupを使用する

EDIT: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を受け付けません。

+0

明快にするためにいくつかのコードまたは例を提供してください。 –

答えて

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」)。

1

自分のドキュメントによると、これは動作するはずです:

browser.get(url, proxies=proxy) 

は、あなたのリクエストに「プロキシ」引数を渡す試してみてください。

+0

私は参照してください:browser.getは、プロキシを受け入れるrequests.Session.getのラッパーです。しかし、まだ運がありません。今度は "HTTPSConnectionPool(host = 'stackoverflow.com'、port = 443)を取得します:最大リトライ回数がurlを超えました:/(SSLError(SSLError("悪いハンドシェイク:エラー(['SSLルーチン'、 'ssl3_get_server_certificate' ')、)、)) " –

+1

これは別の問題です。 関数引数にverify = Falseを追加します。 これは警告を表示しますが、うまくいくはずです - 警告を抑制する方法もあります。 - browser.get(url、proxies = proxy、verify = False) –

関連する問題