web爬虫学习(四)——手机APP爬取

2023-11-05

思路如下:

STEP1:为我们的爬虫找到入口

笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值,找寻数据的秘密,笔者认为,数据的价值不仅仅只体现在企业中,个人也可以体会到数据的魅力,用技术力量探索行为密码,让大数据助跑每一个人,欢迎直筒们关注我的公众号,大家一起讨论数据中的那些有趣的事情。

我的公众号为:livandata

APP请求数据,也是通过网络协议,这样,我们就抓包来定位入口,这里我用的是fiddler。关于设置手机和fiddler的关联,请参考

篇文章

第一步:下载神器Fiddler,下载链接:

http://w.x.baidu.com/alading/anquan_soft_down_ub/10963

下载完成之后,傻瓜式的安装一下了!

第二步:设置Fiddler

打开Fiddler,     Tools-> Fiddler Options (配置完后记得要重启Fiddler)
选中"Decrpt HTTPS traffic",    Fiddler就可以截获HTTPS请求
选中"Allow remote computers to connect".  是允许别的机器把HTTP/HTTPS请求发送到Fiddler上来

记住这个端口号是:8888

第三步:设置Android手机

首先获取PCip地址:命令行中输入:ipconfig,获取ip地址

好吧,这时候我就拿到了IP地址和端口号了

下面来对Android手机进行代理设置

确定一下手机和PC是连接在同一个局域网中

进入手机的设置->点击进入WLAN设置->选择连接到的无线网,长按弹出选项框:如图所示:

将代理设置成手动,将上面获取到的ip地址和端口号填入,点击保存。这样就将我们的手机设置成功了。

第四步:下载Fiddler的安全证书

使用Android手机的浏览器打开:http://192.168.1.96:8888"FiddlerRootcertificate" 然后安装证书,如图:

到这里我们就设置好所有的值,下面就来测试一下,打开手机的超级课程表APP:

这样就抓取Android移动端的数据包成功了,这个对于我们后面进行网络数据请求的调试有很大的帮助,我们可以通过这个方法来判断我们请求网络是否成功!

找到登陆入口为:http://120.55.151.61/V2/StudentSkip/loginCheckV4.action

STEP2:登陆

这里登陆就和模拟登陆原理是一样的,即向登陆入口POST登陆数据,而且这里还更加简单,因为fiddler抓包(为了避免搞乱思路,这里抓包分析就先略过了,以后有时间再补上抓包分析这块吧。。。)可以直接获取POST的数据,省去了自己构建表单的步骤,具体参见下文代码。登陆成功后,会返回json数据,里面是你的个人信息。

STEP3:定位数据来源

要抓取的是发帖信息,手机点击,fiddler抓包定位。这里定位的入口为:http://120.55.151.61/Treehole/V4/Cave/getList.actionPOST方式,数据同样以json形式返回。要注意的是,这里要想做持续请求,必须搞定时间戳,简单说就是从第N次请求获取返回数据的中的一个时间戳,之后应用于第N+1次请求,如此循环,具体请参考代码。同样,按照我习惯的方式,用了一个简单的递归来实现循环抓取。

STEP4:解析json文件,清洗数据并保存

这里我还是用的EXCEL表格,建议用数据库。。。因为数据量大的时候(此次抓取包含发帖内容,数据量不算太小。。。),打开EXCEL表格时会巨卡。。。

有了前面的思路,抓取就是体力活了。。。上代码:(声明:出于隐私和安全考虑,代码中logindata和初始req_data有改动,这个要换成自己抓包得到的数据才可以)

import requests

import json

import re

import time

import simplejson

import xlsxwriter

 

workbook = xlsxwriter.Workbook('kebiao_test.xlsx')

worksheet = workbook.add_worksheet()

worksheet.set_column('A:A', 10)

worksheet.set_column('B:B', 20)

worksheet.set_column('C:C', 5)

worksheet.set_column('D:D', 20)

worksheet.set_column('E:E', 20)

worksheet.set_column('F:F', 500)

 

worksheet.write(0,0,'学校')

worksheet.write(0,1,'主题')

