认证结果为404 cod

2024-04-24 07:04:48 发布

您现在位置:Python中文网/ 问答频道 /正文

有一个网站,我需要刮,但在我这样做之前,我需要登录。你知道吗

似乎有三样东西我需要进去,用户名,密码和真实性令牌。用户名和密码我知道,但我不知道如何访问令牌。你知道吗

这就是我尝试过的:

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)

这将导致:

<Response [404]>

我的名字和密码输入正确,所以它是令牌,一定是出了问题。我认为问题在于这一行:

authenticity_token = list(set(tree.xpath("//input[@name='authenticity_token']/@value")))[0]

或此行:

payload = {"username": "my_name",
               "password": "my_password",
               "authenticity_token": authenticity_token}

通过查看网页上的源代码,我注意到有authenticity_tokencsrf-tokencsrf-param。所以可能是顺序不对,但我试过所有的组合。你知道吗

编辑:

这里是一个漂亮的汤的方法,结果在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) 

Tags: nametokentreeurl密码valuesessionmy
1条回答
网友
1楼 · 发布于 2024-04-24 07:04:48

如果您检查页面,您会注意到表单操作值是'/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)

< Response [200]>

使用^{}的快速示例:

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()

相关问题 更多 >