• 爬虫再探实战(五)———爬取APP数据——超级课程表【一】


        关于爬虫,开始以为只能爬取网页数据,后来知道APP也能抓取。于是,在学校利用空闲时间,耗时两周实现了数据的抓取和简单的数据分析。

        目标,抓取超级课程表XX大学(其实是我们大学啦。。。)学生20000条发帖信息。思路如下:

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

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

    找到登陆入口为: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.action,POST方式,数据同样以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表格数据如下:

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

  • 相关阅读:
    JMeter测试WEB性能入门
    Monkey测试运用实例
    Event percentages解析
    Monkey测试结果分析
    Monkey测试环境搭建
    Appium+java移动端项目测试问题整理
    appium定位安装包启动类名称
    Appium元素定位(uiautomatorviewer)
    Appium环境搭建(Windows版)
    Selenium+java项目测试问题整理
  • 原文地址:https://www.cnblogs.com/buzhizhitong/p/5714419.html
Copyright © 2020-2023  润新知