最近遇到一个项目,需要从平台自动爬取相关数据,但是最近的平台的数据接口加固了,除了加入了用户登录后的验证cookie以外,还加入额外的header参数的验证,而且密码被js加密后(非普通MD5加密)post到服务器,js代码已经混淆,基本上不可读,这使得普通的网络爬虫技巧全部失效。一周后,cookie失效,服务器就会提示请登录,强制客户端重新登录。这给我们自动化爬数据带来新的麻烦,要重新登录,就成为了半自动了。
Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera,Edge等。
针对这种情况,Selenium正好可以排上用场。由于我的服务器是centos7,python2.7的环境,现整理出Selenium自动登录相关知识,供粉丝们参考,也是为了怕自己忘记,权当学习笔记吧。
1. 安装必要组件(Firefox版)
# 安装Python开发工具
yum install -y python-devel gcc
# 安装Firefox浏览器
yum install -y firefox
# 安装geckodriver(Firefox驱动)
# 下载最新版(请访问https://github.com/mozilla/geckodriver/releases 查看最新版本)
wget https://github.com/mozilla/geckodriver/releases/download/v0.33.0/geckodriver-v0.33.0-linux64.tar.gz
tar -xvzf geckodriver-*.tar.gz
mv geckodriver /usr/local/bin/
chmod +x /usr/local/bin/geckodriver # 修改为可执行文件,tar解压后geckodriver一般为可执行文件。
# 安装Selenium
pip install selenium2. Python自动登录示例代码(Firefox版)
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.firefox.options import Options
import time
# Firefox配置
options = Options()
options.add_argument('--headless') # 无头模式(服务器环境)
#--headless这个非常重要,没有图形窗口,就要使用它
options.add_argument('--disable-gpu')
options.add_argument('--no-sandbox')
# 初始化浏览器驱动
driver = webdriver.Firefox(
executable_path='/usr/local/bin/geckodriver',
options=options
)
try:
# 打开登录页面
login_url = "https://example.com/login" # 替换为实际登录网址
print("正在打开登录页面: " + login_url)
driver.get(login_url)
# 定位元素并输入凭据(需要根据实际页面调整)
# 方法1:通过元素名称定位
username = driver.find_element_by_name("username") # 替换实际用户名元素名
password = driver.find_element_by_name("password") # 替换实际密码元素名
#以上两个参数需要阅读html的网页代码,才能找到
# 方法2:通过XPath定位(更灵活)
# username = driver.find_element_by_xpath("//input[@id='login-username']")
# password = driver.find_element_by_xpath("//input[@id='login-password']")
username.send_keys("your_username") # 替换实际用户名
password.send_keys("your_password") # 替换实际密码
# 提交登录表单
# 方法1:直接提交
password.send_keys(Keys.RETURN)
# 方法2:点击登录按钮
# login_button = driver.find_element_by_xpath("//button[@type='submit']")
# login_button.click()
print("已提交登录信息,等待页面加载...")
# 等待登录完成
time.sleep(5) # 根据网络情况调整
# 验证登录结果
current_url = driver.current_url
print("当前URL: " + current_url)
# 检查页面标题或特定元素
if "dashboard" in current_url.lower() or "home" in driver.title.lower():
print("登录成功!")
# 截屏保存结果
driver.save_screenshot("login_success.png")
else:
print("登录可能失败,检查截图")
driver.save_screenshot("login_failed.png")
# 获取登录后页面内容
page_source = driver.page_source
# 可添加对页面内容的检查
finally:
# 关闭浏览器
driver.quit()
print("浏览器已关闭")Firefox特有配置说明:
- 驱动设置:
使用geckodriver而不是ChromeDriver,这是要却别开的,这是很容易犯的一个低级错误。
确保路径正确:executable_path='
/usr/local/bin/geckodriver'
- 无头模式:
options = Options() options.add_argument('--headless')Firefox与Chrome定位方式相同
推荐使用XPath或CSS选择器:
# XPath示例
username = driver.find_element_by_xpath("//input[@placeholder='用户名']")
# CSS选择器示例
login_button = driver.find_element_by_css_selector("button.login-btn")常见问题解决方案:
- 浏览器版本兼容问题:
# 查看Firefox版本
firefox --version
# 下载对应版本的geckodriver
# 访问 https://github.com/mozilla/geckodriver/releases- 显式等待(推荐使用):
from selenium.webdriver.common.by
import By from selenium.webdriver.support.ui
import WebDriverWait from selenium.webdriver.support
import expected_conditions as EC
# 等待元素出现
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "welcome-message"))
)- 处理证书错误:
# 忽略SSL证书错误
options.accept_insecure_certs = True- 调整浏览器窗口大小:
driver.set_window_size(1280, 1024) # 避免响应式布局问题调试技巧:
- 首次运行时禁用无头模式:
# options.add_argument('--headless') # 注释此行- 添加详细日志:
# 启用浏览器日志
options.log.level = "trace"- 逐步执行:
# 在每个步骤后暂停
input("按Enter继续...")重要提示:
实际使用时替换URL、用户名/密码和元素定位器
测试前先手动访问目标网站,了解登录表单结构,也就是要阅读html的内容,找到相应的内容。
考虑网站可能有反爬措施(验证码、动态加载等),如果遇到,就需要更高级的技巧处理自动化了。