当网页由javascript生成且不包含ajax接口请求的时候,需要使用模拟浏览器运行的方式来爬取需要的数据。
一、安装与准备
selenium本身使用pip安装即可,除此之外还需要安装浏览器及驱动。我自己安装了chrome和firefox。
chrome对应的驱动为ChromeDriver,firefox对应的驱动为GeckoDriver。分别百度下载即可。(我下的都是最新的,历史版本需要注意版本对应)
二、基本使用
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.baidu.com') #这里网址一定要加http:// 不然会报错
driver.close()
这样就可以模拟浏览器打开并跳转到百度页面了。
如果使用的是其他的浏览器,对应使用以下方式进行初始化
driver = webdriver.Firefox()
driver = webdriver.Edge()
driver = webdriver.PhantomJS()
三、查找节点
selenium可以驱动浏览器完成各种操作,比如填充表单、模拟点击等。在完成这些操作时,先要找到节点。
获取节点的方式如下
find_element_by_id
find_element_by_name
find_element_by_xpath
find_element_by_line_text
find_element_by_partial_line_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector
如果查找的目标在网页里不止一个,可以使用find_elements方法就可以找到所有的节点了,返回的是一个节点列表
除了直接使用以上方法,还可以使用
from selenium.webdriver.common.by import By
driver.find_element(By.ID,'username')
这个方式与find_element_by_name得到的结果一致
四、节点交互
比较常见的操作有输入文字时的send_keys(),清空输入框的clear()方法,点击按钮的click()方法。以下为一个简单的淘宝搜索示例。
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.taobao.com')
input = driver.find_element_by_id('q').send_keys('hottoys灭霸手套')
button = driver.find_element_by_class_name('btn_search').click()
注:使用find_element_by_class_name的方法时,只接收一个参数,淘宝实例中的搜索按钮代码为
<button class="btn-search tb-bg" type="submit" data-spm-click="gostr=/tbindex;locaid=d13">搜索</button>
如果用全部类名的话会报错。
五、动作链
例如鼠标拖拽,最常用的例子就是滑动验证码了。在此做个简单的例子。
选用了runoob上的一个拖动示例,网址为
http://www.runoob.com/try/try.php?filename=jqueryui-example-droppable
from selenium import webdriver
url = 'http://www.runoob.com/try/try.php?filename=jqueryui-example-droppable'
driver = webdriver.Chrome()
driver.get(url)
driver.swich_to.frame('iframeResult')
source = driver.find_element_by_css_selector('#draggable')
target = driver.find_element_by_css_selector('#droppable')
actions = webdriver.ActionChains(driver)
actions.drap_and_drop(source, target)
actions.perform()
六、获取节点信息
selenium也可以用相关的方法和属性来提取节点信息。
获取属性 get_attribute()
获取文本值
input = driver.find_element_by_class_name('')
print(input.id)
print(input.location)
print(input.tag_name)
print(input.size)
七、前进和后退
浏览器有前进和后退功能,使用selenium模拟也可以完成这些操作。
driver.back() #后退
driver.forward() #前进
以上就是selenium常用的一些操作。具体到项目中需要进行组合搭配。