自动滚屏抓取新浪微博

微博是一种新媒体和通信工具,上面有大量值得挖掘的信息,首先需要将微博的内容抓取下来。单从微博的网页结构来说,上面的数据具有很规整的语义结构和元数据,所以,对于MetaSeeker这种旨在结构化网页数据的抓取工具来说,抓取微博的内容很容易。但是,从微博网站采用的编程技术来说,抓取微博又有很多障碍,最大的障碍是基于Javascript/JS的AJAX程序框架,导致网络爬虫很难在微博网站上爬行和抓取数据。但是,MetaSeeker具有很强的AJAX内容抓取能力,我们在《抓取AJAX网站》一文已经有所体验。本文将以抓取新浪微博为例,讲解MetaSeeker的一些重要特性。本文讲解的方法同样适用于抓取腾讯微博。

假设有下面的抓取目标:

  • 目的:抓取新浪微博,重复抓取,持续监控,进行Web数据挖掘,用于建设企业竞争情报系统或网舆监测系统
  • 样本页面:http://t.sina.com.cn/sharonchan
  • 主题名demo_sina_weibo
  • 抓取目标
    • 从微博列表中抓取下面的内容
      • 内容
      • 发布时间
      • 转发数
      • 点评数
    • 翻页抓取:如果定时重复监测第一页是否出现新内容,翻页抓取是没有意义的,但是,我们在本文还是定义了翻页抓取规则,仅为演示。

注释1:登录前和登录后看到的内容数量有差别,定义上述网站抓取信息结构(用于自动生成抓取规则)时,事先登录了新浪微博,所以读者如果要用MetaStudio加载体验该信息结构,请事先通过火狐浏览器完成登录,否则可能加载失败,详细说明参见下节。

注释2:抓取AJAX网站的信息结构的加载方法有点不同,请参考《分页抓取卓越网的商品》

注释3:本文不是入门教程,如果对MetaSeeker的基本操作方法不熟悉,请按顺序阅读《MetaSeeker速成手册》



1 登录新浪微博

如果不登录新浪微博,访问上述样本网页看到的微博信息条数要少很多,所以,在运行MetaSeeker之前先用Firefox访问新浪微博,完成登录。由于登录状态记录在cookie中,即便火狐浏览器退出了,在一定时间内登录状态还是有效的,在此期间运行MetaSeeker不用再次登录。



2 抓取新浪微博的规则


图1

图1显示了如下步骤:

  1. 转到Bucket Editor工作台
  2. 在内嵌浏览器上选择样例,如果打开了反向选择开关,则MetaStudio能够在DOM树视窗中自动定位对应的DOM节点,参见《抓取当当百货价格》
  3. 为各信息属性作数据映射和FreeFormat映射,以便MetaStudio自动生成抓取规则,参见《抓取当当百货价格》
  4. 为了抓取多条微博消息,即抓取多实例,进行FreeFormat映射,而且选择@class='MIB_linedot_l'作为FreeFormat标志。因为在网页上,多个HTML DOM节点具有这个class值,所以,可以用来抓取多实例。相反,因为@id一般在一个网页上是唯一的,所以,不能选择这个DOM节点的@id作为FreeFormat标志。详细描述参见《抓取京东商城商品价格》。如果不用FreeFormat映射,也可以使用样例复制品方法抓取多实例,参见《抓取当当百货价格》


3 设置AJAX抓取模式


图2

如图2所示,我们只选择了延长模式,而不像《分页抓取卓越网的商品》那样同时设置两个AJAX网页抓取模式,因为试验发现,转发数和点评数是在网页加载完成后才使用Javascript/JS程序从服务器异步加载的,所以,一定要设置延长模式。



4 定义分页抓取规则


图3

为了翻页抓取所有网页,需要定义线索抓取规则,而且应该设置成线内线索类型,详细操作步骤参见《批量抓取当当网价格数据》,本文只简单介绍一下步骤(如图3):

  1. 转到Clue Editor工作台
  2. 创建记号线索
  3. 选择记号“下一页
  4. 进行线索映射
  5. 进行记号映射
  6. 设置成线内线索


