1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 使用Charles抓取百词斩单词音频 单词翻译 例句音频 例句翻译

使用Charles抓取百词斩单词音频 单词翻译 例句音频 例句翻译

时间:2020-11-20 20:13:27

相关推荐

使用Charles抓取百词斩单词音频 单词翻译 例句音频 例句翻译

本教程演示在Mac OSMonterey 12.2.1版本的操作系统上,使用的Charles的版本是1.9.56,模拟器为网易MuMu模拟器,版本号4.6.2

与环境有关的配置可以查看我的上一篇博文,里面详细介绍了使用Charles和模拟器进行APP抓包的环境配置流程。在本篇文章中,默认你已经能够使用Charles抓取APP的https数据包。

本文将会带领大家抓取百词斩任意词书(比如六级词汇、考研词汇等)的单词信息,包括但不限于单词的拼写,单词的音频,单词的中文含义,例句原文,例句的中文翻译,例句的音频等。总而言之,你在百词斩APP上所能看到的所有与某个单词有关的信息,都可以抓取下来。

抓取数据包

首先打开模拟器中的百词斩,然后在设置 -> 缓存管理 -> 词书中看一下自己有没有缓存下来的词书,如果有你想抓取的那本词书,需要先将其清除掉。

单词的那个tab页中选择调整计划,将学习计划调整为你想要抓取的词书,比如我想抓取六级词汇,那么调整之后的界面如下图所示。

点击上图中红色圆角矩形圈起来的区域,以查看这本单词书。点击之后的效果如下图所示(忽略红色标注)。

现在打开Charles,并保证其能抓取模拟器的数据包。然后点击上图中红色圆角矩形圈起来的区域,以下载六级词汇这本词书。在下载的过程中,可以在Charles中看到不断地有数据包被捕获。下图中被半透明的黄色矩形所覆盖的两个域名就是数据包的请求地址。

我们将展开,可以看到它们里面都只有一个名为r的文件夹,这个文件夹里面有很多后缀为.zpk的文件。我们分别在这两个r文件上右键,然后选择Save All将其保存到本地。如下图所示。

为了后续处理方便,可以将保存到本地的这两个r文件夹合并到一个文件中。到目前为止,我们已经获得了单词的所有信息,包括单词的拼写,单词的中文翻译,单词的音频,例句的音频,例句的原文等所以你在APP中可以看到的信息。这里需要注意一下,我现在演示的时候数据是从请求到的,但是当你们进行抓包操作时,数据请求地址很可能发生改变,因此需要根据实际情况分析。

这儿多说一句,除了可以通过Charles抓取单词数据外,还可以直接从单词的缓存目录中将其导出。词书缓存的目录是/storage/emulated/0/Android/data/com.jiongji.andriod.card/files/baicizhan/zpack,操作这个目录中的数据一般需要root权限,我在MuMu模拟器中开启了root权限之后仍然导出失败,原因未知,有兴趣的读者可自行尝试一下。

解析数据包

在上一部分,我们抓取了单词的数据并保存到了本地,在这一部分,我们将会解析和提取我们所需的数据。

每一个.zpk文件对应于一个单词,因此,我们可以先查看一下文件的数目,以确认是否将所有的单词都保存到了本地。接下来用文本编辑器之类的软件(我用的是Mac OS自带的TextEdit)随便打开一个.zpk文件,可以看到里面有些字符是乱码,但也有一些是正常显示的。如下图所示。

如果仔细地观察一下这个文件的内容,可以发现上图中我用红线划出来的部分是一个字典结构,里面有很多的键值对,通过键的名字,我们大体上可以知道它的含义。比如键word表示这个单词的拼写,键word_audio是这个单词音频的名称,键mean_cn是单词的中文翻译,上图中的翻译内容显示乱码是因为TextEdit解码的问题,在python中将数据转为utf8就可以正常显示中文了。我们可能会用到的键还有sentence_phrase表示例句原文,sentence_audio表示例句音频的名称。

从理论上来讲,.zpk文件里面是有音频信息的,但是我没处理过音频,所以不太容易把它提取出来。我注意到word_audio的值总是以.mp3结尾,因此我猜测它可能是相应的音频在服务器上的名称。然后通过抓取其它的数据包发现,音频文件是存储在/r/里面的,所以构造一个url:/r/37fffe50e78525d86221ab713d0b0efc_35858_1587482263.mp3,然后在浏览器中直接访问这个url,发现确实是virginity这个单词的音频,因此我们可以先提取word_audio的值,然后构造出url直接通过网络下载音频。

键值对的提取是通过写正则表达式来实现的,具体的提取规则此处不再展开描述,详情可以查看源代码。在获取音频内容时,单词的音频都是mp3格式的,而例句的音频有的是mp3,有的则是acc,我在代码中将acc格式的音频转换成了mp3格式。这种转换是用pydub实现的,因此,如果你在运行代码的时候也想做这种转换,需要先安装pydub模块。

源代码

import urllib.requestimport requestsimport globimport reimport pydubimport timedef extract_url():zpk_repo_path = '/Users/wangsen/r/' # 存放zpk文件的文件夹路径file_list = glob.glob(zpk_repo_path + '*.zpk')fw = open('word_sentence.txt', 'wt')for file in file_list:with open(file, 'rb') as f:line = ''while line.find('sentence_audio') < 0:line = f.readline().decode('utf8', 'ignore')try:word = re.search('"word":"(.*?)"', line).group(1)word_trans = re.search('"mean_cn":"(.*?)"', line).group(1)word_audio = re.search('"word_audio":"(.*?)"', line).group(1)sentence = re.search('"sentence":"(.*?)"(,|})', line).group(1)sentence = sentence.replace(r'\u0027', "'")sentence = sentence.replace('\\', "")sentence_audio = re.search('"sentence_audio":"(.*?)"', line).group(1)sentence_trans = re.search('"sentence_trans":"(.*?)"', line).group(1)# 写入文件的顺序为: 单词拼写 单词音频名称 例句音频名称 例句原文 单词翻译 例句翻译fw.write(word + '\t' + word_audio + '\t' + sentence_audio + '\t' + sentence + '\t' + word_trans + '\t'+ sentence_trans + '\n')except BaseException:print(file)fw.close()def get_audio():url = '/r/'with open('word_sentence.txt') as f:for word_info in f:word_info = word_info.split()urllib.request.urlretrieve(url + word_info[1], 'word_audio/' + word_info[0] + '.mp3')urllib.request.urlretrieve(url + word_info[2], 'sentence_audio/' + word_info[0] + '.mp3')if word_info[2][-3:] == 'aac':audio = pydub.AudioSegment.from_file('sentence_audio/' + word_info[0] + '.mp3', format('aac'))audio.export('sentence_audio/' + word_info[0] + '.mp3', format('mp3'))def main():print('Start extract audio url')start = time.time()extract_url()print('Extract url cost {}'.format(time.time() - start))print('Start download audio from BaiCiZhan')start = time.time()get_audio()print('Download audio cost {}'.format(time.time() - start))if __name__ == '__main__':main()

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。