Python网络爬虫——Appuim+夜神模拟器爬取得到APP课程数据
一、背景介绍
随着生产力和经济社会的发展,温饱问题基本解决,人们开始追求更高层次的精神文明,开始愿意为知识和内容付费。从2016年开始,内容付费渐渐成为时尚。 罗辑思维创始人罗振宇全力打造“得到APP”就是这样一款优质的可以听音频、学通识课程、看电子书、看直播、记笔记的知识付费平台,得到汇聚罗振宇、薛兆丰、梁宁、万维钢、吴军、香帅、宁向东等各个领域的专家学者的精品课程,致力于服务所有终身学习者。
也许你会感到奇怪,得到就是这样一款只有APP而没有网页版的产品,所以传统的网页爬取对于爬取得到数据只能是望洋兴叹了。本文用于爬取得到APP的课程数据,包括课程名称、作者、单价、学习人数等数据,可作为一个爬取APP数据的demo进行分享。
二、APP爬取思路和方案选择
2.1 思路一
通过抓包软件对APP进行抓包分析, 这种方式可以看到 App 在运行过程中发生的所有请求和响应。得知接口之后可以通过设置合适的请求头和各种参数来发送HTTP或者HTTPS请求接口,接口返回的数据就是想要数据了。
这种方式一旦实现,基本上算是一劳永逸的,除非接口和返回数据定义发生变化。但是如果一些动态参数设置不对,访问接口则不能得到任何数据,换句话说,只要无法破解参数,这条路就是死路一条。
2.2 思路二
通过自动化测试工具模拟手工操作APP进行数据的爬取。通过向自动化测试工具(例如Appium)发送操作指令,驱动设备完成点击、输入、滑动等各种操作,分析页面数据完成数据爬取。
这种方式相比于方式一而言,并不会受限于请求头和动态参数,只要是人工可以操作的,自动化测试工具都可以帮助我们进行完成,而所有的APP的所有功能所有页面用户都可以进行操作,意味着APP内所有的数据都可以拿到。
2.3 方案选择
本人在尝试使用方式一的过程中,抓包分析接口之后发现有些动态参数无法搞定,故放弃该方式。采用方式二进行爬取。
三、准备工作
3.1 Python环境的搭建
下载Python安装包:官方下载地址
安装:注意勾选“Add Python 3.8 to PATH”
3.2 Android SDK安装和环境变量配置
下载Android Studio进行安装Android SDK:下载地址
默认安装或者选择路径进行安装即可
环境变量的配置:
变量名称:ANDROID_HOME
变量值:SDK安装路径
在Path变量下面添加:%ANDROID_SDK_HOME%\platform-tools
在Path变量下面添加:%ANDROID_SDK_HOME%\tools
3.3 夜神模拟器安装和得到APP安装
夜神模拟器下载:夜神模拟器
夜神模拟器安装:默认安装即可。
得到APP下载:得到APP下载
将下载的apk安装包拖动到夜神模拟器中进行安装。
3.4 Appium安装
Appium下载地址: Appium下载
安装:默认安装到C盘即可。
配置环境变量:
变量名称:APPIUM_HOME
变量值:Appium安装路径(eg:C:\Program Files\Appium)
在Path变量下面添加:%APPIUM_HOME%
四、爬取核心
4.1 Appium启动APP
使用Appium启动APP时需要配置参数:platformName、deviceName、appPackage、appActivity。配置完成之后Appium会自动查找手机上面的包名和入口类,然后将其启动。
platformName:平台名称,本文使用的是安卓平台,填写Android。
deviceName:设备名称。
appPackage:APP程序包。
appActivity:程序入口。
- 获取appPackage和appActivity的方法:
最简单有效的方法为使用命令行获取。使用Appium客户端连接到APP,将APP打开到需要获取appActivity的页面,执行下面命令:
adb shell
dumpsys activity | grep mFocusedActivity

代码如下:
def __init__(self):
print("init")
self.desired_caps = {
"platformName": "Android",
"deviceName": "127.0.0.1:62001",
'platformVersion': '5.1',
"appPackage": "com.luojilab.player",
"appActivity": "com.luojilab.business.HomeTabActivity", # 主页
"noReset": True
}
self.driver = webdriver.Remote(DRIVER_SERVER, self.desired_caps)
self.wait = WebDriverWait(self.driver, TIMEOUT)
这段代码的作用是使用Appium启动得到APP并进入主页。如图:

