Python模拟登录时遇到通过js文件setcookies设置cookie而非post页面返回,该如何处理?

rt,login 地址是 http://shome.ouchn.cn ,js 地址是 http://pv.open.com.cn/datacollect.js 。 如何利用 py 模拟登陆最方便呢? js 看不懂,有木有大神解答一下


Python模拟登录时遇到通过js文件setcookies设置cookie而非post页面返回,该如何处理?

6 回复

很简单啊,这个你用 requests 的 session 去请求,第一次请求验证码,第二个请求登录 api,最后把登陆成功后的 cookie 保存起来即可


这种情况得用无头浏览器来跑JS代码,直接获取设置好的cookie。用Selenium或者Playwright这类工具就能搞定。

下面用Selenium给你写个例子,模拟登录并拿到JS设置的cookie:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time

# 设置Chrome选项
chrome_options = Options()
chrome_options.add_argument('--headless')  # 无头模式
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--no-sandbox')

# 启动浏览器
driver = webdriver.Chrome(options=chrome_options)

try:
    # 访问登录页面
    driver.get('https://example.com/login')
    
    # 找到用户名和密码输入框并填写
    username_input = driver.find_element('name', 'username')
    password_input = driver.find_element('name', 'password')
    
    username_input.send_keys('your_username')
    password_input.send_keys('your_password')
    
    # 找到登录按钮并点击
    login_button = driver.find_element('xpath', '//button[@type="submit"]')
    login_button.click()
    
    # 等待JS执行和页面加载
    time.sleep(3)
    
    # 获取所有cookie
    cookies = driver.get_cookies()
    
    # 将cookie转换为requests可用的字典格式
    cookie_dict = {cookie['name']: cookie['value'] for cookie in cookies}
    
    print("获取到的cookie:", cookie_dict)
    
finally:
    driver.quit()

如果你需要更快的性能,可以考虑用Playwright,它比Selenium快一些:

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    page = browser.new_page()
    
    page.goto('https://example.com/login')
    
    # 填写登录表单
    page.fill('input[name="username"]', 'your_username')
    page.fill('input[name="password"]', 'your_password')
    page.click('button[type="submit"]')
    
    # 等待导航完成
    page.wait_for_load_state('networkidle')
    
    # 获取cookie
    cookies = page.context.cookies()
    cookie_dict = {cookie['name']: cookie['value'] for cookie in cookies}
    
    print("获取到的cookie:", cookie_dict)
    
    browser.close()

核心思路就是让真正的浏览器环境去执行JS,然后直接从浏览器里把设置好的cookie捞出来。这样你就能拿到JS设置的cookie,后续用requests之类的库发请求时直接带上就行。

用浏览器跑JS拿cookie最稳。

其实超简单,先这样,再这样,再这样,over~

会来这里问这种问题代表你需要的是无头浏览器。

chromedriver 这类库可以试试看

selenium 模拟点击

回到顶部