2012-10-30 20 views
16

Thisは私が使用しようとしているモジュールで、私は自動的に記入しようとしているフォームがあります。 MechanizeでRequestsを使用したいのは、Mechanizeでは、ログインページを最初にロードしてから、記入して提出する必要があるのに対し、リクエストではロードステージをスキップして、メッセージをPOSTすることができます(うまくいけば)。基本的に、私はログインプロセスができるだけ小さな帯域幅を消費するようにしようとしています。Pythonリクエストモジュールを使用してHTTPポストリクエストをシミュレートする方法は?

私の2番目の質問は、ログインプロセスとリダイレクト後、ページ全体を完全にダウンロードするのではなく、ページタイトルを取得することだけですか?基本的に、タイトルだけでログインが成功したかどうかが分かりますので、帯域幅の使用量を最小限に抑えたいと思っています。

私はHTTPリクエストやその他のものに関しては何の役にも立たないので、助けていただければ幸いです。 FYI、これは学校プロジェクトのためのものです。

編集質問の最初の部分が回答されました。

import requests 

URL = 'https://www.yourlibrary.ca/account/index.cfm' 
payload = { 
    'barcode': 'your user name/login', 
    'telephone_primary': 'your password', 
    'persistent': '1' # remember me 
} 

session = requests.session() 
r = requests.post(URL, data=payload) 
print r.cookies 

最初のステップは、(Firebugの/クローム/ IEのツールを使用して、あなたのソースページを見て、提出されform要素を識別することです:私の質問は今、いくつかのサンプルコード第二部のため

+1

あなたがChromeを使用することができますインスペクタを使用して、ブラウザによって作成されたポストリクエストにどの値が渡されているかを確認し、そこから移動します。 – bossylobster

答えて

32

です何でも(または単にソースを見て))。その後、input要素を見つけて、必要なname属性を特定します(上記参照)。

あなたが提供したURLには「Remember Me」と表示されますが、私は試していませんが、それ以上のログインを避けるために一定期間クッキーを発行することを意味します。そのクッキーはrequest.sessionに保存されています。あなただけのauth引数を指定するGETまたはPOST機能

それからちょうど要求内の認証を使用するためには...ページなどを取得するために

+0

私はそれを試みましたが、それはMechanizeを使って動作しましたが、私を認証するようには見えませんでした。あなたは間違っているかも知れませんか? **編集**申し訳ありませんが、実際には機能しました。私はちょうどタイプミスをしました:) –

+0

あなたは命を救っています。私は一日中コールドフュージョンをやり過ごさなければならないと思った。手動ダウンロードの8時間を行うために15分かかりました! – Blairg23

+0

どうすればファイルを送信できますか? –

12

session.get(someurl, ...)を使用しています。このように:

response = requests.get(url, auth = ('username', 'password')) 詳細については、Authentication Documentationを参照してください。

Chromeのデベロッパーツールを使用すると、入力して送信するフォームが含まれているhtmlページの要素を調べることができます。これがどのように行われたかの説明については、hereを参照してください。投稿リクエストのデータ引数を設定するために必要なデータを見つけることができます。アクセスしているサイトのセキュリティ証明書を確認することを心配していない場合は、get引数リストにその証明書を指定することもできます。

HTMLページは、Webフォームの投稿に使用するために、これらの要素がある場合:

<textarea id="text" class="wikitext" name="text" cols="80" rows="20"> 
This is where your edited text will go 
</textarea> 
<input type="submit" id="save" name="save" value="Submit changes"> 

を次のように続いてこのフォームに投稿するPythonのコードは次のとおりです。

import requests 
from bs4 import BeautifulSoup 

url = "http://www.someurl.com" 

username = "your_username" 
password = "your_password" 

response = requests.get(url, auth=(username, password), verify=False) 

# Getting the text of the page from the response data  
page = BeautifulSoup(response.text) 

# Finding the text contained in a specific element, for instance, the 
# textarea element that contains the area where you would write a forum post 
txt = page.find('textarea', id="text").string 

# Finding the value of a specific attribute with name = "version" and 
# extracting the contents of the value attribute 
tag = page.find('input', attrs = {'name':'version'}) 
ver = tag['value'] 

# Changing the text to whatever you want 
txt = "Your text here, this will be what is written to the textarea for the post" 

# construct the POST request 
form_data = { 
    'save' : 'Submit changes' 
    'text' : txt 
} 

post = requests.post(url,auth=(username, password),data=form_data,verify=False) 
関連する問題