目录
这一节我们来讲解使用selenium来模拟浏览器操作进而方便快捷可视化地冲破网站的“关卡”。
关于Selenium
前面我说过selenium是一套自动化测试工具,但是可以用于爬虫。通过Selenium操控浏览器执行操作,我们可以发出与真人用户行为完全一致的动作(因为它本就来自于浏览器)。更重要的是,selenium操作浏览器的过程是可以被编程者看见的,这也就是为什么我会用selenium+chrome作为例子(不用PhantomJS就是因为没有界面不方便观察)。
启动webdriver
本文用chromedriver举例。
前面说过selenium通过使用与浏览器对应的webdriver来驱动浏览器访问网站,而简单地启动浏览器只需要以下几行:
from selenium import webdriver
DRIVERPATH="chromedriver.exe"
driver=webdriver.Chrome(DRIVERPATH)
driver.get("http://www.baidu.com")
其中DRIVERPATH即是你的webdriver的路径,如果你把它写进系统的PATH里也可以不带此参数。
运行代码后,你会看到chrome启动并注明“Chrome正在受到自动测试软件的控制”,然后chrome打开百度的首页,并在几秒之后关闭。
当然,我们还可以在driver.get之前提前设置一些其他参数(本例中的options参数设置仅适用于chromedriver):
-driver.implicitly_wait(second):设置driver在查找元素时,如果元素尚未被加载则等待second秒
-ChromeOptions类的设置:
options=webdriver.ChromeOptions()
options.add_argument("-headless") #使用无头模式(也就是无窗口运行)
options.add_argument('lang=zh_CN.UTF-8') #设置语言与编码
options.add_argument('user-agent="你要设定的UA"') #给driver设置UA,可以用来模拟手机端访问
dic={"profile.managed_default_content_settings.images": 2}
options.add_experimental_option("prefs",dic) #设置driver不加载图片
options.add_argument("--proxy-server="+"代理服务器地址:端口") #添加代理IP
#如果是需要带帐号密码验证的代理服务器 需要用chrome的插件解决(据说firefox的driver可以直接带参)
driver=webdriver.Chrome(DRIVERPATH,options=options)#一切设置完之后,只要在启动driver时带上options就可以了
selenium查找元素
假设你已经对html有所了解,我们就不介绍了。
driver.find_element_by_class_name("class_name") #根据类名查找元素
driver.find_element_by_id("id") #根据id查找元素
driver.find_element_by_tag_name("tagname") #根据标签名查找元素
driver.find_element_by_xpath("xpath") #根据xpath查找元素
driver.find_element_by_css_selector("css") #根据css属性定位查找元素(写过前端推荐用这个)
driver.find_element_by_link_text("link_name") #定位文本为link_name的超链接标签(全匹配)
driver.find_element_by_partial_link_text("part_link_name") #同上,但是是部分匹配
在函数名中的element后加上一个s,会返回所有符合条件的元素的列表。
另外,还有一种查找元素的方式如下(并不是完全的例子,其他By的属性请自行学习):
from selenium.webdriver.common.by import By
driver.find_element(By.ID,"#id")
driver.find_element(By.TAG_NAME,"tagname")
driver.find_element(By.CLASS_NAME,".class")
selenium模拟用户行为
执行JS
driver.execute_script("JSscript"[,seleniumElement...]) #定义
driver.execute_script("JSscript") #最基础的用法,只要把要执行的JS填进去就行了
driver.execute_script("JSscript_arguments[0]...",seleniumElement...) #进阶用法,省去使用JS选择元素的麻烦之处。传入一系列Ele并在JS中使用argument[n]表示
#在需要Element时,你可以用selenium选择元素,然后放在后面,在JS脚本里用argument[n]表示(n为你传入的元素序号)
模拟滚动条滚动
在selenium中我们通过执行js脚本来模拟滚动。
driver.execute_script("window.scrollTo(x,y)") #其x为向右滚动的像素数,y为向下滚动的像素数(两者为负则向反方向滚动)#确定距离的滚动
driver.execute_script("ele.scrollIntoView()") #滚动到ele元素出现在视窗内 #确定目标的滚动
模拟鼠标操作
模拟鼠标操作要用到selenium的ActionChains对象。设置完动作后如果想让其执行还要调用chains.perform()方法。(有些方法也能用WebElement调用,比如ele.click())
from selenium.webdriver.common.action_chains import ActionChains
chains=ActionChains(driver) #selenium用于处理动作的类
chains.click(ele) #点击此元素
chains.click_and_hold(ele) #按住鼠标左键
chains.content_click(ele) #点击鼠标右键
chains.double_click(ele) #双击鼠标
chains.drag_and_drop(from_ele,to_ele) #拖拽from_ele到to_ele
chains.drag_and_drop_by_offset(from_ele,xoffset,yoffset) #将from_ele拖拽到(xoffset,yoffset)
chains.move_by_offset(xoffset,yoffset) #移动鼠标到(xoffset,yoffset)
chains.move_to_element(ele) #移动鼠标到元素ele
chains.perform() #执行
模拟键盘操作
同上,Keys类的属性请自行寻找资料。
from selenium.webdriver.common.keys import Keys
chains.send_keys(Keys.key) #发送key到当前元素,其为Keys的类属性
chains.send_keys("string_to_send") #发送字符串到当前元素 #注意转义
chains.send_keys_to_element(ele,Keys.key) #发送key到el
其他常用函数
ele.submit() #提交此元素
ele.text #此元素的文本
driver.close() #关闭此窗口
driver.quit() #退出驱动 记得调用,不然chrome会撑到让你电脑死机
ele.value_of_css_property("proName") #获取元素css属性proName的值
ele. get_attribute("attrName") #获取元素属性attrName的值