4.2 点击“课程”按钮进入课程页
本文目的是爬取课程的数据,所以需要点击课程进入课程页。人的操作是这样的的,首先在课程页面找到课程按钮,然后点击。程序的操作也是一样的:首先要定位到“课程”这个按钮,然后进行点击。
使用Appium定位元素

点击选中左边“课程”按钮,可以看到这个元素的源代码,通过xpath定位:
course = self.driver.find_element_by_xpath("//android.widget.TextView[@text='课程']") # 课程
Appium可以进行点击的操作。点击课程按钮的代码如下:course.click()
4.3 定义课程数据类
课程页面如图所示:

从课程页面可以看到,一门课程展现出来的数据有:课程名称、课程摘要、作者姓名和头衔、单价以及销量。
从面向对象的思想来说,课程就是一个对象,这个对象有如下属性:课程名称、课程摘要、作者姓名和头衔、单价以及销量。用代码表示就是这样的:
class CourseData(object):
def __init__(self, course_name, summary, lecturer_name_and_title, price, subscribe_num):
super().__init__()
self.course_name = course_name
self.summary = summary
self.lecturer_name_and_title = lecturer_name_and_title
self.price = price
self.subscribe_num = subscribe_num
4.4 获取所有课程数据
通过Appium分析页面的源代码,可以很容易解析得到课程的各种数据。

