Python爬虫无法登录vet-ebooks网站下载书籍的问题求助
vet-ebooks.com 登录失败问题解决
Requests 登录失效的原因与修复
你的Requests代码核心问题是硬编码了动态生成的ihc_login_nonce值——这个密钥每次加载登录页面都会刷新,固定值无法通过服务器验证,所以即便返回200状态码,实际并未完成登录。
修复步骤:
- 先发送GET请求获取登录页面,从源码中提取最新的
ihc_login_nonce - 带上模拟浏览器的请求头,避免被识别为爬虫
- 确保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代码存在几个关键问题:
- 重复调用
driver.get:第二次加载登录页会清空之前输入的账号密码,等于白操作 - 缺少必要导入:代码中使用
WebDriverWait和EC但未导入,会直接报错 - 登录按钮定位不准确:依赖
name="Submit"稳定性差,建议用更可靠的选择器 - headless模式被反爬识别:纯headless容易被检测,需添加参数模拟正常浏览器
- 点击后未等待跳转:页面跳转需要时间,直接获取
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
相关产品推荐
相关产品推荐

