web爬虫学习(四)——手机APP爬取 - Go语言中文社区

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


思路如下:

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表格数据如下:

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

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/livan1234/article/details/80850978
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2019-09-13 13:09:37
  • 阅读 ( 1266 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

推荐文章

猜你喜欢