2017-06-14 7 views
2

Ich muss Website zu kratzen, die Anmeldung erfordert. Ich versuche, eine session zu erstellen und mich anzumelden, da ich verschiedene Seiten nach dem Einloggen kratzen muss. Aber kann nicht herausfinden, warum es nicht funktioniert.Python-Anfragen können nicht auf einer Website anmelden

import requests 
from bs4 import BeautifulSoup 

login_data = { 
      "log":"login", 
      "login":"my email", 
      "password":"my password" 
} 

session = requests.session() 
session.post(login_url, data=login_data) 
response = session.get(url) 
html = response.text 
soup = BeautifulSoup(html, "html.parser") 
print(soup.title.get_text()) 

Titel zeigt, dass es nicht funktioniert.

Hier ist die Website Form.

<form method="post" id="signin-form" class="form-horizontal"> 
<input type="hidden" name="referer" value="" /> 
<div class="form-group"> 
<label for="email_text" class="col-sm-4 control-label">Your login (email):</label> 
<div class="col-sm-8"> 
<input type="email" class="form-control" id="email_text" value="" name="login" autofocus 
data-validation='{"parent":".form-group","events":["keyup","blur"],"rules":[{"name":"notblank"},{"name":"email"}]}' /> 
</div> 
</div> 
<div class="form-group"> 
<label for="password_text" class="col-sm-4 control-label">Password:</label> 
<div class="col-sm-8"> 
<input type="password" class="form-control" id="password_text" name="password" 
data-validation='{"parent":".form-group","rules":[{"name":"min","min":5}]}' /> 
</div> 
</div> 
<div class="form-group"> 
<div class="col-sm-8 col-sm-offset-4"> 
<div class="checkbox"> 
<label> 
<input type="checkbox" name="rememberme"> Remember me on this computer 
</label> 
</div> 
</div> 
</div> 
<div class="form-group"> 
<div class="col-sm-offset-4 col-sm-8"> 
<button type="submit" class="btn btn-default btn-lg" name="log">Log into your account</button> 
<a class="btn btn-default btn-lg mobile-show-inline-block" href="/account/create/">Create account</a> 
<a href="/account/lostpassword" class="btn btn-link btn-lg">Forgot your password?</a> 
</div> 
</div> 
</form> 

N. B: Ich schlage vor, mich nicht selenium zu verwenden. Ich kann dies mit selenium tun, und ich habe das getestet, aber ich muss bei requests bleiben, weil selenium Pop-up-Konsole auch wenn ich PhantomJS verwenden.

+2

Versuchen Sie, zuerst auf die Anmeldeseite zu gelangen. Vielleicht setzt es einige Cookies, von denen erwartet wird, dass sie auf dem Post vorhanden sind. –

+0

@JohnGordon WOW !! Das funktioniert. Bitte posten Sie es als Antwort. –

Antwort

3

Versuchen eine erste auf der Login-Seite bekommen zu tun. Vielleicht setzt es einige Cookies, von denen erwartet wird, dass sie auf dem Post vorhanden sind.

+0

Können Sie mir ein bisschen mehr helfen? Es funktioniert, wenn ich dies von einem normalen Skript aus mache, aber wenn ich versuche, mich von einem Django-Projekt anzumelden und zu scrapen, funktioniert es nicht. Kannst du sagen warum? –

+0

Schwer zu sagen, ohne Ihren Code zu sehen ... –

+0

Können wir zum Chat wechseln? –

0

Sie könnten einige Header fehlen. Ich würde eine Anfrage abfangen, die von einem Webbrowser gemacht wurde, um die Dinge zu sehen, die Sie vermissen, und dann diese Header zu Ihrer Anfrage hinzufügen.

Sie finden Informationen darüber, wie es auf der offiziellen Dokumentation zu tun, hier: http://docs.python-requests.org/en/master/user/quickstart/#custom-headers

+0

Wie fügt man Header hinzu? Sollte es nicht ohne Header funktionieren? :/ –

+0

Es hängt wirklich von dem Server ab, den Sie anrufen. Eine wachsende Anzahl von Webseiten blockiert nun Anfragen, die zum Beispiel nicht mit der Kopfzeile eines Browsers kommen. In Python-Anfragen können Sie ein Dict, das Ihre Header als Parameter enthält, zu Ihrer Post-Anfrage hinzufügen, der Kwarg heißt "headers" (ohne die Anführungszeichen). –

Verwandte Themen