图4

图4显示了怎样设置线索定位的首选项,这一步不是必须的,但是这样做可以提高抓取规则的适应度,也就是说即使目标网页结构修改了抓取规则受到的影响尽量小。原理说明参见《选取合适的FreeFormat标志抓取Web页面》,另一个应用案例参见[1]

  1. 点击菜单“配置”-〉“首选项
  2. 在弹出对话框中选择线索定位标签(tab),从“偏好id”改成“偏好class”
  3. 观察MetaStudio自动生成的抓取规则文件,可以看到变化,定位记号“下一页”时就近采用@class='fanye MIB_txtbl rt'作为FreeFormat标志,这样可以提高抓取规则的适应性。

至此,信息结构定义完了,可以将它和自动生成的抓取规则一起上载到MetaSeeker服务器上,以便DataScraper随时随地使用这个抓取规则。很明显,信息结构定义过程与《分页抓取卓越网的商品》没有什么本质区别,但是,下面的章节我们可以看到需要更多高级技巧才能完整抓取新浪微博的内容。



5 自动滚屏抓取

用Firefox火狐浏览器阅读该样本网页上的微博消息时,如果网络速度不很快,会有一种特殊体验:微博消息很多,这个网页很长,需要拖动右侧的卷滚条滚屏才能看全所有消息,当网速比较慢时,滚屏时先看到文字,然后是图片,然后是转发数和点评数。后者是异步加载的,没有滚动到可见范围就不从服务器上下载这些内容。如果我们采用通常的抓取方法,势必只能抓取到前面几条消息的点评数和转发数,因此,必须要求DataScraper在抓取的时候自动滚屏。

这种情形不仅发生在微博网站上,有些网站的网页上有大量图片,为了提高网页下载速度,一般也是在滚屏时才下载图片,例如京东商城网站就是这样。



6 设置滚屏参数


图5

图5显示了设置滚屏参数的步骤:

  1. 打开全屏显示,DataScraper重新运行时或者启动多线程周期性抓取窗口时,DataScraper将占满整个屏幕,增大浏览器的可视范围,每屏显示的内容最多,以减少翻屏次数
  2. 选择滚屏参数菜单
  3. 在弹出对话框中输入滚屏参数。More Pages参数一定不能为0,否则就不会自动滚屏,具体滚多少,需要试验验证,详细说明参见《如何自动滚屏抓取AJAX网站数据》

如果采用周期性自动抓取模式,请参考《周期性抓取指令文件》修改crontab.xml文件的相关参数。

注释:本例将More Pages设置成15,当网络速度很慢的时候,也许30更合适,这样预留更多时间等待所有点评数和转发数加载上。



7 提高新浪微博的抓取速度

新浪微博上的照片尺寸很大,而且数量很多,下载时间很长,做Web数据挖掘系统时,图片一般不需要,如果能够阻止下载图片,将大大加快速度,如果您使用企业版,请参考《怎样提高抓取京东商城商品价格的速度》

Comments

关于额外滚屏参数的疑问

在抓取微博内容的时候,我要进进行翻页,额外滚屏参数设置了10,那么这个额外滚屏的参数是只指每一页,即:第一页,第二页……第N页,都同样生效吗?也就是说在每一页都会进行10次滚屏?

还是说这个滚屏参数是总的次数,比如说微博内容有20页,在抓取这20页内容的时候,总共只会滚屏10次?

滚屏参数对每一页都有效

如果设置10,则每一页都滚10屏

翻页之后就滚不了屏了

我创建了个主题名为:“杨幂滚屏2”的规则,然后真的试了很多次,发现滚屏的功能在第一页抓取的时候还是很正常的,可是翻了页之后到了第二页,就会停止在第二页的最开始的页面,无法自动滚屏,也无法抓取第二页的内容,急求指教啊!!!

新浪微博抓取需要设置积极模式

