html 仿手机 b站,appium+python实现手机自动化爬虫B站热门番剧

我把效果过程录下来了,速看!

我的手机大半夜地自己在B站看番剧!!!

其实,我利用了appium+python实现手机自动化爬虫B站热门番剧数据功能,具体操作如下:

一、搭建环境

1、搭建环境需要通过pip指令安装好client编程库+Appium Server+JDK(配置环境变量 JAVA_HOME)+SDK(配置环境变量 ANDROID_HOME)

2、环境准备好后,运行准备好的测试程序却报错如下:

7ab8d1413c14c5fc79ffe57604916bd1.png

运行结果说找不到我的adb程序,于是我检查了appium的环境设置,果然没有填写,于是修改后重新运行。

d05f60243e4e68d909898f7c23320675.png

3、再次运行后报错如下:说无法连接到我的手机

02f37d8a23459591b69920e6f1e0bd10.png

检查方法:查询是谁占用了端口

打开cmd命令窗口输入

netstat -ano | findstr “5037”

找出5037端口占用的应用,杀掉该应用进程

taskkill -f -pid 3116

f0fbad908ede4e1837ef28afe3804099.png

输入: adb devices -l 再次查看电脑是否连接到了手机

3800fd5fb4894237fd088e7c06fe0ebc.png

这时,电脑显示已经连接手机,我再次运行测试程序依然报错,找了半天原因不知错哪儿。最后发现原来是自己仗着以前开发过APP,手机已经处于开发者模式所以没有检查手机的“开发人员选项”,真是一个勾勾引发的血案,最简单、最容易被忽略的东西往往害人最深。

9fca73168ffc7d891aa0ae094a1ce6cd.png

二、查找appPackage和appActivity

1、当手机已安装b站时:

执行:adb shell dumpsys activity recents | find “intent={”

af19a6c3c8e8af0c3fefc063aedbf609.png

获取:appPackage=tv.danmaku.bili;appActivity=.ui.splash.SplashActivity

2、调试完成之后出现了点击搜索栏无法自动弹出键盘的情况:

控制台输入 adb uninstall io.appium.settings 即可恢复。

三、利用界面查看工具查找元素

1、点击start inspector session设置参数

4f104bc804ab1054c587cbf0c0f6ebd7.png

b84726580a25232e01f41246f76ecfbe.png

2、找到元素,跳转至番剧表单

4cf756d12d5e8d82672a9686b94c61be.png

3、滚动界面至找到元素“查看完整表单”,若没找到元素,继续滚动。

(1)滚动表单原理:由于每个手机的屏幕尺寸不同,所以先获取当前手机屏幕尺寸,再执行向下滑动的动作。(x1,y1)表示初始位置,(x1,y2)表示滑动的终止位置。

e37b3fa5b85ba1c986ec644c47c3138f.png

(2)在滑动过程中寻找“查看完整表单”元素:

注意!!!!此处千万不要把element写成了elements,因为写作driver.find_elements_by_id(‘navLL’)的话,target则是一个表单而不是变量。而表单target如果事先没有声明会无法运行,当try后面的内容无法运行时,是无论如何都是找不到‘navll’元素的,所以会一直重复执行向下滑动界面的指令。(因为多打了个s报错,我在这卡了半个小时。。。。。)

0306fcf780fb91e09091047a0df6cc48.png

4、获取榜单信息

1ccd283fc767bafe250ff29bb75ca2d3.png

33428cd26ecd246b05638da8b378f02b.png

四、小结

此程序为一个简单的app数据爬虫,获取b站app榜单数据。大家可以看到,其实滚动查询元素这个功能并不完善,可以再继续优化。因为对用UiSelector 这个类里面的方法实现元素定位不是很熟悉,所以爬虫结果是有重复的,不过能学好UIAutomator的话,通过父元素、子元素等七大姑八大姨亲戚来定位元素应该会很容易。

爬虫b站数据做下来的感觉就是,爬app中的元素比爬网页麻烦,且调试时候,手机反应速度挺慢的,难怪现在网页爬虫有那么多壁垒,而app爬虫限制就很少。

更新!!!

以上代码提到的问题已经优化,爬虫代码如下:

shows = [] for i in range(4): titles = driver.find_elements_by_class_name("android.view.View") for title in titles: printitle = title.text if printitle in shows: continue shows.append(printitle) print(printitle) _find_by_scroll()

通过新建列表+if语句查重去重,然后打印就ok啦。

本文地址:https://blog.csdn.net/yljwhat/article/details/107728255

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值