论如何让浏览器成精?首选selenium
selenium模块让Python直接控制浏览器,实际点击链接,填写登录信息
- 安装
pip install selenium
安装之后准备自动打开百度
from selenium import webdriver
browser=webdriver.Chrome()
type(browser)
browser.get('http://www.baidu.com')
运行之后发现程序报错,查了一下原来还需要在python安装路径下 放一个浏览器驱动才可以。。。
我太南了
少走弯路,附上谷歌浏览器的驱动链接
- 点.get()方法打开链接
from selenium import webdriver#导入模块
browser=webdriver.Chrome()#指定要打开的浏览器,生成的是一个WebDriver对象
browser.get('http://www.baidu.com')#get()方法打开链接
- 在页面中寻找元素
WebDriver对象有好几种方法用于在页面中寻找元素。
他们被分为find_element_*方法和find_elements_*方法
find_element_*方法:返回一个WebElement对象,代表页面中匹配查询的第一个元素
find_elements_*方法:返回一个WebElement_*对象的列表,包含页面中所有匹配的元素
selenium的WebDriver方法,用于寻找元素
方法名 | 返回的WebElement对象/列表 |
---|---|
browser.find_element_by_class_name(name) browser.find_elements_by_class_name(name) | 使用CSS类name的元素 |
browser.find_element_by_css_selector(selector) browser.find_elements_by_css_selector(selector) | 匹配CSS selector的元素 |
browser.find_element_by_class_id(id) browser.find_elements_by_class_id(id) | 匹配id属性值的元素 |
browser.find_element_by_link_text(text) browser.find_elements_by_link_text(text) | 完全匹配提供的text元素的<a>元素 |
browser.find_element_by_partial_link_text(text) browser.find_elements_by_partial_link_text(text) | 提供包含text的元素 |
browser.find_element_by_name(name) browser.find_elements_by_name(name) | 匹配name属性值的元素 |
browser.find_element_by_tag_name(name) browser.find_elements_by_tag_name(name) | 匹配标签name的元素 大小写无关,<a>元素匹配‘a’和’A’ |
除了最后一个其他的都是区分大小写
- 点击页面
find_element_*方法和find_elements_*方法返回的WebElement对象有一个click()方法,模拟鼠标在该元素上的点击
这里模拟自动点击b站的链接
import time
from selenium import webdriver
browser=webdriver.Chrome()
browser.get('https://www.bilibili.com/')#get主站
linkelem = browser.find_element_by_partial_link_text('动画')#找包含动画两个字的第一个元素
linkelem.click()#点击找到的动画元素
browser.get(browser.current_url)
linkelem2 = browser.find_element_by_partial_link_text('音乐')
time.sleep(3)#睡3秒
linkelem2.click()#点击音乐
browser.get(browser.current_url)#返回浏览器页面的当前链接url
linkelem3 = browser.find_element_by_partial_link_text('舞蹈')
time.sleep(3)#再睡三秒
linkelem3.click()#点击舞蹈
上面有用到current_url方法,是返回当前链接的意思,返回一个字符串
运行上面的码儿
嗯,好像很ok的样子,但是我错了…
有点多此一举
不用current_url方法照样也能用,前面就当纯粹地学了个知识点
import time
from selenium import webdriver
browser=webdriver.Chrome()
browser.get('https://www.bilibili.com/')
linkelem = browser.find_element_by_partial_link_text('动画')
linkelem.click()
linkelem2 = browser.find_element_by_partial_link_text('音乐')
time.sleep(3)
linkelem2.click()
linkelem3 = browser.find_element_by_partial_link_text('舞蹈')
time.sleep(3)
linkelem3.click()
brower这个变量本来就是跟着浏览器变的
没必要在返回当前url然后再get一遍
我好傻
- 填写并提交表单
向web页面的文本字段发送击键,只要找到该文本字段的<input>或<textarea>元素,然后调用send_key()方法
于是我要试试百度自动搜索,按F12看了一下搜索框的代码,id=kw
from selenium import webdriver
browser=webdriver.Chrome()
browser.get('https://www.baidu.com/')
searchurl=browser.find_element_by_id('kw')#定位输入款
searchurl.send_keys('python学习')#在输入框输入python学习
searchurl.submit()#提交表单
执行了一下没问题,但是当把同样的码放在b站就不行了,猜猜应该是这个搜索框默认有文字的原因
世界上最远的距离大概就是明明看到一个页面元素站在那里,但是我却定位不到!!/(ㄒoㄒ)/~~
仔细看了看b站搜索款的前端码,嗯…
小破站这里不应该用id呀,应该用class定位…就这我研究了半个小时,一万只草泥马狂奔而过
小破站的自动搜索应该这么写↓
from selenium import webdriver
browser=webdriver.Chrome()
browser.get('https://www.bilibili.com/')
searchurl=browser.find_element_by_class_name('nav-search-keyword')
searchurl.send_keys('专业团队')
searchurl.submit()
执行一下
在找解决方法的过程中还找到了另外一种高效查找元素的方法,虽然最后没用到
这个方法就是xpath定位,上面只讲了id 、class等
附一个讲的比较详细的链接,免得自己以后找不到
再补一课
史上最全30种selenium定位方法
- 发送特殊键
selenium有一个模块,针对不能用字符串值输入的键盘击键
这些保存在selenium.webdriver.common.keys模块的属性中
selenium.webdriver.common.keys常用的变量
属性 | 含义 |
---|---|
.DOWN;.UP;.RIGHT;.LEFT | 键盘箭头键 |
ENTER;.RETURN | 回车和换行键 |
.HOME;.END .PAGE_UP;PAGE_DOWN | home键,end键,pageup,pagedown键 |
其它啊 | 都是点+大写按键名称,TAB,F1-F12.ESC. |
- 点击浏览器按钮
browser.back() | 返回按钮 |
---|---|
browser.forward() | 前进按钮 |
browser.refresh() | 刷新按钮 |
browser.quit() | 退出按钮 |
总结:就是找页面的元素有点烦