什么是Selenium
Selenium是一个自动化测试工具,对各种浏览器都能很好地支持,包括Chrome、Firefox这些主流浏览器。使用它就可以模拟浏览器进行各种各样的操作,包括爬取一些网页内容。当你看到浏览器自己运行并且在网页上翻页或者跳转的时候,应该会觉得很有趣的。
安装selenium先安装好Selenium库和对应浏览器的WebDriver驱动,比如我用的是Chrome,则相对应安装的是ChromeDriver。
1.安装selenium # 打开命令控制符执行 pip install selenium
2.我的Google Chrome 已是最新版本版本 74.0.3729.108(正式版本) (64 位)
安装三大浏览器驱动driver
1.chromedriver 下载地址:http://chromedriver.storage.googleapis.com/index.html?path=74.0.3729.6/
2.Firefox的驱动geckodriver 下载地址:https://github.com/mozilla/geckodriver/releases/
3.IE的驱动IEdriver 下载地址:http://www.nuget.org/packages/Selenium.WebDriver.IEDriver/
注意:64位向下兼容,直接下载32位的就可以啦,亲测可用。chromedriver_win32.zip
D:PythonpythonScripts
.粘贴chromedriver.exe到文件d:Python37Scripts路径下。
如果Chrome问题闪退 ,不兼容问题!
为什么要使用selenium?
selenium是一个自动测试工具,它可以帮我通过代码去实现驱动浏览器自动执行相应的操作。所以我们也可以用它来做爬虫。主要使用selenium的目的是为了跳过登录验证。
Python的selenium爬虫的简单使用过程记录
0.预先准备
~首先下载谷歌浏览器,然后点击设置选项那里的帮助—关于Google Chrome,点进去看浏览器的版本号,或者在谷歌浏览器输入chrome://version/ 进行查看;
~然后下载驱动,驱动地址:http://chromedriver.storage.googleapis.com/index.html
~将驱动chromedriver.exe所在的文件夹的路径添加到电脑的环境变量中,或者直接放在py文件运行的目录下
1.导入selenium 库
1 | from selenium import webdriver |
2.设置参数
1 2 3 | chrome_options = webdriver.ChromeOptions() chrome_options.add_experimental_option( 'prefs' , { 'profile.default_content_setting_values' : { 'images' : 2 , }}) # 设置浏览器无图片模式 chrome_options.add_argument(f '--proxy-server=200.200.200.52:8888' ) #设置代理ip,这个是我随便写的ip |
3.实例化
1 | chrome = webdriver.Chrome(options = chrome_options) # 创建selenium实例化 |
4.输入网址
1 |
5.定位元素
1 2 3 4 | chrome.find_element_by_xpath( '//*[@id="kw"]' ) #定位好元素,主要是却定要做什么,这一步可以不要 chrome.find_element_by_xpath( '//*[@id="kw"]' ) .send_keys( '白某人' ) #send_keys 主要是用来在输入框输入内容 chrome.find_element_by_link_text( '百度一下' ).click() # click 方法是点击 #定位元素的方法有很多,但是要注意点的是find_element 后面有没有s,有s的话是返回一个列表的 |
6.关闭浏览器
1 | chrome.close() |
常用API
初始化WebDriver
首先,我们需要创建一个WebDriver实例,它是与浏览器进行交互的主要接口。
1 2 | from selenium import webdriver driver = webdriver.Chrome( '/path/to/chromedriver' ) # 若已设置环境变量,可省略路径 |
打开和关闭网页
1 2 3 | print (driver.title) # 获取网页标题 driver.quit() # 关闭浏览器并退出WebDriver会话 |
查找元素
在网页中查找元素是自动化过程的基础。
1 2 3 4 5 | from selenium.webdriver.common.by import By element_by_id = driver.find_element(By. ID , 'some-id' ) element_by_name = driver.find_element(By.NAME, 'some-name' ) element_by_xpath = driver.find_element(By.XPATH, '//div[@class="some-class"]' ) element_by_css = driver.find_element(By.CSS_SELECTOR, 'div.some-class' ) |
与元素进行交互
找到元素后,我们可以与它进行各种交互,如点击、输入文本等。
1 2 3 4 5 6 7 8 | # 输入文本 search_box = driver.find_element(By.NAME, 'q' ) search_box.send_keys( 'Selenium' ) # 点击按钮 search_button = driver.find_element(By.NAME, 'btnK' ) search_button.click() # 清空文本框 search_box.clear() |
等待元素
Web自动化中,等待某个条件的成立是常见需求,以确保元素已加载。
1 2 3 4 5 6 7 8 | 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 , 'some-id' )) ) # 隐式等待 driver.implicitly_wait( 10 ) # 设置全局等待时间 |
处理下拉菜单
下拉菜单是表单常见元素,Selenium提供了Select类来处理它们。
1 2 3 4 5 6 | from selenium.webdriver.support.ui import Select select_element = driver.find_element(By. ID , 'dropdown' ) select_object = Select(select_element) select_object.select_by_index( 1 ) # 通过索引选择 select_object.select_by_value( 'value' ) # 通过value属性选择 select_object.select_by_visible_text( 'Text' ) # 通过可见文本选择 |
执行JavaScript
有时直接使用JavaScript执行操作是必要的。
1 | driver.execute_script( 'window.scrollTo(0, document.body.scrollHeight);' ) # 滚动到底部 |
处理Alerts、Frames和Windows
Selenium可以处理JavaScript弹窗、iFrames和新窗口。
1 2 3 4 5 6 7 8 9 10 | # 处理Alert弹窗 alert = driver.switch_to.alert alert_text = alert.text alert.accept() # 点击'OK' # 切换到iFrame driver.switch_to.frame( 'frameName' ) # 切换回主文档 driver.switch_to.default_content() # 切换窗口 driver.switch_to.window(driver.window_handles[ 1 ]) |
获取属性和CSS属性
有时我们需要获取元素的属性或者CSS属性。
1 2 | attr_value = element.get_attribute( 'href' ) css_value = element.value_of_css_property( 'color' ) |
利用Selenium进行自动登录
以下是一个利用Selenium进行自动登录的例子。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys driver = webdriver.Chrome( '/path/to/chromedriver' ) # 填写用户名和密码 username = driver.find_element(By. ID , 'username' ) password = driver.find_element(By. ID , 'password' ) username.send_keys( 'your_username' ) password.send_keys( 'your_password' ) # 点击登录 login_button = driver.find_element(By. ID , 'submit' ) login_button.click() # 等待登录成功的页面元素加载 wait = WebDriverWait(driver, 10 ) logged_in_element = wait.until(EC.presence_of_element_located((By. ID , 'logged-in-message' ))) print ( '登录成功!' ) # 执行后续的自动化操作... # 关闭浏览器 driver.quit() |
在这个例子中,我们自动化了登录过程,包括填写认证信息和提交表单,然后等待登录成功消息的出现。
总结
Selenium是Python爬虫和自动化测试领域的强大工具。本篇博客中我们介绍了Selenium的常用API,这些API能帮助你模拟几乎所有的浏览器操作,从而使你能够构建出功能强大的自动化脚本。掌握这些API是提高爬虫效率和应对复杂页面的关键。