无法抓取发现银行页面

Can't scrape Discover bank page

我环顾四周并尝试了很多不同的东西,但似乎找不到关于这个主题的任何信息。

我正在尝试从我的银行 (Discover) 中抓取信息并为此编写了一个脚本。它 returns 一切正常,但返回的是“已注销”页面,而不是带有我的余额的所需主页。

我的乱码如下:

import requests
from bs4 import BeautifulSoup as bs
def scrapeDiscover():
    URL = 'https://portal.discover.com/customersvcs/universalLogin/signin'
    request_URL = 'https://portal.discover.com/customersvcs/universalLogin/signin'

    HEADERS = {'User-Agent':'User-Agent: Mozilla/5.0 (Windows NT; Windows NT 6.2; en-US) WindowsPowerShell/4.0', 'Origin':'https://portal.discover.com', 'Referer':'https://portal.discover.com/customersvcs/universalLogin/ac_main'}
    s = requests.session()
    PAYLOAD = {
        'userID' : 'username',
        'password' : 'password',
        'choose-card' : 'Credit Card',
        'pm_fp' : 'version=-1&pm_fpua=mozilla/5.0 (x11; linux x86_64) applewebkit/537.36 (khtml, like gecko) chrome/95.0.4638.69 safari/537.36|5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36|Linux x86_64&pm_fpsc=24|1920|1080|1053&pm_fpsw=&pm_fptz=-6&pm_fpln=lang=en-US|syslang=|userlang=&pm_fpjv=0&pm_fpco=1',
        'currentFormId' : 'login',
        'userTypeCode' : 'C',
        'rememberOption' : 'on',
    }

    login_req = s.post(URL, headers=HEADERS, data=PAYLOAD)
    cookies = login_req.cookies
    soup = bs(s.get('https://card.discover.com/cardmembersvcs/achome/homepage').text, 'html.parser')

    balance = soup.text
    print(balance)

scrapeDiscover()

我还查看了所需的 post 请求信息,并将其放在此处:

如有任何帮助或建议,我们将不胜感激!即使只是一个建议也会有很大帮助。非常感谢大家!如果需要更多信息,请告诉我。

编辑:添加信息 我想 post 请求中可能缺少一些 cookie 或令牌,但我已经多次检查代码并找到任何在 implimented 时有效的东西,或者即使我正确地实现它也是如此。

一些让我印象深刻的事情:

SSID:在 post 请求的 'Form Data' 中,有一个带有长字符串的 'ssid' 形式。然而,这每次都会改变,我想象它代表 'session ID' 而我不需要它,因为我的代码正在创建一个新的 session.

ssid: 0433c923-6f48-4832-8d6d-b26c5b0e6d4-1637097180562

STRONGAUTHSVS:我发现的另一件事是这个“STRONGAUTHSVS”变量(嵌套在一长串 cookie 中,既在请求中又在接收中 headers)

STRONGAUTHSVCS=SASID=null&SATID=b081-

sectoken:最后看到work token,觉得应该就是这个了。 Cookie 中的一个变量,变量名是 'sectoken'。不知道它是什么,也不知道我会如何实现它。

sectoken=hJNQgh7EOnH1xx1skqQqftbV/kE=

对于所有这些,我已经尽力将它们嵌入到我的代码中的 headers 中,但它似乎对输出没有影响。 我附上了网站 cookie 的 pastebin 和捕获的表单数据(减去任何敏感数据)。如果有人有任何想法,我将非常感激! https://pastebin.com/PNnV6Mpw

阅读this。我认为,出于安全原因,您的 POST 请求可能需要一个令牌。如果只是抓取很重要,请尝试使用硒。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Firefox()
driver.get("https://portal.discover.com/customersvcs/universalLogin/signin")
driver.maximize_window()

log_in = (
    WebDriverWait(driver, 5)
    .until(
        EC.element_to_be_clickable(
            (By.XPATH, "/html/body/div[1]/header/div[1]/div[2]/div[2]/ul/li[3]/a")
        )
    )
    .click()
)
driver.find_element_by_xpath("//*[@id='userid']").send_keys("your_user_id")
driver.find_element_by_xpath("//*[@id='password']").send_keys("your_password")
driver.find_element_by_xpath("//*[@id='log-in-button']").click()

当我使用左侧面板登录时出现错误。