美文网首页互联网的那些事儿坚持写互联网科技
巧用抓包 ― 爬遍SCU玻璃杯事件所有神回复

巧用抓包 ― 爬遍SCU玻璃杯事件所有神回复

作者: Wakingup88688 | 来源:发表于2017-03-25 17:42 被阅读1292次

    最近我川又搞事情了

    然后info又炸了,,,

    据说最开始是这样的:
    玻璃杯1.png

    然后是这样的:

    玻璃杯2.png

    然后一发不可收拾了,校园各处不约而同响起了摔杯的声音,微信微博朋友圈qq空间,特么也全是玻璃碎片啊!!!


    玻璃杯3.png
    玻璃杯4.png 玻璃杯5.png

    摔碎一个玻璃杯炸出我川多少优秀段子手!
    据说后面还引来了武大、浙大等校观光团。

    如此空前盛况怎能错过,宝宝决定搞点事情。

    怎么可能又摔杯!!

    (话说我的杯子是塑料的好吧,还PET呢)

    4390568406.png
    不胡扯了,上Info爬取玻璃杯事件100条热门神评论,嗯先立个flag。

    </br>

    一、过程

    搜了一下网页版的scuinfo

    scuinfo.jpg
    首先初步观察分析

    点击一看也是瀑布流,需要下拉刷新。
    再看一下源码,一下就懵了,什么关键数据也没有呀,用pycharm获取一样。可以看出采用的javascript和jquery,有点难办了。

    pageSource1.jpg pageSource2 .png

    最先想到是用selenium定位然后截屏什么的,结果连续报错:无法定位到元素。
    都快洗洗睡了,最后想到之前在知乎上有人用的抓包,回去翻了相关帖子,峰回路转。
    这里感谢这个教程。


    爬虫由入门到放弃.jpg

    </br>
    打开开发者工具,切换至network抓包。

    这里是我们要到包
    点开看到每个评论真实URL地址,估计每一个评论皆有个特殊的id
    将URL粘贴至浏览器

    原来所有信息都在这个包里面了!!!
    找到所有id构造URL,requests获取即可。
    下拉找到原帖id=131599

    玻璃杯原帖.jpg
    接着就是获取最新帖子id。

    特么我在这又兜圈了!因为帖子是随时更新的,想着可以一试selenium模拟浏览器。结果又定位失败,搞了好久决定先搁置。
    </br>

    先去获取和处理数据

    仔细观察数据,发现string格式的,里面是一个dict,dict里面data又是一个dict。
    如何将string格式转变为dict
    百度搜到一靠谱答案。测试可用。

    将string格式转为dict
    后面才发现这一堆原来是json格式的(回去翻基础,难怪如此熟悉),又将eval()换成json.loads()。基础不牢地动山摇啊。。。

    提取重要信息,再从comment中提取“玻璃杯事件”评论,决定匹配正则最快。
    可“如何在中文中匹配中文关键词”?

    之前都是在标签中提取数据,情况少见真的把我难住了,编码问题让人头痛。
    滚去睡觉,第二天查资料,统统的不行啊。

    静下心想了想,pycharm获取的数据本来就是Unicode格式的,只要源码先不encode为utf-8,将中文关键词在IDE中转为Unicode格式,不就可以匹配的上了么?
    事实如此!
    正则的四个关键词:
    “玻璃”、“杯”、“摔”、“观光”

        pattern=re.compile(u'\u73bb\u7483|\u676f|\u6454|\u89c2\u5149',re.S)
        items=re.search(pattern,body)
    

    我以为接下来就是美滋滋地等待一堆数据,结果又报错:


    Error1.jpg

    这个list什么鬼?于是回去查看。原来data是空的list,估计是已经删除的评论,所以为None。再试了下不存在的id,比如id=137945,同样如此。

    listError.png

    改了下代码,可以运行。

     if not isinstance(data, list):
             xxx(内容)
     else:
        print 'None'
    

    </br>

    返回获取最新帖子id

    曾经想过最后打出10个或以上的None然后break结束,但发现代码无法实现,只能手动结束,心想这算什么程序,不行。

    很无聊又到info上看帖去了(MDZZ。。。)
    后来再打开network发呆了下,想到了。
    既然打开一页可以抓包,那么刷新看新评论肯定也可以呀。

    每次刷新页面便会请求
    URL=“http://www.scuinfo.com/api/posts?pageSize=15”,验证了下15就是一页总评论数,这么简单,为什么之前没想到啊啊!
    (简直想表演胸口碎大石)
    </br>

    筛选热门100条神回复

    先把每一项的发言、点赞、评论保存入一个list中,然后多个list放到一个大的list中(暂且叫container)。

    可提取的时候麻烦了,我想按照点赞数排列container中所有的list,怎么办呀。

    试了许久,百度搜索“list集合中如何按照某一个属性排序”,无果。
    心想这是给自己挖了个坑呀,便改用dict。
    绕了好久最后终于解决了。
    先按照点赞数大小,点赞相同时按照评论数大小。

     def getSort(self):
        container=self.getDetail()
        print u'\n',u'将所有评论按照点赞数大小排序:'
        container.sort(key=lambda k:k.get('comment',0))
        container.sort(key=lambda k:k.get('like',0),reverse=True)
        for index,r in enumerate(container):
            print u'\n\n序号:',index+1, u'\n发言:',r['body'],u'\n点赞:' ,r['like'],u'评论',r['comment']
    

    </br>
    原本以为到这里就结束了,结果运行过程中又出新bug了
    (真怀疑自己是否是招bug体质哎。。。):

    Error2.jpg

    没见过于是查资料,原来如此,get !


    httpError.png

    二、结果和代码

    comment-Number.png

    数据是昨天的。
    今天又运行了程序,发现已不止1200
    下面就是热门评论了


    page1.png page2.png

    爬取的数据实在是多,象征性放前20条

    想看完整版100条的可以去我微博:

    http://weibo.com/u/5690935322?refer_flag=1005055010_&is_all=1

    源码在Github上:

    https://github.com/LUCY78765580/Python-web-scraping/blob/master/BoLiBei.py

    终于搞定一切,接下来干点什么好?

    04009040.jpg
    这一次写爬虫,遇到不少问题,总结如下:
    1、破解javascript动态网页(抓包)
    2、json格式数据解析(json.loads())
    3、在中文中匹配特定中文的正则表达式(先将关键词转换)
    4、多个dict按照某一属性排序问题
    (lambda函数和enumerate迭代器)
    5、http连接太多没有关闭报错的问题

    回去补补基础。
    不过算是学会了抓包,这种东西简直有如神器。嘿嘿,本篇就是这样啦~

    相关文章

      网友评论

      本文标题:巧用抓包 ― 爬遍SCU玻璃杯事件所有神回复

      本文链接:https://www.haomeiwen.com/subject/adxcottx.html