Python中Selenium库使用教程详解
selenium介绍
selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器
中文参考文档
官网
环境安装
下载安装selenium
pipinstallselenium-ihttps://mirrors.aliyun.com/pypi/simple/
谷歌浏览器驱动程序下载地址:
http://chromedriver.storage.googleapis.com/index.html
使用示例
fromseleniumimportwebdriver fromtimeimportsleep #实例化一款浏览器 bor=webdriver.Chrome(executable_path='chromedriver.exe') #对指定的url发起请求 bor.get('https://www.jd.com/') sleep(1) #进行标签定位 search_input=bor.find_element_by_id('key') #向搜索框中录入关键词 search_input.send_keys("macpro") #点击搜索按钮 btn=bor.find_element_by_xpath('//*[@id="search"]/div/div[2]/button') btn.click() sleep(2) #执行js,让滚轮向下滚动 bor.execute_script('window.scrollTo(0,document.body.scrollHeight)') sleep(2) page_text=bor.page_source print(page_text) bor.quit()
浏览器创建
Selenium支持非常多的浏览器,如Chrome、Firefox、Edge等,还有Android、BlackBerry等手机端的浏览器。另外,也支持无界面浏览器PhantomJS。
fromseleniumimportwebdriver browser=webdriver.Chrome() browser=webdriver.Firefox() browser=webdriver.Edge() browser=webdriver.PhantomJS() browser=webdriver.Safari()
元素定位
webdriver提供了一系列的元素定位方法,常用的有以下几种:
定位一个元素 | 定位多个元素 | 含义 |
---|---|---|
find_element_by_id | find_elements_by_id | 通过元素id定位 |
find_element_by_name | find_elements_by_name | 通过元素name定位 |
find_element_by_xpath | find_elements_by_xpath | 通过xpath表达式定位 |
find_element_by_link_text | find_elements_by_link_tex | 通过完整超链接定位 |
find_element_by_partial_link_text | find_elements_by_partial_link_text | 通过部分链接定位 |
find_element_by_tag_name | find_elements_by_tag_name | 通过标签定位 |
find_element_by_class_name | find_elements_by_class_name | 通过类名进行定位 |
find_elements_by_css_selector | find_elements_by_css_selector | 通过css选择器进行定位 |
注意:
1、find_element_by_xxx找的是第一个符合条件的标签,find_elements_by_xxx找的是所有符合条件的标签。
2、根据ID、CSS选择器和XPath获取,它们返回的结果完全一致。
3、另外,Selenium还提供了通用方法find_element(),它需要传入两个参数:查找方式By和值。实际上,它就是find_element_by_id()这种方法的通用函数版本,比如find_element_by_id(id)就等价于find_element(By.ID,id),二者得到的结果完全一致。
实例演示
假如有一个web页面,通过前端工具查看到一个元素的属性是这样的。
通过id定位:
dr.find_element_by_id("kw")
通过name定位:
dr.find_element_by_name("wd")
通过classname定位:
dr.find_element_by_class_name("s_ipt")
通过tagname定位:
dr.find_element_by_tag_name("input")
通过xpath定位,xpath定位有N种写法,这里列几个常用写法:
dr.find_element_by_xpath("//*[@]") dr.find_element_by_xpath("//*[@name='wd']") dr.find_element_by_xpath("//input[@]") dr.find_element_by_xpath("/html/body/form/span/input") dr.find_element_by_xpath("//span[@]/input") dr.find_element_by_xpath("//form[@]/span/input") dr.find_element_by_xpath("//input[@and@name='wd']")
通过css定位,css定位有N种写法,这里列几个常用写法:
dr.find_element_by_css_selector("#kw") dr.find_element_by_css_selector("[name=wd]") dr.find_element_by_css_selector(".s_ipt") dr.find_element_by_css_selector("html>body>form>span>input") dr.find_element_by_css_selector("span.soutu-btn>input#kw") dr.find_element_by_css_selector("form#form>span>input")
假如页面上有如下一组文本链接
新闻 hao123
通过linktext定位:
dr.find_element_by_link_text("新闻") dr.find_element_by_link_text("hao123")
通过partiallinktext定位:
dr.find_element_by_partial_link_text("新") dr.find_element_by_partial_link_text("hao") dr.find_element_by_partial_link_text("123")
控制浏览器
常用的控制浏览器操作的一些方法
方法 | 说明 |
---|---|
set_window_size() | 设置浏览器的大小 |
back() | 控制浏览器后退 |
forward() | 控制浏览器前进 |
refresh() | 刷新当前页面 |
clear() | 清除文本 |
send_keys(value) | 模拟按键输入 |
click() | 单击元素 |
submit() | 用于提交表单 |
get_attribute(name) | 获取元素属性值 |
is_displayed() | 设置该元素是否用户可见 |
size | 返回元素的尺寸 |
text | 获取元素的文本 |