新浪微博很多网页翻页后并没有加载html,而是用javascript做内容修改,这样必须使用积极模式

关于使用Metastudio指定规则抓取新浪微博时出现的错误

关于使用Metastudio指定规则抓取新浪微博时出现的错误

我试了好多次,无论怎么制定规则,多简单的规则,只是抓取页面很简单的内容,点击MAP之后,它都提示Error: Cannot get theParent,实在不知道为什么。而且是很严重的出错,会让整个火狐崩溃退出,请指教啊!!!!!!

抓取新浪微博要注意的问题

新浪微博会自动刷新Firefox网页上的内容,目前MetaStudio不允许在定义信息结构的时候自动刷新网页,否则,会造成DOM节点重新排序,导致以前做的映射都失效了。

在新浪微博的某个博主的页面上,如果这个博主不断发新内容,可能正在定义抓取规则的时候博主发了新微博,就有这个问题。可以选一个不太活跃的博主网页作为样本页面

在新浪微博的搜索结果网页上,更容易出现这种情况。

一个解决方案是:将网页存为本地文件,然后,针对本地文件定义抓取规则。定义好以后,MetaStudio已经将信息结构上载到服务器上以后,在MetaStudio的url输入框中输入实际的网页地址,等新浪微博网页加载上后,选择MetaStudio菜单“文件”-〉“刷新DOM”,然后选择菜单“分析页面”,正常的话,分析成功。最后点击MetaStudio工具条上的instruction按钮,就为这个实际网址生成了一条线索。

存为本地文件的方法有两个:
1,选择Firefox菜单“文件”-〉“另存为”
2,选择Firefox菜单“工具”-〉“Web开发者”-〉“页面源代码”,然后将页面源代码存下来。

我找到问题所在了,同时又有另外一个问题要请教

我尝试抓取的是我自己的微博,而那个url貌似包含了些metastudio不能解析的片段,所以不成功,如果直接进入其他人的微博,weibo.com/(直接是别人的微博域名或者ID),就没问题了。

不过在制定抓取规则的时候又碰到了一个问题:新浪微博的内容在DOM树里面不是平面的而是由层次结构的,比如这样一条微博:

我在使用metastudio,@GOOSEEKER 很给力,@妈妈 也很喜欢用,【高兴的表情】

DOM树里面对应正文内容的P节点会被分成几部分,首先一个子节点代表”我在使用metastudio,“这一段普通文本,然后并列的一个子节点代表”@GOOSEEKER"这个特殊的元素,然后再一个子节点表示普通文本,然后再一个子节点表示@妈妈,然后再一个子节点表示”也很喜欢用“,然后再一个不同类型的子节点表示表示。

上述的子节点都是并列关系的,父节点都是P节点,而我想要把这段微博内容完整按顺序地抓取下来,到现在还是摸索不出方法,因为正如上面那条微博一样,表示普通文本的节点和表示@的节点都是交叉分割开的,不知道用什么方法来抓取规则可以让他们在抓取的时候按照正常的顺序显示????

设置block特性

在MetaStudio上,可以设置block特性,选择“全部节点”的话,就是将HTML片段存下来,如果选择“文本”,就将所有文本存下来。新浪微博上有很多@, #,都用不同的HTML节点存储,只有设置了block特性,比如,将所有文本存下来,然后再用程序将里面的@识别出来。

刚刚尝试了另存为本地文件再打开的方法,依然不行

如题,还是一模一样报同样的错误,求解决!万分感激!

测试一下

请告诉我要抓取微博上的什么内容,我测试一下。要抓取的内容可以用截图存下来,标记出来,可以通过email将截图发给我

非常谢谢您这么及时

非常谢谢您这么及时的答复!

将网页另存为本地文件的方法我暂时没试,因为我还不是很清楚到底是不是因为刷新的问题:我爬的是自己的微博,所以很确定没有在刷新我自己的页面或者是发新微博。

另外:如果将网页存为本地文件的话,怎么打开这个页面进行分析和规则提取????