1.配置
selenium的配置,在cmd窗口下载指定的版本
pip install selenium==3.141.0
打开自己的chrome浏览器,右上方三个点找到帮助-关于Google Chrome-查看浏览器的版本,我已将浏览器更新至最新版本
在https://registry.npmmirror.com/binary.html?path=chromedriver/,找到对应版本的驱动,只要前面的大版本不错,最后面的小版本差不多就可以,如果上面网址没有找到你浏览器对应的版本,也可以在https://googlechromelabs.github.io/chrome-for-testing/查找,但是这个网址需要国外代理访问
将下载下来的zip文件解压,将解压好的1-2个文件chromedriver(有的版本解压是1个,有的版本解压是2个)放置你你电脑中python.exe的文件夹中,并且将chromedriver.exe也放至chrome.exe的文件夹中,大部分人的chrome在C:\Program Files\Google\Chrome\Application\,可以自行查看
注意:如果你使用的不是chrome浏览器,需要下载对应的浏览器驱动
- 导入相应模块,创建浏览器实例
# 导入模块
from selenium import webdriver
# 下载selenium3.141.0版本
driver = webdriver.chrome('C:\\Program Files\\Google\\Chrome\\Application\\chromedriver.exe')
driver.get('https://www.baidu.com')
# 注意,我使用的时Chrome浏览器
- 通过xpath查询html内容
input = driver.find_element_by_xpath('//input[@id="kw"]')
input
# 找到id=kw的input
- 通过id或者class查找html中符合需求的内容
input_html = driver.find_element_by_id('kw')
input_html
input_html = driver.find_element_by_class_name('kw')
input_html
- 向输入框中发送要查询的信息
input_html.send_keys('上海有几大区')
- 代码实现点击按钮,查询内容
button = driver.find_element_by_xpath('//input[@id="su"]')
# 点击按钮查询内容
button.click()
- 代码实现鼠标滑动操作页面
driver.execute_script(‘window.scrollBy(x,y)’),JavaScript实现滑动
# 三种滑动方式:
1.一次性滑动结束
driver.execute_script('window.scrollBy(0,500)')
# 线下滑动5000个像素
2.匀速滑动
import time
import random
for i in range(20):
# 每次向下滑动100像素,滑动一次睡眠0.1秒
driver.execute_script('window.scrollBy(0,100)')
time.sleep(0.1)
3.不定速滑动
for i in range(20):
height = random.randint(50,200)
# 每次滑动的距离由random随机生成
driver.execute_script(f'window.scrollBy(0.{height})')
time.sleep(random.uniform(0,1))
- 获取标签对象的文本和属性
xxx.text获取标签对象的文本
xxx.get_attribute(‘属性名称’),得到属性的值
li_name## 获取网页中id=2的a标签文本内容
id_tag = driver.find_elements_by_id("2")
id_tag
#需要注意的是,上面有find_elements获取的id_tag是一个list对象,其没有find_xxx方法,必须通过下标访问到其中之一,才能使用find_element方法。
## 在找到id_tag中的a标签
driver.find_element_by_id("2").find_elements_by_tag_name("a")[0].text
# xpath的写法
id_content = driver.find_element_by_xpath('//div[@id="2"]//a')
id_content
# 获取属性值
print(id_content.get_attribute('href'))
# 获取文本内容
print("\n")
print(id_content.text)
最大最小化窗口,以及其他窗口处理
driver.maximize_window() 最大化
driver.minimize_window() 最小化
driver.set_window_size(宽度,高度) 指定大小
driver.set_window_position(距离左边,距离上面) 设置位置driver.get_window_size() 获取大小
driver.get_window_position() 获取位置driver.close() 关闭当前窗口
driver.back() 后退
driver.fresh() 刷新页面
driver.quit() 退出浏览器窗口句柄与切换
每打开一个Tab标签页,就会多一个窗口句柄
除了点击,如何用代码打开一个新的标签页呢?
driver.execute_script(‘window.open(“url”)’)如何获取一个窗口句柄
driver.window_handles 返回list
list中就是所有的窗口句柄
窗口句柄默认还是停留在之前的窗口中,它不像我们实际操作,已经换到新界面了。代码操作需要用代码的方式进行切换窗口,才能用代码控制对应的窗口。
如果关闭了某个窗口,也需要切换到其他窗口才行切换窗口
driver.switch_to.window(具体的窗口句柄对象)
通过driver.window_handles[index]获取窗口
driver.execute_script('window.open("https://music.163.com/")')
# 切换到打开的第二个窗口
driver.switch_to.window(driver.window_handles[1])
# 尝试滚动页面
# 发现纹丝不动
driver.execute_script('window.scrollBy(0,500)')
网页框架与切换
网页内还有内嵌的网页,切换 iframe 层级
切换到iframe内才可以浏览 iframe内的内容driver.switch_to.frame( xxx ) xxx: iframe的id
或 iframe的name
或 find_element_by_yyy()得到的对象切回到原始层级: driver.switch_to.default_content()
# 进入网易云飙升榜
# 切换 iframe
driver.switch_to.frame('g_iframe')
# 就可以控制了。如滚动
driver.execute_script("window.scrollBy(0,600)")
driver.find_element_by_class_name('f-ff2').text
关闭窗口
driver.close()键盘事件
有时候需要一些键盘输入,比如,触发回车,数字等等
有时候xxx.click()会失效,因为窗口滑动的位置,不能点击到我们想要点击的事件
就可以用触发回车代替点击,需要导入键盘相关的类
最终依然用xxx.send_keys()
# 导入与键盘相关的类
from selenium.webdriver.common.keys import Keys
# 通过输入Keys.按Tab提示,看有哪些键盘
driver.get('http://www.baidu.com')
shuru = driver.find_element_by_id('kw')
shuru.send_keys(Keys.NUMPAD3)
shuru.send_keys(Keys.NUMPAD8)
shuru.send_keys(Keys.ENTER)
- 获取网页解析后的 页面代码, 字符串格式
driver.page_source
就可以 结合 正则 或者 bs4 转换与提取内容,速度比 纯 selenium提取快
- 完全退出浏览器¶
driver.quit()