爬虫你还在用selenium吗,out了!试用DrissionPage
selenium太难记了,试试DrissionPage是否更人性化一些
先说一下安装试用的3个坑
坑1.我把脚本名叫DrissionPage.py 运行时提示循环引用错误,
不能用DrissionPage这个名称作为脚本名(这个坑是自己挖的:-;)。
坑2.我默认华为云时,pip install DrissionPage 找不到,提示404
改为害人的腾讯:
pip install -i https://mirrors.cloud.tencent.com/pypi/simple DrissionPage
安装成功,然后可选:pip install DrissionPage --upgrade
坑3.chrome无法正常打开网页
我参考官方(https://g1879.gitee.io/drissionpagedocs/)入门指南 准备工作 中的 第2种办法:在项目目录下打开cmd命令行窗口,运行:
dp -p “D:\你的Chrome所 在 目 录\chrome.exe”
执行官方基本概念中的示例脚本:
from DrissionPage import ChromiumPage # 创建页面对象 page = ChromiumPage() # 控制浏览器访问百度 page.get('https://www.baidu.com') # 使用页面对象访问 # 定位输入框并输入关键字 page.ele('#kw').input('DrissionPage') # 点击“百度一下”按钮 page.ele('@value=百度一下').click()
成功,但是打开的浏览器无法手工关闭,可以通过任务管理器来结束,或者在代码最后加上一句 page.quit()。
坑4:在登录状态下,用任务管理器结束掉chrome以后, 下次运行代码时竟然仍保持着登录状态!
其实这也是好事,可将登录代码与登录后操作的代码分开执行,在调试阶段就不用总去登录了。
坑5:用鼠标点某个页面链接无反应。其实这不是DrissionPage 的问题(后面升级4.0后这个坑就没有复现了),
事实上通过DrissionPage 我才对那个网页有了更深的认识,
具体是这样的:
该网页上有href,当鼠标移动在href文字上时,才会执行js在href右边显示一张图片。
当用selenium时,直接click这个href,就会执行相应的js并在新标签页中打开链接
而用DrissionPage ,click这个href无效,这时:
手工操作的办法是:
用鼠标移动到href上,再用鼠标点击href右边的图片
用代码:
直接用类似ele2 = ele1.ele('xpath://span/img')查找到那个href旁边img,然后ele2.run_js('this.click();'),就可以有点击的效果。
总之:写代码的体验比用selenium好,尤其是有详细的官方中文文档。
更多用法参考官方文档 https://g1879.gitee.io/drissionpagedocs/
补充:
虽然是中国人出品的东东,但用type竟然不能输入中文,看了gitee上作者在17天前刚增加了input, 可用以下代码更新为开发版本:
pip install "git+https://gitee.com/g1879/DownloadKit.git@dev" pip install "git+https://gitee.com/g1879/DrissionPage.git@dev"
现在可以用input输入中文了,但是代码有些变化,比如:ActionChains 变成了 Actions 具体参考4.0版本:https://g1879.gitee.io/drissionpagedocs/whatsnew/4_0/#_12
或者用官方升级4.0的命令
pip install DrissionPage==4.0.0b26
另外针对4.0版本代码无法正常启动浏览器的问题,要修改Python安装目录下的Lib\site-packages\DrissionPage\_configs\configs.ini 中的 browser_path 为本机的chrome.exe全路径
看来这玩意还在新鲜出炉当中。但是用起来已经比selenium要爽很多了。
比如,用以下代码代替以前的selenium的,代码更简单,速度、可靠性、稳定性还好很多
from DrissionPage import ChromiumPage page = ChromiumPage() page.get('http://192.168.1.9') # 访问网站 page.actions.move_to('#loginid').click().type('你的username')#动作链太爽 page.actions.move_to('#userpassword').click().type('你的password') page.actions.move_to('#submit').click() page.actions.move_to('@title=事宜').click() while page.wait.ele_displayed('流程'):#根据文字判断元素出现了 page.actions.move_to('流程').click()#js会打开新tab标签页 tab = page.wait.new_tab()#等待新tab打开也很爽 tab = page.get_tab(0)#取得新tab标签页 tab.wait.ele_displayed('意见') #这里不判断的话会出错 tab.actions.move_to('意见').click().input("已签到")#根本感觉不到这是在iframe里,也太爽 tab.wait.ele_displayed('tag:button@@class:ant-btn ant-btn-primary') tab.actions.move_to('@@type=button@@class:ant-btn ant-btn-primary').click()#js会自动关闭这个标签页,然后继续循环