2017-12-22 12 views
1

私はyelpを使ってログインしてウェブサイトを削り取ろうとしています。理解を深めるための最初の質問:アイデアを得るためにいくつかのチュートリアルをたどり、CSRFトークンで辞書を作成することに気付きましたが、yelpログインサイトを擦ったときに6つのトークンが見つかりました。私は辞書に重複キーを持つことができないことを知っています。このチュートリアルでは、最後のトークンで終わるので、この重複/間違った辞書を使用していますか?CSRFトークンを複数のトークンで転記しますか?

第2に、複数のトークンがある場合はどちらを使用しますか?または、それらのすべてをどのように使用していますか?私はログインが正常に動作するように思えず、BeautifulSoupとRequestsのドキュメントを読んで、最後の夜にStackを洗った。以下のコード。 ありがとうございます。

s = requests.session() 
login = s.get('https://www.yelp.com/login') 

soup = BeautifulSoup(login.text, 'html.parser') 
tokenList = soup.find_all(type = 'hidden', attrs={"name": "csrftok"}) 
c = login.cookies #Just peeked into cookies to see if there is a token 
print(c) 

keys = [x.attrs["name"] for x in tokenList] 
values = [x.attrs["value"] for x in tokenList] 
#If I print these two lists, I get 6 keys of the "csrftok" String, and 6 
#different keys. 

email = "my email" 
password = "my password" 
#I tried creating a dictionary with zip of all the tokens, etc. This 
#is an attempt just using the first key and value I find. 
d = {'email': email, 'password': password, keys[0]: values[0]} 
response = s.post('https://www.yelp.com/login', data = d) 

print(response.url) 

答えて

1

あなたはこれを試しましたか?私はそれが正しい方向にあなたを導くはずだと思います:

s = requests.session() 
login = s.get('https://www.yelp.com/login') 

soup = BeautifulSoup(login.text, 'lxml') 
token = soup.select(".csrftok")[0]['value'] 

email = "my email" 
password = "my password" 

headers={ 
'accept':'application/json, text/javascript, */*; q=0.01', 
'accept-encoding':'gzip, deflate, br', 
'content-type':'application/x-www-form-urlencoded; charset=UTF-8', 
'referer':'https://www.yelp.com/login', 
'user-agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36', 
'x-distil-ajax':'fytrybseesxsvsresb', 
'x-requested-with':'XMLHttpRequest' 
} 

payload = { 
'csrftok':token, 
'email':email, 
'password':password, 
} 

response = s.post('https://www.yelp.com/login/newajax', data = payload, headers=headers) 
print(response.url) 
+0

「ヘッダー」を追加するのを忘れました。すでに修正済み。それを確認する方法はありません。しかし、私に教えてください。 – SIM

+0

これで、有効なステータス応答が得られるようになりましたが、response.urlを印刷すると、ログイン後に新しいURLが返されるはずです。私はそれがログインしているとは思わない、さもなければ私はテキストで私の名前を検索し、ブール値を返すことができるはずですか?また、私はnewajaxがあなたの場所であると仮定しているので、自分のコードから削除する必要がありますか? –

+0

応答がjsonにあると想定されるので、 'response.text'または' response.json() 'を表示するときに何を確認しましたか?私はチェックアウトできません。 Btw、私は 'chrome/firefox developer tools'から派生したリクエストパラメータを設定すると仮定します。私が推測したやり方を正確に行なわなければ、上記のパラメータは正しいはずです。 – SIM