2017-10-02 1 views
1

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) 

Antwort

1

Wenn Sie überprüfen Sie die Seite, dass form action Wert '/login' ist bemerken werden, so müssen Sie Ihre Daten https://urs.earthdata.nasa.gov/login' einreichen.

login_url = "https://urs.earthdata.nasa.gov/login" 
home_url = "https://urs.earthdata.nasa.gov/home" 

s = requests.session()               
soup = BeautifulSoup(s.get(home_url).text, "lxml")            
data = {i['name']:i.get('value', '') for i in soup.find_all('input')} 
data['username'] = 'my_username' 
data['password'] = 'my_password' 
result = s.post(login_url, data=data) 

print(result) 

< Response [200]>

Ein kurzes Beispiel mit selenium:

from selenium import webdriver 

driver = webdriver.Firefox() 
url = 'https://n5eil01u.ecs.nsidc.org/MOST/MOD10A1.006/' 

driver.get(url) 
driver.find_element_by_name('username').send_keys('my_username') 
driver.find_element_by_name('password').send_keys('my_password') 
driver.find_element_by_id('login').submit() 

html = driver.page_source 
driver.quit() 
+0

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. –

+0

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. –

+0

Ja, ich habe gerade 's.get()' wieder auf dem neuen Link und ich folgte einer Weiterleitungsseite und es funktionierte. –

Verwandte Themen