Python爬虫进阶(三):Selenium模拟浏览器操作

目录

关于Selenium

启动webdriver

selenium查找元素

selenium模拟用户行为

执行JS

模拟滚动条滚动

模拟鼠标操作

模拟键盘操作

其他常用函数


这一节我们来讲解使用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的值

  • 4
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值