爬虫再探实战(五)———爬取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表格数据如下:

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

时间: 2024-10-01 02:41:43

爬虫再探实战(五)———爬取APP数据——超级课程表【一】的相关文章

爬虫(十):AJAX、爬取AJAX数据

1. AJAX 1.1 什么是AJAX AJAX即“Asynchronous JavaScript And XML”(异步JavaScript和XML)可以使网页实现异步更新,就是不重新加载整个网页的情况下,对网页的某部分进行更新(局部刷新).传统的网页(不使用AJAX)如果需要更新内容,必须重载整个网页页面. AJAX = 异步JavaScript和XML,是一种新的思想,整合之前的多种技术,用于创建快速交互式网页应用的页面开发技术. 1.2 同步和异步 同步现象:客户端发送请求到服务器端,当

爬虫再探实战(三)———爬取动态加载页面——selenium

自学python爬虫也快半年了,在目前看来,我面临着三个待解决的爬虫技术方面的问题:动态加载,多线程并发抓取,模拟登陆.目前正在不断学习相关知识.下面简单写一下用selenium处理动态加载页面相关的知识.目标——抓取页面所有的高考录取分数信息. 对于动态加载,开始的时候是看到Selenium+Phantomjs的强大,直接就学的这个.打开网页查看网页源码(注意不是检查元素)会发现要爬取的信息并不在源码里面.也就是说,从网页源码无法通过解析得到数据.Selenium+Phantomjs的强大一方

Java爬虫系列之实战:爬取酷狗音乐网 TOP500 的歌曲

在前面分享的两篇随笔中分别介绍了HttpClient和Jsoup以及简单的代码案例: Java爬虫系列二:使用HttpClient抓取页面HTML Java爬虫系列三:使用Jsoup解析HTML 今天就来实战下,用他们来抓取酷狗音乐网上的 Top500排行榜音乐.接下来的代码中除了会用到HttpClient和Jsoup之外,还会用到log4j和ehcache,分别用来记录日志和实现缓存,如果看官对这两个不是很熟悉的话,请自行百度,现在网上的入门实例有很多,我就不专门记笔记了. 那为什么会想到爬取

爬虫再探实战(二)———模拟登陆豆瓣

爬虫有时候也要进入登陆页面之后进行爬取,这就避免不了模拟登陆了.自己在这里卡了好久,终于算是模拟成功一次. 当然,这次也是用requests,真是好用的很呢.上代码. #------------ #2016/6/11 #模拟登陆豆瓣成功!!! import requests url = 'https://accounts.douban.com/login' headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.

爬虫再探实战(四)———爬取动态加载页面——请求json

还是上次的那个网站,就是它.现在尝试用另一种办法——直接请求json文件,来获取要抓取的信息. 第一步,检查元素,看图如下: 过滤出JS文件,并找出包含要抓取信息的js文件,之后就是构造requests请求对象,然后解析json文件啦.源码如下: import requests def save(school_datas): for data in school_datas: # print(data) year = data['year'] province = data['province'

爬虫再探实战(二)———模拟登陆豆瓣(续集。。)

关于豆瓣,还是算是爬虫友好型的网站,之前模拟登陆也很容易就成功了,不过最近要在豆瓣抓点东西,发现代码已经不能用了.打印源码发现,需要验证码了. 所以,这里写个续集...较上一篇改动主要在验证码和一个随机字符串的获取,再之后加入pyload就行了.具体参照代码. import re import requests headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko)

分布式爬虫系统设计、实现与实战:爬取京东、苏宁易购全网手机商品数据+MySQL、HBase存储

[TOC] 1 概述 在不用爬虫框架的情况,经过多方学习,尝试实现了一个分布式爬虫系统,并且可以将数据保存到不同地方,类似MySQL.HBase等. 基于面向接口的编码思想来开发,因此这个系统具有一定的扩展性,有兴趣的朋友直接看一下代码,就能理解其设计思想,虽然代码目前来说很多地方还是比较紧耦合,但只要花些时间和精力,很多都是可抽取出来并且可配置化的. 因为时间的关系,我只写了京东和苏宁易购两个网站的爬虫,但是完全可以实现不同网站爬虫的随机调度,基于其代码结构,再写国美.天猫等的商品爬取,难度不

小白学 Python 爬虫(25):爬取股票信息

人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Linux基础入门 小白学 Python 爬虫(4):前置准备(三)Docker基础入门 小白学 Python 爬虫(5):前置准备(四)数据库基础 小白学 Python 爬虫(6):前置准备(五)爬虫框架的安装 小白学 Python 爬虫(7):HTTP 基础 小白学 Python 爬虫(8):网页基

python爬虫实例详细介绍之爬取大众点评的数据

python 爬虫实例详细介绍之爬取大众点评的数据 一. Python作为一种语法简洁.面向对象的解释性语言,其便捷性.容易上手性受到众多程序员的青睐,基于python的包也越来越多,使得python能够帮助我们实现越来越多的功能.本文主要介绍如何利用python进行网站数据的抓取工作.我看到过利用c++和Java进行爬虫的代码,c++的代码很复杂,而且可读性.可理解性较低,不易上手,一般是那些高手用来写着玩加深对c++的理解的,这条路目前对我们不通.Java的可读性还可以,就是代码冗余比较多,