Python 认证结果为404代码

Python 认证结果为404代码,python,authentication,beautifulsoup,lxml,access-token,Python,Authentication,Beautifulsoup,Lxml,Access Token,有一个网站,我需要刮,但在我这样做之前,我需要登录 似乎有三件事我需要进入,用户名,密码和真实性令牌。我知道用户名和密码,但不知道如何访问令牌 这就是我尝试过的: import requests from lxml import html login_url = "https://urs.earthdata.nasa.gov/home" session_requests = requests.session() result = session_requests.get(login_url)

有一个网站,我需要刮,但在我这样做之前,我需要登录

似乎有三件事我需要进入,用户名,密码和真实性令牌。我知道用户名和密码,但不知道如何访问令牌

这就是我尝试过的:

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)
这导致:

我的姓名和密码输入正确,因此令牌一定出了问题。我认为问题在于这一行:

payload = {"username": "my_name",
               "password": "my_password",
               "authenticity_token": authenticity_token}
authenticity\u token=list(set(tree.xpath(//input[@name='authenticity\u token']/@value))[0]

或此行:

payload = {"username": "my_name",
               "password": "my_password",
               "authenticity_token": authenticity_token}
通过查看网页上的源代码,我注意到有一个
authenticity\u令牌
csrf令牌
和一个
csrf参数
。所以可能是顺序不对,但我尝试了所有的组合

编辑:

这里是一个漂亮的汤的方法,结果在404再次

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) 

如果查看页面,您会注意到表单操作值为
'/login'
,因此您必须将数据提交到
https://urs.earthdata.nasa.gov/login“

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)

以下是一个快速示例:


还有一个我非常想访问的页面是
https://n5eil01u.ecs.nsidc.org/MOST/MOD10A1.006/
。在将数据发布到登录url后,是否有办法维护会话或重新发布到该链接?感谢您的帮助。如果登录成功,您应该能够使用会话访问其他页面。我无法验证这一点,因为我还没有帐户(激活新帐户需要48小时),但您可以尝试在标题中使用“Referer”和“User Agent”。如果您仍然无法登录,您可以尝试
selenium
。是的,我刚刚在新链接上再次使用了
s.get()
,我按照重定向页面操作,结果成功了。