worksheet.write(0,2,'性别')

worksheet.write(0,3,'日期')

worksheet.write(0,4,'时间')

worksheet.write(0,5,'内容')

 

# 登陆部分

# 用requests.Session()记录cookie

s = requests.Session()

loginurl = 'http://120.55.151.61/V2/StudentSkip/loginCheckV4.action'

logindata = 'phoneBrand=Xiaomi&platform=1&deviceCode=867711022104024

&account=6603135B883F9B40DED6374A22593&phoneVersion=19

&password=98A09B5680DF25A934ACF9B3614AF4EA&channel=XiaoMiMarket

&phoneModel=HM+2A&versionNumber=7.4.1&'

headers = {

   'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',

   'User-Agent': 'Dalvik/1.6.0 (Linux; U; Android 4.4.4;

HM 2A MIUI/V7.3.1.0.KHLCNDD)',

   'Host': '120.55.151.61',

   'Connection': 'Keep-Alive',

   'Accept-Encoding': 'gzip',

   'Content-Length': '213',

}

 

# 提交登陆信息,开始登陆

data = s.post(url=loginurl, data=logindata, headers=headers,

stream=True, verify=False)

loginResult = data.text

# 打印登陆信息,检查是否登陆成功

# 成功后返回个人信息

print(loginResult)

 

# 定义一个函数,获取信息并保存

# 传入要POST的表单数据,即req_data

def get_data(req_data):

   req_url = 'http://120.55.151.61/Treehole/V4/Cave/getList.action'

   data_r = s.post(url=req_url, data=req_data, headers=headers)

   data_r = data_r.text

   # 返回的布尔值为小写,这里转化为真正的布尔值

   true = True

   false = False

    

   # 简单处理json数据,直接解析好像有编码问题,不太清楚。。。

   data_j = eval(data_r)

   data_js = json.dumps(data_j)

   data_dict = simplejson.loads(data_js)

 

   # 获取时间戳

   data = data_dict['data']

   timestampLong = data['timestampLong']

   #print(timestampLong)

   messageBO = data['messageBOs']

    

   # 处理抓到的json数据,拿到目标数据并保存

   for each in messageBO:

      if 'studentBO' in each:

         print(each)

         #topicDict = {}

         if each.get('content', False):

            schoolNamex = each["schoolName"]

            worksheet.write(i,0,schoolNamex)

            tag = each['moodTagBO']['moodTagName']

            worksheet.write(i,1,tag)

            genderx = each['studentBO']['gender']

            worksheet.write(i,2,genderx)

            contentx = each['content']

            #print(contentx)

            worksheet.write(i,5,contentx)

            #topicDict['messageId'] = each['messageId'

            time_f = list(time.localtime(int(str(each['issueTime'])[:-3])))

            time_s = str(time_f[0])+'/'+str(time_f[1])+'/'+str(time_f[2])

 

            h = time_f[3]

            m = time_f[4]

            sec = time_f[5]

            if h < 10:

               h = '0'+str(h)

            if m < 10:

               m = '0'+str(m)

            if sec < 10:

               sec = '0'+str(sec)

            time_t = str(h)+':'+str(m)+':'+str(sec)

            datex = time_s

            # print(datex)

            worksheet.write(i,3,datex)

            worksheet.write(i,4,time_t)

 

            i += 1

            global i

   # 用获取的时间戳构建新的POST表单数据,持续循环抓取

   new_req_data = 'timestamp='+str(timestampLong)+

                              '&preMoodTimestap=1461641185406&phoneBrand=Xiaomi

                              &platform=1&phoneVersion=19&channel=XiaoMiMarket

                              &phoneModel=HM+2A&versionNumber=7.4.1&'

   print('--------------------------new page---------')

   #print(new_req_data)

   # 定义抓取发帖条数

   if i <= 20000:

      try:

         get_data(new_req_data)

      except:

         print('fail')

      finally:

         workbook.close()

   else:

      workbook.close()

      print('全部抓取成功了!!!')

# i 是抓取条数的标识  

i = 1

# 此处传入第一个页面的POST数据,之后展开循环