代码如下:
course_names = temp.find_element_by_id('com.luojilab.player:id/column_name') #课程名称
summaries = temp.find_element_by_id('com.luojilab.player:id/summary') # 摘要
lecturer_name_and_titles = temp.find_element_by_id(
'com.luojilab.player:id/tv_name_and_title') # 讲师
prices = temp.find_element_by_id('com.luojilab.player:id/price') #价格
subscribe_nums = temp.find_element_by_id('com.luojilab.player:id/tv_subscribe_num') # 价格
当获取完一屏的数据,需要向上滑动继续获取数据。
Appium滑动API说明:
方法:swipe(int start x,int start y,int end x,int y,duration)
参数说明:
int start x:开始滑动的x坐标;
int start y:开始滑动的y坐标 ;
int end x:结束点x坐标;
int end y:结束点y坐标;
duration:滑动时间。
本文是从屏幕下部滑动到屏幕上部,滑动时间为2000ms。具体代码为:
self.driver.swipe(FLICK_START_X, FLICK_START_Y, FLICK_START_X,
FLICK_START_Y + FLICK_DISTANCE,
2000)
当无法滑动的时候,数据就获取完成了。
4.5 课程数据写入Excel
数据获取完成之后需要进行存储。Python中有专门操作Excel的库:openpyxl。本文使用openpyxl将爬取到的数据写入Excel进行保存。核心代码如下:
# 定义数据输出的Excel
try:
wb = openpyxl.load_workbook(PATH)
except:
wb = openpyxl.Workbook()
# wb = openpyxl.Workbook()
sheet_name = time.strftime("%F")
sheet = wb.create_sheet(sheet_name)
row = ["学院", "课程名称", "课程摘要", "主讲人", "单价", "销量", "销售金额"]
sheet.append(row)
...
wb.save(PATH)
五、总结
本文使用Appium和夜神模拟器在Windows平台上面实现得到课程数据的爬取。这里给出GitHub代码供大家学习,程序适用于最新版得到APP的课程数据爬取,如遇到APP版本升级等特殊情况,程序也需要进行升级维护。
Python网络爬虫——Appuim+夜神模拟器爬取得到APP课程数据的更多相关文章
- python网络爬虫第三弹(<爬取get请求的页面数据>)
一.urllib库 urllib是python自带的一个用于爬虫的库,其主要作用就是通过代码模拟浏览器发送请求,其常被用到的子模块在 python3中的为urllib.request 和 urllib ...
- python网络爬虫(7)爬取静态数据详解
目的 爬取http://seputu.com/数据并存储csv文件 导入库 lxml用于解析解析网页HTML等源码,提取数据.一些参考:https://www.cnblogs.com/zhangxin ...
- 初识python 之 爬虫:使用正则表达式爬取“古诗文”网页数据
通过requests.re(正则表达式) 爬取"古诗文"网页数据. 详细代码如下: #!/user/bin env python # author:Simple-Sir # tim ...
- python + 爬虫 + fiddler + 夜神模拟器 爬取app(1)
抓包 抓包是爬虫里面经常用到的一个词,完整的应该叫做抓取数据请求响应包 ,而Fiddler这款工具就是干这个的 普通https抓包设置 打开Fiddler ------> Options .然后 ...
- Python网络爬虫入门实战(爬取最近7天的天气以及最高/最低气温)
_ 前言 本文文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: Bo_wen 最近两天学习了一下python,并自己写了一个 ...
- Python网络爬虫(6)--爬取淘宝模特图片
经过前面的一些基础学习,我们大致知道了如何爬取并解析一个网页中的信息,这里我们来做一个更有意思的事情,爬取MM图片并保存.网址为https://mm.taobao.com/json/request_t ...
- python 网络爬虫(一)爬取天涯论坛评论
我是一个大二的学生,也是刚接触python,接触了爬虫感觉爬虫很有趣就爬了爬天涯论坛,中途碰到了很多问题,就想把这些问题分享出来, 都是些简单的问题,希望大佬们以宽容的眼光来看一个小菜鸟
- python网络爬虫(6)爬取数据静态
爬取静态数据并存储json import requests import chardet from bs4 import BeautifulSoup import json user_agent='M ...
- 初识python 之 爬虫:使用正则表达式爬取“糗事百科 - 文字版”网页数据
初识python 之 爬虫:使用正则表达式爬取"古诗文"网页数据 的兄弟篇. 详细代码如下: #!/user/bin env python # author:Simple-Sir ...
随机推荐
- 关于瀑布流的布局原理分析(纯CSS瀑布流与JS瀑布流)
瀑布流 又称瀑布流式布局,是比较流行的一种网站页面布局方式.即多行等宽元素排列,后面的元素依次添加到其后,等宽不等高,根据图片原比例缩放直至宽度达到我们的要求,依次按照规则放入指定位置. 为什么使用瀑 ...
- 『嗨威说』算法设计与分析 - STL中Sort函数的实现原理初探
本文索引目录: 一.对Sort算法实现的个人阅读体会 二.Sort算法使用的三个排序算法的优点介绍 2.1 插入排序的优缺点 2.2 堆排序的优缺点 2.3 快速排序的优缺点 2.4 新的结合排序—— ...
- 重学JavaScript之面向对象的程序设计(继承)
1. 继承 ES 中只支持实现继承,而且其实现继承主要依靠原型链来实现的. 2. 原型链 ES中 描述了 原型链的概念,并将原型链作为实现继承的主要方法.其基本思想是利用原型让一个引用类型继承另一个引 ...
- android字母索引实现ListView定位
最近闲的很,没什么事干 ,在玩手机的时间看到android系统自带的那个通讯录软件对联系人的快速定位功能. 感觉这个功能也比较实用自己就试着自己去实现. 虽然网络上还是有大牛封闭好了的框架,但是如果 ...
- Java 内存模型与内存结构
Java内存模型 一.简介 Java内存模型(JMM)主要是为了规定线程和内存之间的一些关系:根据JMM的设计,系统存在一个主内存(Main Memory)和工作内存(Work Memory),Jav ...
- jsp JavaBean el表达式
JSP三大指令 一个jsp页面中,可以有0~N个指令的定义! 1. page --> 最复杂:<%@page language="java" info="xx ...
- B-概率论-熵和信息增益
目录 熵和信息增益 一.熵(Entropy) 二.条件熵(Conditional Entropy) 三.联合熵(Joint Entropy) 四.相对熵(Relative Entropy) 4.1 相 ...
- 【TencentOS tiny】深度源码分析(1)——task
任务的基本概念 从系统的角度看,任务是竞争系统资源的最小运行单元.TencentOS tiny是一个支持多任务的操作系统,任务可以使用或等待CPU.使用内存空间等系统资源,并独立于其它任务运行,理论上 ...
- .NET Core使用gRPC打造服务间通信基础设施
一.什么是RPC rpc(远程过程调用)是一个古老而新颖的名词,他几乎与http协议同时或更早诞生,也是互联网数据传输过程中非常重要的传输机制. 利用这种传输机制,不同进程(或服务)间像调用本地进程中 ...
- 构建gitlab+Jenkins+harbor+kubernetes的DevOps持续集成持续部署环境
构建gitlab+Jenkins+harbor+kubernetes的DevOps持续集成持续部署环境 整个环境的结构图. 一.准备工作 gitlab和harbor我是安装在kubernetes集群外 ...