首页 > 解决方案 > 无法抓取发现银行页面

问题描述

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

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

我凌乱的代码如下:

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()

我还查看了所需的发布请求信息,并将其放在这里: 在此处输入图像描述

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

编辑:添加的信息我想在发布请求中可能有一些丢失的 cookie 或令牌,但我已经多次倾注代码并找到任何在实施时有效的东西,或者即使我正确地实现它。

有几件事对我来说很突出:

SSID:在有效的发布请求的“表单数据”中,有一个带有长字符串的“ssid”表单。但是,这种情况每次都会发生变化,我认为它代表“会话 ID”并且我不需要它,因为我的代码正在创建一个新会话。

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

STRONGAUTHSVS:我发现的另一件突出的事情是这个“STRONGAUTHSVS”变量(嵌套在长长的 cookie 字符串中,在请求和接收的标头中)

STRONGAUTHSVCS=SASID=null&SATID=b081-

sectoken:最后,我看到了工作令牌,我认为可能是它。cookie 中以“sectoken”为变量名的变量。不知道它是什么,或者我会如何暗示它。

sectoken=hJNQgh7EOnH1xx1skqQqftbV/kE=

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

标签: pythonweb-scrapingnetworkingscrape

解决方案


这个。我认为,出于安全原因,您的 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()

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


推荐阅读