本节介绍如何使用selenium模拟浏览器操作,从而轻松快速地可视化网站的“级别”。
关于Selenium
前面我说过selenium是一套自动化测试工具,但是可以用于爬虫。通过Selenium操控浏览器执行操作,我们可以发出与真人用户行为完全一致的动作(因为它本就来自于浏览器)。更重要的是,selenium操作浏览器的过程是可以被编程者看见的,这也就是为什么我会用selenium+chrome作为例子(不用PhantomJS就是因为没有界面不方便观察)。
启动webdriver
本文用chromedriver举例。
前面说过selenium通过使用与浏览器对应的webdriver来驱动浏览器访问网站,而简单的启动浏览器只需要以下几行:
from selenium import webdriver DRIVERPATH="c; driver=webdriver.Chrome(DRIVERPATH) driver.get(";)
其中DRIVERPATH即是你的webdriver的路径,如果你把它写进系统的PATH里也可以不带此参数。
运行代码后,你会看到chrome启动并注明“Chrome正在受到自动测试软件的控制”,然后chrome打开百度的首页,并在几秒之后关闭。
当然,我们还可以在driver.get之前提前设置一些其他参数(本例中的options参数设置仅适用于chromedriver):
-driver.implicitly_wait(second):设置driver在查找元素时,如果元素尚未被加载则等待second秒
-ChromeOptions类的设置:
options=webdriver.ChromeOptions() o("-headless") #使用无头模式(也就是无窗口运行) o('lang=z;) #设置语言与编码 o('user-agent="你要设定的UA"') #给driver设置UA,可以用来模拟手机端访问 dic={"profile.managed_default_content_settings.images": 2} o("prefs",dic) #设置driver不加载图片 o("--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 import By driver.find_elemen;#id") driver.find_elemen;tagname") driver.find_elemen;.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对象。设置完动作后如果想让其执行还要调用c()方法。(有些方法也能用WebElement调用,比如ele.click())
from import ActionChains chains=ActionChains() #selenium用于处理动作的类 c(ele) #点击此元素 c_and_hold(ele) #按住鼠标左键 c(ele) #点击鼠标右键 c(ele) #双击鼠标 c(from_ele,to_ele) #拖拽from_ele到to_ele c_by_offset(from_ele,xoffset,yoffset) #将from_ele拖拽到(xoffset,yoffset) c(xoffset,yoffset) #移动鼠标到(xoffset,yoffset) c(ele) #移动鼠标到元素ele c() #执行
模拟键盘操作
同上,Keys类的属性请自行寻找资料。
from import Keys c) #发送key到当前元素,其为Keys的类属性 c("string_to_send") #发送字符串到当前元素 #注意转义 c_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的值
1.《Python爬虫进阶(三):Selenium模拟浏览器操作》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《Python爬虫进阶(三):Selenium模拟浏览器操作》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/gl/3359684.html