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 模拟点击

