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()
,我按照重定向页面操作,结果成功了。