web-dev-qa-db-ja.com

Python:しようとしているPOSTリクエストを使用したフォーム

Pythonを使用してライブラリをリクエストして、スクレイピングのためにWebサイトにログインしようとしています。

import requests
headers = {'User-Agent': 'Mozilla/5.0'}
payload = {'username':'niceusername','password':'123456'}

In [12]: r = requests.post('https://admin.example.com/login.php',headers=headers,data=payload)

しかし、nada、ログインページへのリダイレクトを取得します。セッションを開く必要がありますか?間違ったPOSTリクエストを行っていますか、クッキーをロードする必要がありますか?それともセッションは自動的にそれを行いますか?ここで失われます、いくつかの助けと説明が必要です。

ログインしようとしているウェブサイトはphpです。「set-cookieをキャプチャしてcookieヘッダーを設定する」必要がありますか?もしそうなら、私はそれを行う方法がわかりません。 Webページは、次のようなフォームです(役立つ場合):input:username '' password '' id ':' myform '、' action ': "login.php

いくつかの追加情報、多分あなたは私がここに欠けているものを見ることができます。

In [13]: r.headers
Out[13]: CaseInsensitiveDict({'content-encoding': 'gzip', 'transfer-encoding': 'chunked',
 'set-cookie': 'PHPSESSID=v233mnt4malhed55lrpc5bp8o1; path=/',
  'expires': 'Thu, 19 Nov 1981 08:52:00 GMT', 'vary': 'Accept-Encoding', 'server': 'nginx',
   'connection': 'keep-alive', 'pragma': 'no-cache',
    'cache-control': 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0',
     'date': 'Tue, 24 Dec 2013 10:50:44 GMT', 'content-type': 'text/html'})

In [14]: r.cookies
Out[14]: <<class 'requests.cookies.RequestsCookieJar'>[Cookie(version=0, name='PHPSESSID',
 value='v233mnt4malhed55lrpc5bp8o1', port=None, port_specified=False, domain='admin.example.com',
  domain_specified=False, domain_initial_dot=False, path='/', path_specified=True, secure=False,
   expires=None, discard=True, comment=None, comment_url=None, rest={}, rfc2109=False)]>

本当に感謝しています!

アップデート、atupalのおかげで答え:

    import requests

headers = {'User-Agent': 'Mozilla/5.0'}
payload = {'username':'usr','pass':'123'}
link    = 'https://admin.example.com/login.php'
session = requests.Session()
resp    = session.get(link,headers=headers)
# did this for first to get the cookies from the page, stored them with next line:
cookies = requests.utils.cookiejar_from_dict(requests.utils.dict_from_cookiejar(session.cookies))
resp    = session.post(link,headers=headers,data=payload,cookies =cookies)
#used firebug to check POST data, password, was actually 'pass', under 'net' in param.  
#and to move forward from here after is:
session.get(link)
31

Session オブジェクトを使用できます

import requests
headers = {'User-Agent': 'Mozilla/5.0'}
payload = {'username':'niceusername','password':'123456'}

session = requests.Session()
session.post('https://admin.example.com/login.php',headers=headers,data=payload)
# the session instance holds the cookie. So use it to get/post later.
# e.g. session.get('https://example.com/profile')
49
atupal

POSTコンテンツタイプ= 'form-data'のリクエストを送信:

import requests
files = {
    'username': (None, 'myusername'),
    'password': (None, 'mypassword'),
}
response = requests.post('https://example.com/abc', files=files)
3
HoangYell

以下を使用するまで、ここで問題が発生していました(つまり、ファイルのアップロード中にフォームデータを送信する)。

files = {'file': (filename, open(filepath, 'rb'), 'text/xml'),
         'Content-Disposition': 'form-data; name="file"; filename="' + filename + '"',
         'Content-Type': 'text/xml'}

それは私のために働いてしまった入力です。 Chrome Dev Tools-> Network]タブで、興味のあるリクエストをクリックしました。[Headers]タブに[Form Data]セクションがあり、Content-DispositionとContent-そこで設定されているヘッダーを入力します。

これを成功させるために、実際のrequests.post()コマンドにヘッダーを設定する必要はありませんでした(実際に失敗したヘッダーを含む)

1
bdfariello