目前学习到了selenium,看了一些介绍博客后,自己也动手实验了下,现做一些介绍,以后会利用此模块做写一个爬取动态页面的程序。
selenium常用的几个模块
from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By
1.webdriver 主要是用于打开浏览器,在python目录下需要下载相应浏览器版本的webdriver,我常用的浏览器是chrome,所以下载的是Chromedriver。需要注意的是,webdriver的版本需要与浏览器版本相对应,我出现过的多种错误都是来自于webdriver版本问题。
webdriver主要用于 打开浏览器 与 定位元素
browser = webdriver.Chrome() browser.get('https://www.taobao.com') input = browser.find_element_by_id('q') input.send_keys('watch')
第一行定义browser为chrome浏览器对象,第二行利用get方法打开淘宝网页,第三行是browser的定位方法find_element_by_id,这里定位的是淘宝首页的搜索框,最后在搜索框里输入“watch”。
browser的定位方法有很多,有通过id,class,css选择器,xpath等方法定位,这些定位方法在此篇博客里有详细介绍 https://www.cnblogs.com/qingchunjun/p/4208159.html
定位元素的id,class,css选择器,xpath等信息可以在网页的开发者模式里源码里寻找到,详细可参考这篇文章开头部分
http://blog.csdn.net/Qaz_wz/article/details/71038579?ref=myread
2.余下的三个模块通常联合使用。
WebDriverWait用来设置网页的 显式等待 方法,网页还有 强制等待 与隐式等待 两种方法,后两者无需该模块,三种等待方法在这篇文章里介绍得很详细:
http://blog.csdn.net/ping523/article/details/53419622
接下来我只详细介绍 显式等待 方法。通过一段代码来解释:
wait = WebDriverWait(browser, 10) try: input = wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, '#q')) ) search = wait.until( EC.element_to_be_clickable((By.XPATH, '//*[@id="J_TSearchForm"]/div[1]/button')) ) input.send_keys('手表') time.sleep(3) search.click() finally: browser.quit()
第一行定义了一个等待对象,其构造函数参数如下
WebDriverWait(driver, 超时时长, 调用频率, 忽略异常)
第一个为web对象。第二个是超时时间,即最多等待设置的时间,如果超出这么长的时间,即抛出TimeoutException异常。
第三个为检查频率,默认为0.5,通常不设置。第四个即忽略出现的异常,通常也不设置。
等待对象常用的有两个方法即until与not until,含义即为等待某个元素出现(或是其他状态) 和 等待某个元素消失(或是其他状态)
如上述代码的的3~5行,即等待淘宝首页的搜索框出现,又如6~8行,即等待淘宝首页的搜索按钮可点击,该种方法的返回对象即使webelement,所以input即为搜索框,search即为搜索按钮。
接下来详细解释一下until内的参数:
until内不能传入Webelement对象,即这么写是错误的
input = wait.until( browser.find_element_by_css_selector('#q') # 错误 )
传入的对象必须是有_call_方法的,通常是利用selenium模块里的expected_condition模块,一般 别名(as)为EC,EC里有多种方法,判断webelement是否存在、是否能点击等等。。。上述文章内有多各种方法的介绍,通常使用的就是 判断存在 与 按钮判断是否可点击,即代码里写的两种方法。
这些方法的的参数通常利用By模块来定位。方法的参数是一个 元组,(参数1,参数2)
参数1位定位的方法,是class还是id,还是xpath等;参数2 为确定的值.
如上述代码的第4行,利用CSS选择器来定位,值为‘#q’
如代码的第7行,利用Xpath来定位,值为 ‘//*[@id="J_TSearchForm"]/div[1]/button’
最后对不同的的Webelement有不同的方法,常用的输入文字,点击按钮等,常用的几种的方法在此篇文章里可查:
https://www.cnblogs.com/jinshengshun/p/6683290.html
若用较冷门的方法,在需要使用时再去其他地方查找