赞
踩
目录
这一节我们来讲解使用selenium来模拟浏览器操作进而方便快捷可视化地冲破网站的“关卡”。
前面我说过selenium是一套自动化测试工具,但是可以用于爬虫。通过Selenium操控浏览器执行操作,我们可以发出与真人用户行为完全一致的动作(因为它本就来自于浏览器)。更重要的是,selenium操作浏览器的过程是可以被编程者看见的,这也就是为什么我会用selenium+chrome作为例子(不用PhantomJS就是因为没有界面不方便观察)。
本文用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就可以了
假设你已经对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")
- 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的值
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。