为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

互换的青春 2022-04-27 13:39:55
我一直在尝试从 Fantasy Premier League ( https://fantasy.premierleague.com ) 中抓取数据,当我尝试通过 Python 中的请求模块登录时,出现 405 错误。要获取我需要的数据,首先我需要登录该站点。因此,在从网页获取 id 后,我以 json 格式手动输入了我的用户名和密码。我还包括了表单所需的隐藏字段。我创建了一个 Session 变量并向该站点发送了一个 post 请求,该数据变量用于 data 参数,import requestssession = 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,但我计划制作一个小项目并分发给其他人,我希望在没有浏览器驱动程序的情况下进行数据抓取。
查看完整描述

1 回答

?
缥缈止盈

TA贡献2041条经验 获得超4个赞

您的问题是您将错误发送FIELDS到错误URL。


在 Chrome/Firefox 中使用DevTools,您可以看到浏览器将字段login, password(而不是loginUsername, loginPassword)发送到https://users.premierleague.com/accounts/login/


import requests


session = requests.Session()


#session.headers.update({'user-agent': 'Mozilla/5.0'})


data = {

     "login" : "james.bond@mi6.com", 

     "password" : "007", 

     "app" : "plfpl-web", 

     "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 requests

from bs4 import BeautifulSoup


session = requests.Session()

#session.headers.update({'user-agent': 'Mozilla/5.0'})


login_url = "https://users.premierleague.com/accounts/login/"


# GET page with form

r = session.get(login_url, data=data)

soup = BeautifulSoup(r.content)


data = {

     "login" : "your_login", 

     "password" : "your_password", 

}


# get values from form (except empty places for login and password)

for item in soup.find_all('input'):

    key = item['name']

    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.

    if value:

        data[key] = value

    print(key, '=', value)

    

# POST form data to login

r = session.post(login_url, data=data)


# check if url is different

print(r.url)

print(r.url != login_url)


查看完整回答
反对 回复 2022-04-27
  • 1 回答
  • 0 关注
  • 389 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信