You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python爬虫无法登录vet-ebooks网站下载书籍的问题求助

vet-ebooks.com 登录失败问题解决

Requests 登录失效的原因与修复

你的Requests代码核心问题是硬编码了动态生成的ihc_login_nonce值——这个密钥每次加载登录页面都会刷新,固定值无法通过服务器验证,所以即便返回200状态码,实际并未完成登录。

修复步骤:

  1. 先发送GET请求获取登录页面,从源码中提取最新的ihc_login_nonce
  2. 带上模拟浏览器的请求头,避免被识别为爬虫
  3. 确保POST请求的URL与页面表单的action属性一致

修正后的代码:

import requests
from bs4 import BeautifulSoup

session = requests.Session()
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
}

# 第一步:获取登录页面,提取动态nonce
login_page = session.get('https://www.vet-ebooks.com/user-login/', headers=headers)
soup = BeautifulSoup(login_page.text, 'html.parser')
nonce = soup.find('input', {'name': 'ihc_login_nonce'})['value']

# 构造正确的登录payload
login_payload = {
    'log': '你的用户名',
    'pwd': '你的密码',
    'rememberme': 'forever',
    'ihcaction': 'login',
    'ihc_login_nonce': nonce,
    'Submit': 'Login'  # 补充表单提交按钮的字段
}

# 发送POST请求登录
login_req = session.post('https://www.vet-ebooks.com/user-login/', data=login_payload, headers=headers)

# 验证登录:访问需要登录的页面,检查内容是否包含登录后的标识
test_page = session.get('https://www.vet-ebooks.com/your-account/', headers=headers)
if 'Dashboard' in test_page.text:
    print("登录成功")
else:
    print("登录失败")

Selenium 登录不跳转的原因与修复

你的Selenium代码存在几个关键问题:

  1. 重复调用driver.get:第二次加载登录页会清空之前输入的账号密码,等于白操作
  2. 缺少必要导入:代码中使用WebDriverWait和EC但未导入,会直接报错
  3. 登录按钮定位不准确:依赖name="Submit"稳定性差,建议用更可靠的选择器
  4. headless模式被反爬识别:纯headless容易被检测,需添加参数模拟正常浏览器
  5. 点击后未等待跳转:页面跳转需要时间,直接获取current_url会拿到旧地址

修正后的代码:

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

chrome_options = webdriver.ChromeOptions()
chrome_options.set_capability('browserless:token', 'TOKENHERE')
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--headless=new")  # 新版headless更接近正常浏览器
chrome_options.add_argument("--disable-blink-features=AutomationControlled")
chrome_options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36")
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option('useAutomationExtension', False)

driver = webdriver.Remote(
    command_executor='https://chrome.browserless.io/webdriver',
    options=chrome_options
)

driver.get("https://www.vet-ebooks.com/user-login/")
wait = WebDriverWait(driver, 15)

# 输入用户名
username_field = wait.until(EC.visibility_of_element_located((By.NAME, "log")))
username_field.clear()
username_field.send_keys("你的用户名")

# 输入密码
password_field = wait.until(EC.visibility_of_element_located((By.NAME, "pwd")))
password_field.clear()
password_field.send_keys("你的密码")

# 点击登录按钮(用按钮文本定位更稳定)
login_button = wait.until(EC.element_to_be_clickable((By.XPATH, "//input[@value='Login']")))
login_button.click()

# 等待页面跳转或登录成功元素出现
try:
    # 等待账号页面加载,验证登录成功
    wait.until(EC.url_contains("/your-account/"))
    print("登录成功,当前URL:", driver.current_url)
except:
    # 检查是否有错误提示
    error_msg = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".ihc-error-message"))).text
    print("登录失败,错误信息:", error_msg)

driver.quit()

额外注意事项

  • 若网站启用验证码,Requests方式基本无法绕过,只能用Selenium配合手动打码或验证码识别服务
  • 频繁登录可能触发IP封禁,建议添加合理的请求间隔
  • 定期检查网站表单字段变化,网站更新后可能需要调整字段名或选择器

内容的提问来源于stack exchange,提问作者shzyincu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 07:37:45