2016-06-14 10 views
0

私はいくつかの情報をスクラップするためにウェブサイトにアクセスしようとしていますが、Pythonを使用してログイン情報を投稿する際に問題があります。ここに私のコードは、これまでのところです:ここではリクエストモジュール(Pythonバージョン3.5.1)を使用してWebサイトにログインできません

import requests 

c = requests.Session() 
url = 'https://subscriber.hoovers.com/H/login/login.html' 
USERNAME = 'user' 
PASSWORD = 'pass' 

c.get(url) 
csrftoken = c.cookies['csrftoken'] 
login_data = dict(j_username=USERNAME, j_password=PASSWORD,   
csrfmiddlewaretoken=csrftoken, next='/') 
c.post(url, data=login_data, headers=dict(Referer=url)) 
page = c.get('http://subscriber.hoovers.com/H/home/index.html') 
print(page.content) 

はポストのログインページからフォームデータです:

j_username:ユーザー j_passwordという:8N0Z-TND5-NV71-C4N4-43BK: OWASP_CSRFTOKENを渡します-B13S-A1MO-NZQC OWASP_CSRFTOKEN:8N0Z-TND5-NV71-C4N4-43BK-B13S-A1MO-NZQC

ここで私はを受信エラーです:

Traceback (most recent call last): 
    File "C:/Users/10023539/Desktop/pyscripts/webscraper ex.py", line 9, in <module> 
    csrftoken = c.cookies['csrftoken'] 
    File "C:\Program Files (x86)\Python35-32\Lib\site-packages\requests\cookies.py", line 293, in __getitem__ 
    return self._find_no_duplicates(name) 
    File "C:\Program Files (x86)\Python35-32\Lib\site-packages\requests\cookies.py", line 351, in _find_no_duplicates 
    raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) 
KeyError: "name='csrftoken', domain=None, path=None" 

私は問題が 'OWASP_CSRFTOKEN'ラベルと関係していると思いますか?私はこの特定のCSRFの名前のための解決策をオンラインで見つけることはできませんでした。また、c.cookieメソッドを削除し、手動でCSRFコードをcsrfmiddlewaretoken引数に入力してみました。参照URLを変更しようとしましたが、同じエラーが発生しています。

ご協力いただければ幸いです。

+0

がどこにフォームデータを見ていると、あなたのc.textにトークンを見て必要がありますか?特に 'csrfmiddlewaretoken'ですか? –

+0

私はログイン後にページからフォームデータを取り出しました。私はドキュメントの例としてそれを見たので、私は 'csrfmiddlewaretoken'を使用しました。私は別の何かを使用しているはずですか?また、ヘッダーなどの情報が必要な場合は、私が投稿して嬉しいことをお知らせください。 – raidboss

+0

はい、実際のフォームデータの名前、開発者ツールを開いて、間違ったURLにも投稿しています。https:// subscriber.hoovers.com/H/j_spring_security_check' ans 'OWASP_CSRFTOKEN'はcsrfトークンの名前 –

答えて

-1

まず、KeyErrorの例外をキャッチします。つまり、cookies辞書にはキーがありませんcsrftokenです。

CSRFトークンのクッキー名を見つけるためには、レスポンスを調べる必要があります。 たとえば、あなたはすべてのクッキーを印刷することができます。

for key in c.cookies.keys(): 
    print('%s: %s' % (key, c.cookies[key])) 

UPD:実際にあなたの応答にはCSRFのクッキーを持っていません。 あなたはpyquery

<input type="hidden" name="OWASP_CSRFTOKEN" class="csrfClass" value="X48L-NEYI-CG18-SJOD-VDW9-FGEB-7WIT-88P4"> 
+0

ありがとうございます。少し具体的にお願いしますか?私は正確に何を求めていますか?また、私の反応を見るための他の方法はありますか?私はまだこのコードを入れているときにエラーが発生しています。 – raidboss

+0

そのHTMLは動的に生成されるため、ソースで返されることはありません –

関連する問題