基本用法
使用Selenium
我们需要将浏览器渠道添加到环境变量或者绝对路径,前者可以初始化后者需要进行指定。
这里用的是Firefox浏览器,可以用Google chrome来执行
1 2 3 4 5 6 7 8 9 10 11 12 13
| from selenium import webdriver
browser = webdriver.Chrome()
path = r'D:\drivers\chromedriver\chromedriver.exe' browser = webdriver.Firefox(path)
time.sleep(5)
browser.close()
|
这样我们看到的是运行成功的的标志,这里我们可以启动为无界面的浏览器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| from selenium import webdriver import time
option = webdriver.ChromeOptions() option.add_argument("headless") browser = webdriver.Firefox()
browser.get(r'https://www.baidu.com/')
browser.get_screenshot_as_file('截图.png')
time.sleep(5)
browser.close()
|
浏览器对象初始化完成后将其赋值给了browser
对象,下面我们可以调用browser
来执行各种方法来模拟浏览器的操作了。
访问页面
进行访问页面使用的是get
方法,传入参数为访问页面的url
的地址就可以了,这里我用百度的网址举例。
1 2 3 4 5 6 7 8 9 10 11 12
| from selenium import webdriver import time
browser = webdriver.Firefox()
browser.get(r'https://www.baidu.com/')
time.sleep(5)
browser.close()
|
设置浏览器大小
set_window_size()
方法可以用来设置浏览器大小(就是屏幕的分辨率),其中maximize_window
设置的是全屏浏览。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| from selenium import webdriver import time
browser = webdriver.Firefox()
browser.maximize_window() browser.get(r'https://www.baidu.com')
time.sleep(2)
browser.set_window_size(500,500)
time.sleep(2)
browser.set_window_size(1000,800)
time.sleep(2)
browser.close()
|
动态图太麻烦,你们自己运行看效果
刷新页面
刷新页面是我们经常使用在浏览器的操作,页面也是这样用,这里可以用refresh()
方法来实现进行浏览器页面刷新。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| from selenium import webdriver import time
browser = webdriver.Firefox()
browser.maximize_window() browser.get(r'https://www.baidu.com') time.sleep(2)
try: browser.refresh() print('刷新成功') except Exception as e: print('刷新失败')
browser.close()
|
同理,动态图太麻烦,自行运行看效果。
前进后退
前进后退也是我们访问页面时非常常见的操作,这里我们用forward()
方法可以实现前进,back()
可以用来实现后退。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| from selenium import webdriver import time
browser = webdriver.Firefox()
browser.maximize_window() browser.get(r'https://www.baidu.com')
time.sleep(5)
browser.get(r'https://www.taobao.com')
browser.back()
time.sleep(2)
browser.forward()
time.sleep(2)
browser.close()
|
获取页面基础属性
我们在使用selenium
打开某个浏览器页面时,我们会获取一些基础属性如网页标题、网址、浏览器名称、页面源码等信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| import time
from selenium import webdriver
browser = webdriver.Firefox() browser.get(r'https://www.baidu.com')
print(browser.title)
print(browser.current_url)
print(browser.name)
print(browser.page_source)
time.sleep(5)
browser.quit()
|
效果如下:
我们需要注意的是,这里的页面源码用的是正则表达式
、Bs4
、xpath
以及pyquery
等工具进行解析提取想要的信息了。
页面元素定位
我们在实际使用浏览器的时候,很重要的操作有输入文本,点击确定等元素操作,Selenium
提供了一系列的方法来方便实现以上的操作,常见的有8
种操作定位元素的操作方式,我们来一一演示一下。
我们以百度首页的搜索框节点操作为例子,搜索python
搜索框的html
结构:
1
| <input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">
|
id定位
find_element_by_id()
根据id
属性获取,这里id
属性是kw
,我们用以下的代码实现浏览器搜索操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| from selenium import webdriver import time
browser = webdriver.Firefox()
browser.get(r'https://www.baidu.com')
time.sleep(2)
browser.find_element_by_id('kw').send_keys('python')
time.sleep(2)
browser.close()
|
class 定位
find_element_by_class_name()
根据class
属性获取,这里class
属性是s_ipt
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| from selenium import webdriver import time
browser = webdriver.Chrome()
browser.get(r'https://www.baidu.com')
time.sleep(2)
browser.find_element_by_class_name('s_ipt').send_keys('python')
time.sleep(2)
browser.close()
|
tag 定位
我们学过HTML
的都知道HTML
是用tag
来定义功能的,比如input
是输入,table
是表格等,每个元素其实就是一个tag
,一个tag
往往用来定义一类功能,我们查看百度首页HTML
代码,可以看到很多tag
,所以其实很难去区分不同的元素(这个方式很不适用)。
1
| find_element_by_tag_name()
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| from selenium import webdriver import time
browser = webdriver.Firefox()
browser.get(r'https://www.baidu.com')
time.sleep(2)
browser.find_element_by_tag_name('input').send_keys('python')
time.sleep(2)
browser.close()
|
使用HTML
的很容易报错,基本上不怎么用HTML
方式来定位。
link 定位
这个方式顾名思义就是用定位网络链接的,比如百度首页上方的分类模块链接。
1
| find_element_by_link_text()
|
以贴吧为例
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| from selenium import webdriver import time
browser = webdriver.Chrome()
browser.get(r'https://www.baidu.com') time.sleep(2)
browser.find_element_by_link_text('贴吧').click() time.sleep(2)
browser.quit()
|
partial 定位
有时候有的超链接的文本很长,我们如果全部输入,是很麻烦的,又显得代码很不美观,这个时候我们就可以截取一部分字符串,用这种方法进行模糊匹配。
1
| find_element_by_partial_link_text()
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| from selenium import webdriver import time
browser = webdriver.Firefox()
browser.get(r'https://www.baidu.com') time.sleep(2)
browser.find_element_by_partial_link_text('闻').click() time.sleep(2)
browser.quit()
|
xpath 定位
前面介绍的几种定位方式都是在理想的状态才可以使用的,有一定的限制,那就是:在当前页面中,每个元素都是唯一性的id
、name
、class
或超文本链接
的属性,那么我们就可以用这个唯一性来定位它们。
但是在实际工作中并非由怎么美好的方式,那么这个时候我们只能通过xpath
(推荐)或者css
来定位了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| from selenium import webdriver import time
browser = webdriver.Firefox()
browser.get(r'https://www.baidu.com') time.sleep(2)
browser.find_element_by_xpath("//*[@id='kw']").send_keys('python') time.sleep(2)
browser.close()
|
css 定位
这个方法相对xpath
要简洁一些,定位速度也要快一些。
1
| find_element_by_css_selector()
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| from selenium import webdriver import time
browser = webdriver.Firefox()
browser.get(r'https://www.baidu.com') time.sleep(2)
browser.find_element_by_css_selector('#kw').send_keys('python') time.sleep(2)
browser.close() from selenium.webdriver.common.by import By from selenium.webdriver.common.by import By
|
find_element的By定位
除了上述的8
种定位方法,Selenium
还提供了一个通用的方法find_element()
,这个方法有两个参数:定位方式和定位值。
使用前先导入By类from selenium.webdriver.common.by import By
以上的操作可以等于以下的操作:
1 2 3 4 5 6 7 8
| browser.find_element(By.ID,'kw') browser.find_element(By.NAME,'wd') browser.find_element(By.CLASS_NAME,'s_ipt') browser.find_element(By.TAG_NAME,'input') browser.find_element(By.LINK_TEXT,'贴吧') browser.find_element(By.PARTIAL_LINK_TEXT,'贴吧') browser.find_element(By.XPATH,'//*[@id="kw"]') browser.find_element(By.CSS_SELECTOR,'#kw')
|
多个元素
如果我们定位的目标元素不止一个,那么则需要用到find_elements
,得到的结果会是以列表形式。简单的说,就是element
后面多了复数s
,其它的操作一致。
获取页面元素属性
get_attribute获取属性
既然我们有很多方式来定位页面的元素,那么接下来就可考虑获取以下元素的属性了,尤其是用Selenium
进行网络爬虫的时候。
以百度首页的logo为例,获取logo相关属性
1
| <img hidefocus="true" id="s_lg_img" class="index-logo-src" src="//www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png" width="270" height="129" onerror="this.src='//www.baidu.com/img/flexible/logo/pc/index.png';this.onerror=null;" usemap="#mp">
|
获取logo的图片地址
1 2 3 4 5 6 7 8 9 10 11 12 13
| from selenium import webdriver import time
browser = webdriver.Firefox()
browser.get(r'https://www.baidu.com')
logo = browser.find_element_by_class_name('index-logo-src') print(logo) print(logo.get_attribute('src'))
browser.close()
|
输出结果:
1 2
| <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="3da58d3e-aa4d-4643-9a34-f34ed443f0f8", element="94b84f87-3dca-4891-bc67-e1103fdad33e")> https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png
|
获取文本
以热榜为例,获取文本和链接
1
| <a class="title-content tag-width c-link c-font-medium c-line-clamp1" href="https://www.baidu.com/s?cl=3&tn=baidutop10&fr=top1000&wd=%E5%90%84%E5%9C%B0%E8%B4%AF%E5%BD%BB%E5%8D%81%E4%B9%9D%E5%B1%8A%E5%85%AD%E4%B8%AD%E5%85%A8%E4%BC%9A%E7%B2%BE%E7%A5%9E%E7%BA%AA%E5%AE%9E&rsv_idx=2&rsv_dl=fyb_n_homepage&sa=fyb_n_homepage&hisfilter=1" target="_blank"><span class="title-content-index c-index-single c-index-single-hot1">1</span><span class="title-content-title">各地贯彻十九届六中全会精神纪实</span></a>
|
获取热榜的文本,用的是text
属性,直接调用即可。
1 2 3 4 5 6 7 8 9 10 11 12 13
| from selenium import webdriver import time
browser = webdriver.Firefox()
browser.get(r'https://www.baidu.com')
logo = browser.find_element_by_css_selector('#hotsearch-content-wrapper > li:nth-child(1) > a') print(logo.text) print(logo.get_attribute('href'))
browser.close()
|
输出结果:
1 2
| 1各地贯彻十九届六中全会精神纪实 https://www.baidu.com/s?cl=3&tn=baidutop10&fr=top1000&wd=%E5%90%84%E5%9C%B0%E8%B4%AF%E5%BD%BB%E5%8D%81%E4%B9%9D%E5%B1%8A%E5%85%AD%E4%B8%AD%E5%85%A8%E4%BC%9A%E7%B2%BE%E7%A5%9E%E7%BA%AA%E5%AE%9E&rsv_idx=2&rsv_dl=fyb_n_homepage&sa=fyb_n_homepage&hisfilter=1
|
获取其他属性
除了属性和文本值外,还有id、位置、标签名和大小等属性。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| from selenium import webdriver import time
browser = webdriver.Firefox()
browser.get(r'https://www.baidu.com')
logo = browser.find_element_by_class_name('index-logo-src') print(logo.id) print(logo.location) print(logo.tag_name) print(logo.size)
browser.close()
|
输出结果:
1 2 3 4
| 6af39c9b-70e8-4033-8a74-7201ae09d540 {'x': 490, 'y': 46} img {'height': 129, 'width': 270}
|
页面交互操作
页面交互就是在浏览器的各种操作,比如上面演示过的输入文本,点击链接等等,还有像清除文本、回车确认,单选框与多选框中等。
输入文本
上面有同样的操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| from selenium import webdriver import time
browser = webdriver.Firefox() browser.get(r'https://www.baidu.com') time.sleep(2)
input = browser.find_element_by_class_name('s_ipt')
input.send_keys('python') time.sleep(2)
browser.close()
|
点击
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| from selenium import webdriver import time
browser = webdriver.Firefox() browser.get(r'https://www.baidu.com') time.sleep(2)
click = browser.find_element_by_link_text('新闻')
click.click() time.sleep(2)
browser.quit()
|
清除文本
既然有输入,就有清除的操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| from selenium import webdriver import time
browser = webdriver.Firefox() browser.get(r'https://www.baidu.com') time.sleep(2)
input = browser.find_element_by_class_name('s_ipt')
input.send_keys('python') time.sleep(2)
input.clear() time.sleep(2)
browser.close()
|
回车确认
如我们在搜索框输入文本python
,然后回车就可以查询操作结果的情况
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| from selenium import webdriver import time
browser = webdriver.Firefox() browser.get(r'https://www.baidu.com') time.sleep(2)
input = browser.find_element_by_class_name('s_ipt')
input.send_keys('python') time.sleep(2)
input.submit() time.sleep(5)
browser.close()
|
单选
我们先定位需要的元素,然后点击一下就可以了(再定位一个元素在后面加上.send_keys
)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| from selenium import webdriver import time
browser = webdriver.Firefox()
browser.get(r'https://www.baidu.com') time.sleep(2)
browser.find_element_by_xpath("//*[@id='kw']").send_keys('python') browser.find_element_by_xpath('//*[@id="su"]').click() time.sleep(2)
browser.close()
|
多选
这里我们需要导入from selenium.webdriver.support.ui import Select
1 2 3 4 5 6 7
| select.select_by_visible_text()
select.select_by_value()
select.select_by_index()
|
下拉框
同样需要Select
模块
先导入类
1
| from selenium.webdriver.support.select import Select
|
在select
模块中有以下定位方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
select_by_index() select_by_value() select_by_visible_text()
voptions all_selected_options first_selected_options
deselect_all deselect_by_index deselect_by_value deselect_by_visible_text
|
我们进行一波操作,暂时找不到合适的网页,我们就用一个简单的本地网页进行测试(这里我们用html文件进行测试)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| <html> <body> <form> <select name="ceshi"> <option value="小明" selected="">小明</option> <option value="小华">小华</option> <option value="小草">小草</option> </select> </form> </body> </html>
然后,再演示下拉框的不同选择方式
```python from selenium import webdriver from selenium.webdriver.support.select import Select import time
url = 'file:///C:/Users/Gdc/Desktop/ceshi.html'
browser = webdriver.Firefox()
browser.get(url) time.sleep(2)
# 根据索引选择 Select(browser.find_element_by_name("ceshi")).select_by_index("2") time.sleep(2) # 根据value值选择 Select(browser.find_element_by_name("ceshi")).select_by_value("小草") time.sleep(2) # 根据文本值选择 Select(browser.find_element_by_name("ceshi")).select_by_visible_text("小明") time.sleep(2)
# 关闭浏览器 browser.close()
|
多窗口切换
比如同一个页面的不同子页面的节点元素获取操作,不同选项卡之间的切换以及不同浏览器窗口之间的切换操作等等。