Es gibt eine Website, die ich kratzen muss, aber bevor ich es tun muss ich mich anmelden.Authentifizierungsergebnisse in 404 Code
Es scheint drei Dinge zu geben, die ich brauche: Benutzername, Passwort und Authentizitätstoken. Der Benutzername und das Passwort sind mir bekannt, aber ich weiß nicht, wie ich auf das Token zugreifen soll. Diese
ist, was ich versucht habe:
import requests
from lxml import html
login_url = "https://urs.earthdata.nasa.gov/home"
session_requests = requests.session()
result = session_requests.get(login_url)
tree = html.fromstring(result.text)
authenticity_token = list(set(tree.xpath("//input[@name='authenticity_token']/@value")))[0]
payload = {"username": "my_name",
"password": "my_password",
"authenticity_token": authenticity_token}
result = session_requests.post(
login_url,
data = payload,
headers = dict(referer=login_url)
)
print (result)
Daraus ergibt sich:
<Response [404]>
Mein Name und das Passwort korrekt eingegeben, so dass es das Token, die schief gehen muss. Ich denke, das Problem ist diese Linie:
authenticity_token = list(set(tree.xpath("//input[@name='authenticity_token']/@value")))[0]
oder diese Zeile:
payload = {"username": "my_name",
"password": "my_password",
"authenticity_token": authenticity_token}
durch einen Blick auf den Quellcode auf der Webseite Ich habe bemerkt, gibt es eine authenticity_token
, csrf-token
und ein csrf-param
. So ist es möglich, dass diese in der falschen Reihenfolge sind, aber ich habe alle Kombinationen ausprobiert.
EDIT:
Hier ist eine schöne Suppe Ansatz, wieder in 404 führt.
s = requests.session()
response = s.get(login_url)
soup = BeautifulSoup(response.text, "lxml")
for n in soup('input'):
if n['name'] == 'authenticity_token':
token = n['value']
if n['name'] == 'utf8':
utf8 = n['value']
break
auth = {
'username': 'my_username'
, 'password': 'my_password'
, 'authenticity_token': token
, 'utf8' : utf8
}
s.post(login_url, data=auth)
gibt es eine andere Seite, die ich wirklich wollen, ist der Zugang 'https: // n5eil01u. ecs.nsidc.org/MOST/MOD10A1.006/'. Nachdem die Daten auf login_url gepostet wurden, gibt es eine Möglichkeit, die Sitzung zu warten oder erneut an diesen Link zu senden? Danke für Ihre Hilfe. –
Wenn die Anmeldung erfolgreich ist, sollten Sie die Sitzung für den Zugriff auf andere Seiten verwenden können. Ich kann das nicht überprüfen, weil ich noch kein Konto habe (es dauert bis zu 48 Stunden, um neue Konten zu aktivieren), aber Sie könnten es mit 'Referer' und 'User-Agent' in den Kopfzeilen versuchen. Wenn Sie sich immer noch nicht anmelden können, können Sie Selen ausprobieren. –
Ja, ich habe gerade 's.get()' wieder auf dem neuen Link und ich folgte einer Weiterleitungsseite und es funktionierte. –