selenium的使用
声明浏览器对象
Selenium支持非常多的浏览器,如Chrome、Firefox、Edge等,还有Android、BlackBerry等手机端的浏览器。此外,我们可以用如下方式进行初始化:
from selenium import webdriver browser = webdriver.Chrome() browser = webdriver.Firefox() browser = webdriver.Edge() browser = webdriver.Safari()
这样就完成了浏览器对象的初始化并将其赋值为 browser 对象。接下来,我们要做的就是调用 browser 对象,让其执行各个动作以模拟浏览器操作。
访问页面
我们可以用 get 方法来请求网页,只需要把参数传入链接 URL 即可。比如,这里用 get 方法访问淘宝,然后打印出源代码,代码如下:
from selenium import webdriver browser = webdriver.Chrome() browser.get('https://www.taobao.com') print(browser.page_source) browser.close()
运行后会弹出 Chrome 浏览器并且自动访问淘宝,然后控制台会输出淘宝页面的源代码,随后浏览器关闭。
通过这几行简单的代码,我们就可以驱动浏览器并获取网页源码,非常便捷。
定位网页元素
1、find_element_by_id # 通过id属性定位 2、find_element_by_link_text # 通过a标签文本信息定位(完整) 3、find_element_by_partial_link_text # 通过a标签文本信息定位(部分文本) 4、find_element_by_tag_name # 根据标签名字找 5、find_element_by_class_name # 根据类名字找 6、find_element_by_name # name='xx' 根据name属性进行定位 7、find_element_by_css_selector # css选择器找 8、find_element_by_xpath # xpath选择器找
# 强调:
# 1、上述均可以改写成find_element(By.ID,'kw')的形式
# 2、find_elements_by_xxx的形式是查找到多个元素,结果为列表
#===============示范用法=================== # 1、find_element_by_id print(driver.find_element_by_id('kw')) # 2、find_element_by_link_text # login=driver.find_element_by_link_text('登录') # login.click() # 3、find_element_by_partial_link_text login=driver.find_elements_by_partial_link_text('录')[0] login.click() # 4、find_element_by_tag_name print(driver.find_element_by_tag_name('a')) # 5、find_element_by_class_name button=wait.until(EC.element_to_be_clickable((By.CLASS_NAME,'tang-pass-footerBarULogin'))) button.click() # 6、find_element_by_name input_user=wait.until(EC.presence_of_element_located((By.NAME,'userName'))) input_pwd=wait.until(EC.presence_of_element_located((By.NAME,'password'))) commit=wait.until(EC.element_to_be_clickable((By.ID,'TANGRAM__PSP_10__submit'))) input_user.send_keys('18611453110') input_pwd.send_keys('xxxxxx') commit.click() # 7、find_element_by_css_selector driver.find_element_by_css_selector('#kw') # 8、find_element_by_xpath ```
元素交互操作
-
元素名称.send_keys(value) 输入内容
-
元素名称.clear() 清空
用于有些输入的地方有默认值
-
元素名称.click() 点击
主要用于按钮元素
-
元素名称.submit() 提交
-
按回车提交
案例:通过selenium用百度搜索“美女”关键字
from selenium import webdriver import time bro=webdriver.Chrome() bro.get("https://www.baidu.com" input_search=bro.find_element_by_xpath('//*[@id="kw"]') # 输入查找内容 input_search.send_keys("美女") # 查找搜索按钮 enter=bro.find_element_by_id('su') # 点击按钮 enter.click() time.sleep(5) # 关闭浏览器 bro.close())
获取元素内容
- 元素名称.text: 获取文本 (****重点)
- 元素名称.get_attribute(attribute):获取元素内属性 (****重点)
attribute为标签属性
- 元素名称.id :获取元素标签
- 元素名称.location:获取元素名称
- 元素名称.tag_name:获取元素标签名称
- 元素名称.size:获取元素大小
隐式等待
implicitly_wait(隐式等待)
-
隐式等待实际是设置了一个最长等待时间10秒
-
如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间结束,然后执行下一步。超出设定时间后,则抛出找不到节点的异常。
- 只有控件没有加载出来才会等,控件一旦加载出来,直接就取到
#隐式等待,失败概率高,可不用 browser.implicitly_wait(10) #在10秒内,如果网页全部加载完成(包含js),则执行下一步,否则一直等到10秒结束后,在执行下一步
案例:
from selenium import webdriver import time bro=webdriver.Chrome() bro.get("https://www.baidu.com") bro.implicitly_wait(10) # 设置隐式等待 submit_button=bro.find_element_by_link_text('登录') submit_button.click() user_button=bro.find_element_by_id('TANGRAM__PSP_10__footerULoginBtn') user_button.click() user_input=bro.find_element_by_id('TANGRAM__PSP_10__userName') user_input.send_keys("[email protected]") pwd_input=bro.find_element_by_id('TANGRAM__PSP_10__password') pwd_input.send_keys("123456") submit_input=bro.find_element_by_id('TANGRAM__PSP_10__submit') submit_input.click() time.sleep(5) bro.close()
获取cookie
使用 Selenium,还可以方便地对 Cookies 进行操作,例如获取、添加、删除 Cookies 等
from selenium import webdriver browser = webdriver.Chrome() browser.get('https://www.zhihu.com/explore') print(browser.get_cookies()) browser.add_cookie({'name': 'name', 'domain': 'www.zhihu.com', 'value': 'germey'}) print(browser.get_cookies()) browser.delete_all_cookies() print(browser.get_cookies()) #搭建cookie池和代理池的作用是什么?封ip ,封账号(弄一堆小号,一堆cookie)
首先,我们访问知乎,加载完成后,浏览器实际上已经生成 Cookies 了。接着,调用 get_cookies 方法获取所有的 Cookies。然后,我们再添加一个 Cookie,这里传入一个字典,有 name、domain 和 value 等内容。接下来,再次获取所有的 Cookies,可以发现,结果会多出这一项新加的 Cookie。最后,调用 delete_all_cookies 方法删除所有的 Cookies。再重新获取,发现结果就为空了。
无界面浏览器(驱动谷歌,驱动其他浏览器)
from selenium import webdriver from selenium.webdriver.chrome.options import Options chrome_options = Options() chrome_options.add_argument('window-size=1920x3000') #指定浏览器分辨率 chrome_options.add_argument('--disable-gpu') #谷歌文档提到需要加上这个属性来规避bug chrome_options.add_argument('--hide-scrollbars') #隐藏滚动条, 应对一些特殊页面 chrome_options.add_argument('blink-settings=imagesEnabled=false') #不加载图片, 提升速度 chrome_options.add_argument('--headless') #浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败 bro=webdriver.Chrome(options=chrome_options) bro.get("https://www.baidu.com") print(bro.get_cookies()) bro.close()
前进后退
平常我们使用浏览器时都有前进和后退功能,Selenium 也可以完成这个操作,它使用 back 方法后退,使用 forward 方法前进。示例如下:
import time from selenium import webdriver browser = webdriver.Chrome() browser.get('https://www.baidu.com/') browser.get('https://www.taobao.com/') browser.get('https://www.zhihu.com/') browser.back() time.sleep(1) browser.forward() browser.close()
执行js
Selenium API 并没有提供实现某些操作的方法,比如,下拉进度条。但它可以直接模拟运行 JavaScript,此时使用 execute_script 方法即可实现,代码如下:
from selenium import webdriver browser = webdriver.Chrome() browser.get('https://www.zhihu.com/explore') browser.execute_script('window.scrollTo(0, document.body.scrollHeight)') browser.execute_script('alert("To Bottom")')
这里利用 execute_script 方法将进度条下拉到最底部,然后弹出 alert 提示框。
有了这个方法,基本上 API 没有提供的所有功能都可以用执行 JavaScript 的方式来实现了。
选项卡管理
在访问网页的时候,我们通常会开启多个选项卡。在 Selenium 中,我们也可以对选项卡进行操作。示例如下:
import time from selenium import webdriver browser=webdriver.Chrome() browser.get('https://www.baidu.com') browser.execute_script('window.open()') print(browser.window_handles) #获取所有的选项卡 browser.switch_to_window(browser.window_handles[1]) #[1]表示跳转到第几个选项卡 browser.get('https://www.taobao.com') time.sleep(2) browser.switch_to_window(browser.window_handles[0]) browser.get('https://www.sina.com.cn') browser.close()
异常处理
在使用 Selenium 的过程中,难免会遇到一些异常,例如超时、节点未找到等错误,一旦出现此类错误,程序便不会继续运行了。这里我们可以使用 try except 语句来捕获各种异常。
from selenium import webdriver from selenium.common.exceptions import TimeoutException,NoSuchElementException,NoSuchFrameException try: browser = webdriver.Chrome() browser.get('http://www.baidu.com') browser.find_element_by_id("xxx") except Exception as e: print(e) finally: browser.close()
动作链
from selenium.webdriver import ActionChains # 1 生成一个动作练对象 action=ActionChains(bro) # 2 点击并夯住某个控件 action.click_and_hold(div) # 3 移动方式(三种方式) # action.move_by_offset(x, y) # 通过坐标偏移 # action.move_to_element(x, y) # 到另一个标签 # action.move_to_element_with_offset(x, y) # 到另一个标签,再偏移一部分 # 4 真正移动 action.perform() # 5 释放控件(松开鼠标) action.release()