本文作者:戴 雯,中南财经政法大学金融学院
本文编辑:杨婉清
技术总编:王子一
Stata&Python云端课程来啦!
哐哐哐,我又带着我的小妙招来啦~

之前的推文中我们介绍了selenium模拟键盘功能键的操作,具体见《偷懒小妙招|selenium之玩转鼠标键盘操作(上)》,那selenium又是如何模拟鼠标的呢?
鼠标事件
selenium除了用click()模拟鼠标单击操作外,还提供了双击、右击、悬停、拖动等操作,使用这些需要另外引入ActionChains类,代码如下:
from selenium.webdriver.common.action_chains import ActionChains
除了最基本的click()以外,鼠标事件主要分为以下几类:
| 函数形式 | 操作含义 |
| context_click() | 右击 |
| double_click() | 双击 |
| move_to_element() | 鼠标悬停 |
| drag_and_drop_by_offs | 拖拽到某个坐标 |
下面小编会结合具体的例子,一一为大家讲解每个鼠标事件的用法。
1.context_click() 右击
什么情况下我们会用到鼠标右击呢?百度网盘 是个很典型的例子。
from selenium import webdriverfrom selenium.webdriver.common.action_chains import ActionChainsimport time#打开Chrome浏览器CHROME_DRIVER = 'D:/python/Driver/chromedriver.exe'driver = webdriver.Chrome(executable_path=CHROME_DRIVER)#打开网盘页面driver.get("https://pan.baidu.com/")time.sleep(20)#忽略网盘的登录步骤...#通过link_text定位到要右击的元素上element = driver.find_element_by_link_text('python')#调用ActionChains(),右击元素,执行操作ActionChains(driver).context_click(element).perform()

2.double_click()双击
模拟鼠标双击的操作和右击类似,同样需要导入ActionChains类,下面以百度搜索 为例,模拟双击 百度一下 按钮,代码如下:
from selenium import webdriverfrom selenium.webdriver.common.action_chains import ActionChains#打开Chrome浏览器CHROME_DRIVER = 'D:/python/Driver/chromedriver.exe'driver = webdriver.Chrome(executable_path=CHROME_DRIVER)#打开百度页面driver.get("https://www.baidu.com")#通过id属性定位,定位到百度一下按钮element= driver.find_element_by_id("su")#调用ActionChains(),双击,执行操作ActionChains(driver).double_click(element).perform()
3.move_to_element() 鼠标悬停
在很多网页中都会出现这样一种情况,当鼠标悬停在某一级菜单上时,才会显示出二级菜单。这一行为给爬虫带来了一定的阻碍。以华为商城https://www.vmall.com/为例,当鼠标悬停在 智能穿戴&VR 时,才能显示出其下的二级菜单内容,这时我们怎么用selenium模拟鼠标悬停呢?

运用move_to_element() 函数,可以打印出华为商城所有一级二级的菜单名称。
from selenium import webdriverfrom selenium.webdriver.common.action_chains import ActionChainsimport timeCHROME_DRIVER = 'D:/python/Driver/chromedriver.exe'driver = webdriver.Chrome(executable_path=CHROME_DRIVER)driver.get('https://www.vmall.com/')# 设置隐式等待driver.implicitly_wait(10)# 定位到所有的一级菜单liSli = driver.find_elements_by_xpath('//ol[@class="category-list"]/li')# 遍历(每一个一级菜单)for li in liSli:print('一级菜单:',li.text)# 鼠标悬停到每一个一级菜单的位置ActionChains(driver).move_to_element(li).perform()# 找到一级菜单里面的所有二级菜单,并打印secondSli = li.find_elements_by_xpath('./div[2]//span')time.sleep(1)for second in secondSli:print('\t',second.text)
运行效果及部分结果如下:


4.drag_and_drop_by_offset() 拖拽到某个坐标
如果需要进行解锁,我们用到的是drag_and_drop_by_offset() 函数。拖动滑块在具体的爬虫应用中还需要结合其他的因素,这里选择了一个简单的demo(https://www.helloweba.net/demo/2017/unlock)来为大家展示。下图中需要将滑块按照箭头所指方向拖动到指定位置。首先,需要定位到滑块;其次,需要找到滑块移动的长度,给予滑块一个大于或等于该长度的数值,便可完成拖动。

定位到滑块推动轨道后,可以看到该拖动距离为298px,因此给定的移动距离大于或等于298px,便可完成此次拖动。

具体代码如下:
from selenium import webdriverfrom selenium.webdriver.common.action_chains import ActionChainsimport timeCHROME_DRIVER = 'D:/python/Driver/chromedriver.exe'driver = webdriver.Chrome(executable_path=CHROME_DRIVER)driver.get("https://www.helloweba.net/demo/2017/unlock/")#拖拽滑块1element1=driver.find_element_by_xpath("//div[@class='bar1 bar']/div[@class='slide-to-unlock-handle']")ActionChains(driver).drag_and_drop_by_offset(element1,298,0).perform()time.sleep(3)#拖拽滑块2element2=driver.find_element_by_xpath("//div[@class='bar2 bar']/div[@class='slide-to-unlock-handle']")ActionChains(driver).drag_and_drop_by_offset(element2,200,0).perform()
程序运行效果如下:

selenium模拟鼠标键盘操作是爬虫的重要方法,可以应对部分网站反爬带来的困扰。本文的程序重在讲解模拟鼠标的操作,并不是一个完成的爬虫程序,部分程序不具备现实意义,大家还需活学活用,适当应变, 感兴趣的小伙伴赶快动手试试吧~
最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。


对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
大家用Stata来“找茬”
雪球网关注度监测:关注人数Top10的证券原来是这些!你持有的股票上榜了吗?
Python与百度地图合璧,绘制棒呆的热力地图
【数据可视化】统计图绘制神器:Seaborn
【爬虫实战】双一流大学的月关注度
【爬虫实战】“中国人不吃这一套”——人民日报微博评论分析
“学术明星”——双重差分法(DID)的Stata操作
【爬虫实战】南京地铁又上热榜——客流量分析
Stata中字符串的处理
我在哪里?调用高德API获取地址经纬度信息
超级简单的条件函数,轻松生成虚拟变量
Python云端课程福利大放送!0基础也能学~
【爬虫实战】“我们,继续新故事”——爬取LOL英雄皮肤
“人像动漫化”—Python实现抖音特效
《唐探3》做错了什么?|来自150万字影评的证据
爬虫俱乐部年度总结|《请回答2020》
模糊匹配我只用这一招!
关于我们
微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

