爬虫篇 | 抓取得到App音频数据

优采云 发布时间: 2022-05-14 11:45

  爬虫篇 | 抓取得到App音频数据

  这两天知识星球上有球友要求布置一个抓取得到App数据的作业,于是我二话不说就撸了一把.

  效果图如下

  

  

  

  我们以前都是在网页上抓取数据,很少在手机App中抓取数据,那如何在抓取手机App中的数据呢?一般我们都是使用抓包工具来抓取数据.

  常用的抓包工具有Fiddles与Charles,以及其它今天我这里主要说说Charles使用,相比于Fiddles,Charles功能更强大,而且更容易使用. 所以一般抓包我推荐使用Charles

  下载与安装Charles

  下载并安装Charles 再去破解Charles,这里附上文章教程,我就不多说啥了

  注意事项:

  如果获取到的数据是乱码,你要设置一下连接SSL证书 在Charles中 菜单栏==>proxy==>SSL Proxying Settings ==>添加443,如上图所示. 然后当你在真正抓取数据的时候,记得把这个关掉,以免取不到数据

  

  使用Charles

  这里我直接放两张图让大家使用看看就明白了

  

  

  我们一起来分析项目.

      # 这里有点递归的意味<br />  max_id = datas[-1]['publish_time_stamp']<br />        if self.max_id != max_id:<br />            self.max_id = max_id<br />            self.request_data()<br />        else:<br />            print('数据抓取完毕!')<br />

  完整代码:

  import requests<br /><br />import time<br />import json<br />from dedao.ExeclUtils import ExeclUtils<br />import os<br /><br /><br />class dedao(object):<br /><br />    def __init__(self):<br />        # self.rows_title = [u'招聘标题', u'公司名称', u'公司地址', u'待遇', u'发布日期', u'招聘链接', u'招聘要求描述']<br />        # sheet_name = u'51job_Python招聘'<br />        self.rows_title = [u'来源目录', u'标题', u'图片', u'分享标题', u'mp3地址', u'音频时长', u'文件大小']<br />        sheet_name = u'逻辑思维音频'<br /><br />        return_execl = ExeclUtils.create_execl(sheet_name, self.rows_title)<br />        self.execl_f = return_execl[0]<br />        self.sheet_table = return_execl[1]<br />        self.audio_info = []  # 存放每一条数据中的各元素,<br />        self.count = 0  # 数据插入从1开始的<br />        self.base_url = 'https://entree.igetget.com/acropolis/v1/audio/listall'<br />        self.max_id = 0<br />        self.headers = {<br />            'Host': 'entree.igetget.com',<br />            'X-OS': 'iOS',<br />            'X-NET': 'wifi',<br />            'Accept': '*/*',<br />            'X-Nonce': '779b79d1d51d43fa',<br />            'Accept-Encoding': 'br, gzip, deflate',<br />            #     'Content-Length': '    67',<br />            'X-TARGET': 'main',<br />            'User-Agent': '%E5%BE%97%E5%88%B0/4.0.13 CFNetwork/901.1 Darwin/17.6.0',<br />            'X-CHIL': 'appstore',<br />            'Cookie    ': 'acw_tc=AQAAAC0YfiuHegUAxkvoZRLraUMQyRfH; aliyungf_tc=AQAAAKwCD1dINAUAxkvoZTppW+jezS/9',<br />            'X-UID': '34556154',<br />            'X-AV    ': '4.0.0',<br />            'X-SEID    ': '',<br />            'X-SCR    ': '1242*2208',<br />            'X-DT': 'phone',<br />            'X-S': '91a46b7a31ffc7a2',<br />            'X-Sign': 'ZTBiZjQyNTI1OTU2MTgwZjYwMWRhMjc5ZjhmMGRlNGI=',<br />            'Accept-Language': 'zh-cn',<br />            'X-D': 'ca3c83fca6e84a2d869f95829964ebb8',<br />            'X-THUMB': 'l',<br />            'X-T': 'json',<br />            'X-Timestamp': '1528195376',<br />            'X-TS': '1528195376',<br />            'X-U': '34556154',<br />            'X-App-Key': 'ios-4.0.0',<br />            'X-OV': '11.4',<br />            'Connection': 'keep-alive',<br />            'X-ADV': '1',<br />            'Content-Type': 'application/x-www-form-urlencoded',<br />            'X-V': '2',<br />            'X-IS_JAILBREAK    ': 'NO',<br />            'X-DV': 'iPhone10,2',<br />        }<br /><br />    def request_data(self):<br />        try:<br />            data = {<br />                'max_id': self.max_id,<br />                'since_id': 0,<br />                'column_id': 2,<br />                'count': 20,<br />                'order': 1,<br />                'section': 0<br />            }<br />            response = requests.post(self.base_url, headers=self.headers, data=data)<br />            if 200 == response.status_code:<br />                self.parse_data(response)<br />        except Exception as e:<br />            print(e)<br />            time.sleep(2)<br />            pass<br /><br />    def parse_data(self, response):<br />        dict_json = json.loads(response.text)<br />        datas = dict_json['c']['list']  # 这里取得数据列表<br />        #  print(datas)<br />        for data in datas:<br />            source_name = data['audio_detail']['source_name']<br />            title = data['audio_detail']['title']<br />            icon = data['audio_detail']['icon']<br />            share_title = data['audio_detail']['share_title']<br />            mp3_url = data['audio_detail']['mp3_play_url']<br />            duction = str(data['audio_detail']['duration']) + '秒'<br />            size = data['audio_detail']['size'] / (1000 * 1000)<br />            size = '%.2fM' % size<br /><br />            self.download_mp3(mp3_url)<br /><br />            self.audio_info.append(source_name)<br />            self.audio_info.append(title)<br />            self.audio_info.append(icon)<br />            self.audio_info.append(share_title)<br />            self.audio_info.append(mp3_url)<br />            self.audio_info.append(duction)<br />            self.audio_info.append(size)<br /><br />            self.count = self.count + 1<br />            ExeclUtils.write_execl(self.execl_f, self.sheet_table, self.count, self.audio_info, u'逻辑思维音频.xlsx')<br />            print('采集了{}条数据'.format(self.count))<br />            # 清空集合,为再次存放数据做准备<br />            self.audio_info = []<br /><br />        time.sleep(3) # 不要请求太快, 小心查水表<br />        max_id = datas[-1]['publish_time_stamp']<br />        if self.max_id != max_id:<br />            self.max_id = max_id<br />            self.request_data()<br />        else:<br />            print('数据抓取完毕!')<br /><br />        pass<br /><br />    def download_mp3(self, mp3_url):<br />        try:<br />            # 补全文件目录<br />            mp3_path = u'D:/store/mp3/{}'.format(mp3_url.split('/')[-1])<br />            print(mp3_path)<br />            # 判断文件是否存在。<br />            if not os.path.exists(mp3_path):<br />                # 注意这里是写入文件,要用二进制格式写入。<br />                with open(mp3_path, 'wb') as f:<br />                    f.write(requests.get(mp3_url).content)<br /><br />        except Exception as e:<br />            print(e)<br /><br /><br />if __name__ == '__main__':<br />    d = dedao()<br />    d.request_data()<br />

  当前这只是比较简单的手机App数据抓取,更复杂的数据抓取又该如何操作呢?如何抓取朋友圈数据呢?如何抓取微信公众号数据呢?持续关注!

  如果你觉得文章还不错,请大家点赞分享下。你的肯定是我最大的鼓励和支持。【完】

  如果觉得有料,来个在看,让朋友知道你越来越优秀了说句题外话,有不少人想加我微信,看我朋友圈的每日分享,我姑且放出来,但名额有限,先来先得。我的朋友圈不止有技术分享,更有我的日常感悟,还有我个人商业思维观点速速扫码添加!

  

  扫码添加,备注:公号铁粉

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线