猿问

如何克服从 Python 请求登录站点时出现 405 错误

我一直在尝试从 Fantasy Premier League ( https://fantasy.premierleague.com ) 中抓取数据,当我尝试通过 Python 中的请求模块登录时,出现 405 错误。


要获取我需要的数据,首先我需要登录该站点。因此,在从网页获取 id 后,我以 json 格式手动输入了我的用户名和密码。我还包括了表单所需的隐藏字段。我创建了一个 Session 变量并向该站点发送了一个 post 请求,该数据变量用于 data 参数,


import requests


session = requests.Session()

data = {

            "loginUsername" : "username", 

            "loginPassword" : "password", 

            "app" : "plfpl-web", 

            "redirect_uri" : "https://fantasy.premierleague.com/"

       }


url = "https://fantasy.premierleague.com/"


login = session.post(url, data = data)


print(login.text)

我得到以下输出


<html>

<head><title>405 Not Allowed</title></head>

<body bgcolor="white">

<center><h1>405 Not Allowed</h1></center>

<hr><center>nginx/1.13.5</center>

</body>

</html>

我对不同的网站(例如 Twitter)尝试了相同的方法,并收到了类似上面的 405 或 403 错误消息。


我可以更改哪些内容才能成功获取请求?我知道我可以使用 Selenium,但我计划制作一个小项目并分发给其他人,我希望在没有浏览器驱动程序的情况下进行数据抓取。


互换的青春
浏览 390回答 1
1回答

缥缈止盈

您的问题是您将错误发送FIELDS到错误URL。在 Chrome/Firefox 中使用DevTools,您可以看到浏览器将字段login, password(而不是loginUsername, loginPassword)发送到https://users.premierleague.com/accounts/login/import requestssession = requests.Session()#session.headers.update({'user-agent': 'Mozilla/5.0'})data = {&nbsp; &nbsp; &nbsp;"login" : "james.bond@mi6.com",&nbsp;&nbsp; &nbsp; &nbsp;"password" : "007",&nbsp;&nbsp; &nbsp; &nbsp;"app" : "plfpl-web",&nbsp;&nbsp; &nbsp; &nbsp;"redirect_uri" : "https://fantasy.premierleague.com"}#url = "https://fantasy.premierleague.com"#r = session.get(url)#print(r.status_code)url = "https://users.premierleague.com/accounts/login/"r = session.post(url, data=data)print(r.status_code) # 200#print(r.text)很多时候,从真正的浏览器中使用 User-Agent 标头是件好事——或者至少'Mozilla/5.0'获取主页以获取新的 cookie。对于此页面,它不是必需的,但我将代码保留在注释中。编辑:(2020.07.10)登录代码。顺便说一句:在正确的登录服务器重定向到不同的 URL 之后,所以我使用这个事实来检查我是否已登录。import requestsfrom bs4 import BeautifulSoupsession = requests.Session()#session.headers.update({'user-agent': 'Mozilla/5.0'})login_url = "https://users.premierleague.com/accounts/login/"# GET page with formr = session.get(login_url, data=data)soup = BeautifulSoup(r.content)data = {&nbsp; &nbsp; &nbsp;"login" : "your_login",&nbsp;&nbsp; &nbsp; &nbsp;"password" : "your_password",&nbsp;}# get values from form (except empty places for login and password)for item in soup.find_all('input'):&nbsp; &nbsp; key = item['name']&nbsp; &nbsp; value = item.get('value') # I use get('value') instead of ['value'] to get None instead of error when there is no value like for login and password.&nbsp; &nbsp; if value:&nbsp; &nbsp; &nbsp; &nbsp; data[key] = value&nbsp; &nbsp; print(key, '=', value)&nbsp; &nbsp;&nbsp;# POST form data to loginr = session.post(login_url, data=data)# check if url is differentprint(r.url)print(r.url != login_url)
随时随地看视频慕课网APP

相关分类

Python
我要回答