有一个网站,我需要刮,但在我这样做之前,我需要登录。你知道吗
似乎有三样东西我需要进去,用户名,密码和真实性令牌。用户名和密码我知道,但我不知道如何访问令牌。你知道吗
这就是我尝试过的:
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_token
、csrf-token
和csrf-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)
如果您检查页面,您会注意到表单操作值是
'/login'
,因此您必须将数据提交给https://urs.earthdata.nasa.gov/login'
。你知道吗使用^{} 的快速示例:
相关问题 更多 >
编程相关推荐