最近打算做一些东西,数据积累是储备的第一步,因此就不可避免地要写爬虫,抓取网页上的有效信息。因为期待数据有一些话题,量又比较大,考虑到经常逛微博,而且微博的话题又恰好可能满足后续的需求,因此就决定抓取新浪微博的数据。
那么问题就来了:
问题1:用什么语言?最常用的是java,HttpURLConnection等类又可以很方便地通过get或post请求获取url的数据,所以就先用Java实现吧,后续再考虑用python尝试。
问题2:新浪微博数据抓取需要登录,而登录过程又需要一点复杂的分析过程。在网上搜了一些资料,不过都已经失效。又急于抓取,所以决定先采用设置cookie的方式,绕过登录过程;先抓取,然后再研究登录方法【新浪微博cookie的有效时间?一般是设置30分钟】。
(临时)解决了以上两个问题,就可以先开始第一步,获取页面内容。先从首页开始。
首页地址:http://weibo.com/u/1596867051/home?wvr=5&lf=reg
使用httpfox,监控登录过程中的每次请求。
注意第一条请求,也就是首页url的这条请求。这是一条Get请求[废话],在左下角的Headers中可以看到请求头部的内容,有效的就是Cookie这里,只要在抓取时,设置头部的cookie内容为这里的内容即可。到这里,就拿到了首页,下拉加载前的全部页面内容。
第二阶段:
怎样从页面源码中得到所需的信息?
1、看需求【这也是废话。。。】
我关注的是右侧榜单,大家都可以看到,右侧有“亚洲新歌榜实时趋势”,“热门话题”,电影热议榜,好友动态,明星势力榜。计划为,定期抓取“热门话题排行榜”内容,解析页面内容后存储所需数据至本地,然后做成接口,提供给app调用。
热门话题页面:http://d.weibo.com/100803?refer=index_hot_new
同首页一样,get请求,头部设置上述的cookie,得到源码。内容结构:包括1小时排行和24小时排行,先以抓取1小时的排行榜为例。每项内容包括排名:top1,2,3; 话题名称 #话题# 形式, 类别/标签(明星、电视节目、电视剧...一位在微博做数据挖掘工作的同学好像就负责做这个),话题简介:“大型时尚真人秀节目《中国超模》5月21日起每周四21:20@重庆卫视 首播”,阅读量 主持人; 下面的问题就是从html中提取出这些元素。
页面结构分析:firefox,查看页面元素结构。热门话题内容在<divclass="m_wrap clearfix">标签下,<ul class="pt_ulclearfix">列表中,每一个li是一条话题。所以先定位到这里,然后在做进一步的解析。看起来很容易,是吗?那么我就错了。很遗憾,直接抓取过来的结果并非像查看源码那样是很标准的html,抓渠道的内容是包含了js的。因此,需要分析JS请求每个话题的构成。很幸运,JS的结构仍然是比较容易识别的,每一条话题都是这样的一个javascript代码段:
<script>
FM
.view({
"ns" : "pl.content.miniTab.index",
"domid" : "Pl_Discover_Pt6Rank__5",
"css" : ["style/css/module/discover/DSC_pictext_b.css?version=156d8fd88e66bcf3"],
"js" : "page/js/pl/content/miniTab/index.js?version=5ea4401897bd1150",
"html" : "xxxxxx" //这里是一段很长的代码,封装了一条话题的所有信息,包括很多无用的数据
})
</script>
不得不说,是很乱。但只要抽取相关部分就可以了。基本思路就是根据html标签的对称结构,拿到每段话题的内容(如上面这段,娶到FM.view内,html属性下的值,然后再得到所需的排名、话题、阅读数字段数据)
2.1 话题内容截取
(1)获取所有符合要求的<script>代码段