无法使用请求登录网站

时间:2020-08-12 18:12:08

标签: python python-3.x web-scraping python-requests

我正在尝试使用请求模块登录此site,但是每次尝试以下尝试时,我都会得到403状态代码。尽管我试图通过监视开发工具来模仿发送请求的方式,但是我无法使其正常工作。我在这里使用的凭据(用户名:simpndev@gmail.com,密码:+agb5E2?w2pQJ3z)仅用于测试目的,因此您可以自由使用。

要获取表格,您需要做的就是单击login按钮,然后单击Fantasy按钮。

我尝试过:

import re
import requests

link = 'https://www.fanduel.com/contests'
url = 'https://api.fanduel.com/sessions'

payload = {"email":"simpndev@gmail.com","password":"+agb5E2?w2pQJ3z","product":"DFS"}

def log_in(s):
    r = s.get(link)
    client_id = re.findall(r"clientId\":\"(.*?)\",",r.text)[0]
    s.headers['authorization'] = f'Basic {client_id}'
    s.headers['Referer'] = 'https://www.fanduel.com/login'
    s.headers['accept'] = 'application/json'
    r = s.post(url,json=payload)
    print(r.status_code)

if __name__ == '__main__':
    with requests.Session() as s:
        s.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36'
        log_in(s)

我发现使用硒成功,所以我不想走那条路。

如何使用请求登录该站点?

2 个答案:

答案 0 :(得分:3)

此请求涉及2个潜在的403错误。 link = 'https://www.fanduel.com/contests'的bot保护中的403,以及从请求到/ sessions /

的403

link的403正在使用浏览器的某些高级功能来检查是否多次尝试登录。这将是一个更复杂的主题,涉及将User-Agent字符串与HTTP2流量进行比较,用ML击败验证码等等。我的建议是不要走这条路。

相反,降低用户代理字符串的版本,并确保提供正确的标题。您没有为初始请求提供正确的标头,因此您生成了403,然后进入了机器人黑名单并试图对其进行管理。

以下内容对我有用,如下面的调试器屏幕截图所示:

import re
import requests

link = 'https://www.fanduel.com/contests'
url = 'https://api.fanduel.com/sessions'

payload = {"email":"simpndev@gmail.com","password":"+agb5E2?w2pQJ3z","product":"DFS"}

def log_in(s):
    r = s.get(link)
    client_id = re.findall(r"clientId\":\"(.*?)\",",r.text)[0]
    s.headers['Authorization'] = f'Basic {client_id}'
    s.headers['Referer'] = 'https://www.fanduel.com/login?cc_success_url=%2Fcontests'
    s.headers['Accept'] = 'application/json'
    s.headers['Accept-Encoding'] = 'gzip, deflate, br'
    s.headers['Accept-Language'] = 'en-US,en;q=0.5'
    s.headers['Origin'] = "https://www.fanduel.com"
    r = s.post(url,json=payload)
    print(r.status_code)

if __name__ == '__main__':
    with requests.Session() as s:
        s.headers['User-Agent'] = 'Mozilla/5.0 (en-us) AppleWebKit/534.14 (KHTML, like Gecko; Google Wireless Transcoder) Chrome/9.0.597 Safari/534.14 wimb_monitor.py/1.0'
        log_in(s)

注意,我修改了Referer,修改了标头键的大小写,并提供了可能被认为多余的标头。在检查r.request.headers时,我发现请求和Firefox等发送的消息之间存在差异,因此我只添加了其他内容。

还请注意,您的不记名令牌和帐户凭证现在分布广泛,并且如果您仍在使用它们进行测试,可能会增加403。您将需要一个干净的帐户,因为现在很多人可能都有这些信誉。

enter image description here

答案 1 :(得分:0)

在那之前,过去使用Selenium进行网页抓取存在很多问题。

我更感兴趣的一种替代方法是使用mitmproxy将导航脚本转储到文件中,然后使用requests重播它,如下所示:

import mitmproxy.io
import requests

def main():
    sess = requests.Session()
    with open('flows', 'rb') as f: data = [row for row in mitmproxy.io.FlowReader(f).stream()]
    for d in data:
        url = d.request.url
        raw_content = d.request.raw_content
        headers = dict([(k, v,) for k, v in d.request.headers.items() if not k.startswith(':') and k.lower() != 'cookie'])
        print(url, raw_content, headers)
        if d.request.method == 'GET':
            r = sess.get(url, headers=headers, data=raw_content)
        if d.request.method == 'POST':
            r = sess.post(url, headers=headers, data=raw_content)
        print(r.status_code)
        if d.request.url == 'https://api.fanduel.com/sessions':
            break

if __name__ == '__main__':
    main()

上面的代码(使用我自己从mitmproxy转储的流)产生以下输出:

http://www.fanduel.com/ b'' {'Host': 'www.fanduel.com', 'Upgrade-Insecure-Requests': '1', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.2 Mobile/15E148 Safari/604.1', 'Accept-Language': 'en-gb', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'keep-alive'}
200
https://www.fanduel.com/ b'' {'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'upgrade-insecure-requests': '1', 'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.2 Mobile/15E148 Safari/604.1', 'accept-language': 'en-gb', 'accept-encoding': 'gzip, deflate'}
200
https://www.fanduel.com/JMCVuBG8/init.js b'' {'accept': '*/*', 'accept-encoding': 'gzip, deflate, br', 'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.2 Mobile/15E148 Safari/604.1', 'accept-language': 'en-gb', 'referer': 'https://www.fanduel.com/'}
200
https://www.fanduel.com/login?source=Header%20Login b'' {'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'accept-encoding': 'gzip, deflate, br', 'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.2 Mobile/15E148 Safari/604.1', 'accept-language': 'en-gb', 'referer': 'https://www.fanduel.com/'}
200 
https://api.fanduel.com/sessions b'{"email":"simpndev@gmail.com","password":"+agb5E2?w2pQJ3z","product":"DFS"}' {'accept': 'application/json', 'origin': 'https://www.fanduel.com', 'content-type': 'application/json', 'authorization': 'Basic ZWFmNzdmMTI3ZWEwMDNkNGUyNzVhM2VkMDdkNmY1Mjc6', 'referer': 'https://www.fanduel.com/login', 'content-length': '75', 'accept-language': 'en-gb', 'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.2 Mobile/15E148 Safari/604.1', 'accept-encoding': 'gzip, deflate, br'}
201

您所需要的只是一台设置了代理的设备,以通过您自己的mitmproxy安装进行安装(我通常使用手机通过PC和SOCKS5路由请求)。如果网站导航发生了变化,您需要做的就是建立一个新流程并转储脚本以提供python程序。

这不会解决更复杂的javascript安全性实现,但是对于像本网站这样的简单实现就足够了。