web-dev-qa-db-ja.com

Python Requestsモジュールを使用してHTTPポストリクエストをシミュレートする方法は?

これ は、使用しようとしているモジュールであり、自動的に入力しようとしているフォームがあります。 MechanizeではなくRequestsを使用する理由は、Mechanizeではログインページを読み込んでから送信する必要があるためです。一方、Requestsでは、読み込み段階をスキップしてメッセージのPOSTに直接進むことができます。 (うまくいけば)。基本的に、ログインプロセスで消費される帯域幅をできる限り少なくしようとしています。

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

私はHTTPリクエストやその他のことに関してはちょっとした知識を持っているので、どんな助けでも大歓迎です。参考までに、これは学校プロジェクト用です。

edit質問の最初の部分は回答済みです。私の質問は今、第二部です

20
Display Name

いくつかのサンプルコード:

_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
_

最初のステップは、ソースページを見て、送信されているform要素を特定することです(Firebug/Chrome/IEツールを使用します(またはソースのみを表示します))。次に、input要素を見つけて、必要なname属性を識別します(上記を参照)。

あなたが提供したURLにはたまたま「Remember Me」があります。これは試していませんが(まだできないので)、それ以上のログインを避けるために一定期間Cookieを発行することを意味します-Cookieは保持されます_request.session_で。

次に、session.get(someurl, ...)を使用してページなどを取得します。

36
Jon Clements

リクエストgetまたはpost関数内で認証を使用するには、auth引数を指定するだけです。このような:

response = requests.get(url, auth = ('username', 'password'))詳細情報については、リクエスト 認証ドキュメント を参照してください。

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)
13
Moot