get_data(req_data='timestamp=146646454916&preMoodTimestap=1461641185406

&phoneBrand=Xiaomi&platform=1&phoneVersion=19&channel=XiaoMiMarket

&phoneModel=HM+2A&versionNumber=7.4.1&')

代码输出结果如下:

EXCEL表格数据如下:

至此,抓取算是全部搞定。但是,本人毕竟学统计的,有数据怎能不分析呢,下一篇我来讲下怎么对数据进行简单的可视化。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

web爬虫学习(四)——手机APP爬取 的相关文章

  • 完美立方(C语言)

    题目 形如 a 3 b 3 c 3 d 3a 3 b 3 c 3 d 3 的等式被称为完美立方等式 例如 12 3 6 3 8 3 10 312 3 6 3 8 3 10 3 编写一个程序 对任给的正整数 N N le 100 N N 10
  • C# AES加密算法

    using System using System Collections Generic using System IO using System Linq using System Security Cryptography using
  • Gradle 团队发布了Gradle 7.2

    Gradle 团队近日发布 Gradle 7 2 Gradle 是一个类似于 Maven 项目的自动化构建工具 支持依赖管理和多项目 Gradle 抛弃了 Maven 基于 XML 的繁琐配置 取而代之的是Gradle 采用了特定语言 Gr
  • python实现堆栈和队列

    1 python实现堆栈 可先将Stack类写入文件stack py 在其它程序文件中使用from stack import Stack 然后就可以使用堆栈了 stack py的程序如下 class Stack def init self
  • linux下通过mount挂载iscsi、ntfs、nfs详解

    通常服务器本机自带磁盘空间有限 都需要额外加载磁盘 可以采用mount方式把远程的共享存储磁盘加载进来 目前用过的有iscsi ntfs nfs三种类型 一 mount挂载iscsi类型1 查找下准备挂载的磁盘或者存储器 root loca
  • SSL P2415 连通块

    2008 南海初中竞赛 连通块 Time Limit 10000MS Memory Limit 65536K Total Submit 41 Accepted 19 Case Time Limit 1000MS
  • Ubuntu使用vim报错 “/user/lib/python3.10/site.py“ E212: Can‘t open file for writing

    这个错误是由于没有足够的权限导致的 尝试使用sudo命令来重启编辑器或者直接打开终端并使用sudo命令编辑文件 需要重新打开命令行 但是现在是ssh 可能是用root权限进入vim后权限过期 折磨我十分钟 在网上搜了很多方法也没有解决 最后
  • 第13节-PhotoShop基础课程-裁剪工具

    文章目录 前言 1 裁剪工具 1 基本操作 Alt Shift 2 拉直 3 内容识别 自动填充 2 透视裁剪工具 3 切片工具 长图分成多个 4 切片选择工具 5 存储为一张一张 前言 1 裁剪工具 1 基本操作 Alt Shift 2
  • openwrt 查看运行程序_Go 语言交叉编译在 openwrt 上运行的程序

    go 语言一个很好的地方是可以方便的进行交叉编译 也就是编译出在不同于当前硬件平台 操作系统 上运行的程序 今天尝试编译一段代码到小米路由器 3G 上运行 具体过程记录在下面 供大家参考 环境 编译环境 mac go 1 11 运行环境 路
  • 逻辑回归:逻辑回归中的参数

    转载自 https blog csdn net Captain DUDU article details 105081643 LogisticRegression 一共有14个参数 逻辑回归参数详细说明 参数说明如下 penalty 惩罚项
  • hadoop高可用集群启动yarn失败

    hadoop高可用集群启动yarn失败 通过查看日志信息发现主要错误如下 org apache zookeeper ClientCnxn Session 0x0 for server null unexpected error closin
  • WindowsError:[Error ] 全系列

    ERROR FILE NOT FOUND 指定的文件不存在 ERROR INVALID PARAMETER 参数错误 ERROR ACCESS DENIED 访问被拒绝 ERROR INVALID HANDLE 无效的句柄 ERROR NO
  • Kotlin基础

    Kotlin是什么 它是一种针对 java 平台的新编程语言 Kotlin 简洁 安全 务实 Kotlin可以运行在 任何 java 运行的地方 并且能够和 java语言无缝对接上 kotlin语言和java语言一样 都是静态语言 java
  • PCB设计时对于EMC有哪些需要注意的?

    详细如下 EMC的PCB设计技术 分层 布局 布线 pcb的emc设计 Me sl 的博客 CSDN博客 PCB EMC 设计的关键 是尽可能减小回流面积 让回流路径按照设计的方向流动 最常见返回电流问题来自于参考平面的裂缝 变换参考平面层
  • MySQL数据库 【增删改查】

    目录 一 新增 指定列插入 一次插入多个数据 二 查询 1 全列查询 2 指定列查询 3 查询字段为表达式 4 查询的时候给列名 表达式 指定别名 5 查询时去重 6 排序查询 7 条件查询 8 模糊查询 9 空值查询 10 分页查询 三
  • JavaScript中的字符串替换

    今天一大早遇到个状况 json字符串中有些undefined数据 导致图表不能正常显示 本来打算用isNaN判断是否是数字 后来感觉操作起来有些麻烦 就打算用 null 把 undefined 全部替换到 于是用replace函数进行替换
  • 菜鸟的我运行了hello word 在华为鸿蒙2.0beta

    相信自从华为上次华为鸿蒙发布会之后 不少尝鲜用户都已经使用华为鸿蒙的IDE开发程序 那么网上的教程也很多 这里我通过华为鸿蒙官方教程成功安装并且成功运行hello word 我还是菜鸟 大佬勿喷 鸿蒙源码 https openharmony
  • MFC之菜单栏的相关使用14

    1 菜单栏选项的打勾 加粗 禁用 首先我们需要知道菜单栏包含子菜单栏 依次使用下标去区分 然后拿到子菜单栏后 就可以操作里面的选项了 可以通过下标 选项的ID 在资源视图的菜单栏的图 点击选项右击属性即可获取 进行操作 代码 由于为了减少视

随机推荐

  • 【学习日志】【TCN】时间序列卷积神经网络(1)

    1 ask bing Temporal Convolutional Network 问 我对CNN RNN TCN等神经网络没有任何基础 你能直观地给我讲一下TCN的结构 输入输出和原理吗 bing对TCN的解释如下 TCN是一种用于处理序
  • C++标准库之IO库

    IO类 基本内容 iostream库包含两个基础类型 istream ostream cin 一个istream对象 用来从标准输入读取数据 cout 同cin cerr 用于输出程序错误信息 写到标准错误 方法 getline 从一个给定
  • 蓝桥杯大赛获奖选手,可获研究生推免加分啦,挺好的呀

    大家好 我是涛哥 我一直关注着各类大会和各类比赛 之前也写过蓝桥杯大赛的一些攻略 并用实际的题目和案例 为大家准备蓝桥杯比赛提供了指导 蓝桥杯大赛其实并不难 但好处很多 有的朋友可能对蓝桥杯还不太了解 不过没关系 我简单来跟大家说说 希望广
  • Java Double compare()方法具有什么功能呢?

    转自 Java Double compare 方法具有什么功能呢 下文笔者将讲述compare 方法的功能简介说明 如下所示 compare 方法的功能 java lang Double compare 方法的功能 用于比较两个基础类型的d
  • HTML5----响应式(自适应)网页设计(自动适应屏幕大小)

    HTML5 响应式 自适应 网页设计 自动适应屏幕大小 现在 很多项目都需要做响应式或者自适应的来适应我们不同屏幕尺寸的手机 电脑等设备 那么就需要我们在页面上下功夫 但移动端的布局不同于pc端 首先我们要知道在移动端中 css中的1px并
  • MyEclipse设置Java代码注释模板

    定义自己喜欢的模板注释 选中你要加注释的方法或类 按 Alt shift J 文件 Files 注释标签 Title file name Package package name Description todo author yok
  • 抓包工具mitmprox

    安装 我这里是在pycharm下项目setting安装的 设置环境变量 将下面exe这个路径添加至path 启动mitmproxy https blog csdn net shifengboy article details 1140672
  • 北邮22信通:实验五 共射放大电路的频率特性与深负反馈的影响

    北邮22信通一枚 很高兴以一个新身份与大家见面 关注作者 解锁更多邮苑模电实验报告 获取更多文章 请访问专栏 北邮22信通 电子电路 青山如墨雨如画的博客 CSDN博客 目录 实验目的 实验设备及器件 实验内容 1 频率特性分析 1 1 C
  • C# linq初探 使用linq查询数组中元素

    使用linq进行数组查询 输出数组中全部的偶数并升序输出结果 写法1 int numbers 5 10 8 3 6 12 查询的数组 var numqurey from num in numbers where num 2 0 按照条件过滤
  • 区间预测

    区间预测 MATLAB实现SARIMA季节性数据时间序列预测 arima函数 目录 区间预测 MATLAB实现SARIMA季节性数据时间序列预测 arima函数 预测效果 基本介绍 研究回顾 模型结构 程序设计 参考资料 预测效果 基本介绍
  • latex 基本用法(二)—— 矩阵(增广矩阵、长虚线)

    latex 基本用法 modm mod m mod modn pmod n pmod 1 增广矩阵 比如鸡兔同笼问题的线性方程组 x y 152x 4y 40 begin split x y 15 2x 4y 40 end split 首先
  • android 自定义控件--(圆盘形菜单控件)

    思路原理 定一个原点和一个半径 圆的四周均匀分布每个菜单 为了方便计算 菜单的坐标用度数表示 然后转化为极坐标计算 定某个点为起始点 根据总菜单数确定每个点增加的度数 然后依次确定每个点的度数 也就确定了坐标 源代码 package chr
  • linux下C语言修改文件权限

    头文件
  • Java 统计文本文件中字符数量

    设有一个文本文件word01 txt 内容如下 after a minute or two and said to his friend he opened them again a minute or two and said to fr
  • 【数据结构——树】Trie树的两种实现方式:二叉树(左孩子右兄弟)与二十六叉树

    输入 输入的第一行为一个正整数n 表示词典的大小 其后n行 每一行一个单词 不保证是英文单词 也有可能是火星文单词哦 单词由不超过10个的小写英文字母组成 可能存在相同的单词 此时应将其视作不同的单词 接下来的一行为一个正整数m 表示询问的
  • c++实现哈夫曼huffman压缩文本

    哈夫曼压缩原理就是构建二叉树 出现频率高的字母用更少的位数来表示 实现压缩的效果 比如字符串abcbbc 构建哈夫曼树 这样构建出编码表b gt 0 a gt 10 c gt 11 原本6个字符要48位来表示 现在只需要9位来表示即可 1
  • FairyGui简单介绍

    1 什么是FairyGui 跨平台UI编辑器 支持多种项目 如Unity Cocos2dx CryEngine HavokVision Starling Egret LayaAir Haxe Pixi LibGDX and More 2 a
  • 视频号的播放量和互动率、完播率密不可分

    如何提高视频号播放量 视频号是推荐机制 分两种 社交推荐 朋友给你点赞 我未关注也可能刷到你 和平台推荐 提高系统推荐的两个指标和一个逻辑 两个指标 互动率和完播率 1 互动率 互动率是指互动次数占总播放量的比重 包含 点赞率 评论率 转发
  • 算法 - 递归实现汉诺塔(The Tower of Hanoi)

    目录 引言 分析 分析两片汉诺塔的迁移过程 分析三片汉诺塔的迁移过程 代码实现 递归出口 递归过程 完整程序代码 运行结果 参考资料 引言 今天接触到了一个非常有意思的游戏 名字叫做汉诺塔 Tower of Hanoi 小时候没有玩过这个益
  • web爬虫学习(四)——手机APP爬取

    思路如下 STEP1 为我们的爬虫找到入口 笔者是一个痴迷于挖掘数据中的价值的学习人 希望在平日的工作学习中 挖掘数据的价值 找寻数据的秘密 笔者认为 数据的价值不仅仅只体现在企业中 个人也可以体会到数据的魅力 用技术力量探索行为密码 让大