最近我川又搞事情了
然后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,有点难办了。
最先想到是用selenium定位然后截屏什么的,结果连续报错:无法定位到元素。
都快洗洗睡了,最后想到之前在知乎上有人用的抓包,回去翻了相关帖子,峰回路转。
这里感谢这个教程。
爬虫由入门到放弃.jpg
</br>
打开开发者工具,切换至network抓包。
点开看到每个评论真实URL地址,估计每一个评论皆有个特殊的id
将URL粘贴至浏览器
原来所有信息都在这个包里面了!!!
找到所有id构造URL,requests获取即可。
下拉找到原帖id=131599
接着就是获取最新帖子id。
特么我在这又兜圈了!因为帖子是随时更新的,想着可以一试selenium模拟浏览器。结果又定位失败,搞了好久决定先搁置。
</br>
先去获取和处理数据
仔细观察数据,发现string格式的,里面是一个dict,dict里面data又是一个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体质哎。。。):
没见过于是查资料,原来如此,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
终于搞定一切,接下来干点什么好?
这一次写爬虫,遇到不少问题,总结如下:
1、破解javascript动态网页(抓包)
2、json格式数据解析(json.loads())
3、在中文中匹配特定中文的正则表达式(先将关键词转换)
4、多个dict按照某一属性排序问题
(lambda函数和enumerate迭代器)
5、http连接太多没有关闭报错的问题
回去补补基础。
不过算是学会了抓包,这种东西简直有如神器。嘿嘿,本篇就是这样啦~
网友评论