新浪微博转发评论翻页抓取方法

问题描述

最近,抓取新浪微博的转发或者评论的时候发现翻页不了,比如,样本页面:http://www.weibo.com/1764570453/B30DgfXaC?type=repost《MetaSeeker速成手册》中有很多关于新浪微博的抓取技巧,但是都不适用于这个网页的转发的翻页抓取。



原因分析

参照《MetaSeeker速成手册》定义好信息结构、做完映射,并将信息结构上载到服务器上,本例的主题名是weibo_sina_forward_12。然后运行DataScraper进行抓取,发现屏幕在刷新,但是没有翻页。

用MetaStudio的DOM视窗察看DOM结构,发现@class='WB_media_expand feed_repeat S_line1 S_bg4'的DIV有三个,只有第三个含有翻页链接,如下图。

MetaStudio自动生成的定位“下一页”的XPath是//*[@class='W_btn_c btn_page_next']/span[.//text()="下一页"],这个“下一页”标志在倒数第二个DIV中也有,但是,点击它没有反应。DataScraper运行的时候会使用遇到的第一个“下一页”链接,而这个是无效的,所以,翻页操作没有作用。



解决方案

可以手工调整MetaStudio自动生成的抓取规则文件。以前的版本只有企业版才能调整,从V4.11.12开始,在线版也能调整,而且可以即时验证调整后的规则是否合适。要手工调整抓取规则,必须按照以下步骤进行:

  1. 按照常规过程,定义信息结构并上载到服务器上
  2. 如果需要修改内容抓取规则,则
    1. Bucket Editor工作台上,点击MAP按钮,在下部的MAP文件标签窗口中可以看到生成的XSLT指令文件,
    2. 直接在这个编辑窗口中进行修改,
    3. 可以点击TestThis或者TestAll按钮进行验证,
    4. 最后,点击Save按钮将手工修改的内容抓取规则存到服务器上。
  3. 如果需要修改线索抓取规则,则
    1. Clue Editor工作台上,点击viewSCE按钮,在下部的SCE文件标签窗口中可以看到生成的线索抓取规则文件,
    2. 直接在这个编辑窗口中进行修改,
    3. 点击Save按钮将手工修改的线索抓取规则存到服务器上。
  4. 如果需要修改验证规则,则
    1. Filter Editor工作台上,点击viewDSD按钮,在下部的DSD文件标签窗口中可以看到生成的验证规则文件,
    2. 这个窗口不能编辑,而是在右侧,每个验证规则都有一个编辑框,修改其中的内容
    3. 点击Save按钮将手工修改的验证规则存到服务器上。

请注意,工作台上的MAP按钮,viewSCE按钮,viewDSD按钮都会重新生成抓取规则,而且是从映射关系中自动生成的,就会把手工修改的规则覆盖掉。点击工具条上的Schema或者Instruction按钮,都会把自动生成的规则存储到服务器上,只有用各个文件标签窗口的Save按钮才能把手工编辑的规则上载到服务器上,所以说,Save按钮要在最后用。


手工修改内容抓取规则

做完常规的内容抓取规则定义以后,就会发现自动生成的抓取规则只能适用于第一分页,到第二分页以后,DataScraper就会超时,在MetaStudio上,不要选择工具条上的反向选择复选框,那么,在内嵌浏览器上点击“下一页”,等翻到下一页后,选择菜单“文件”-〉“刷新DOM”,再勾上反向选择复选框,然后在内嵌浏览器上点击某条转发消息,DOM视窗中就能定位到那个DL节点,发现@class已经变成'comment_list S_line1',而不再是'comment_list S_line1 clearfix WB_feed_type'。所以自动生成的内容抓取规则到第二页就不适用了,下图是自动生成的定位表达式:

应该手工改成更通用的

点击TestThis或者TestAll进行验证后,点击Save存到服务器上。


手工修改线索抓取规则

前面已经说了原因,DataScraper总是自动定位到发现的第一个“下一页”标志上,这个是无效标志,必须禁止DataScraper用这个,那么就需要手工把定位表达式写的更复杂。自动生成的是:

   //*[@class='W_btn_c btn_page_next']/span//a[.//text()="下一页"]

如下图

应该手工修改成:

   //div[contains(@class,'WB_feed')]/div[contains(@class,'WB_feed_type')]
   /div[contains(@class,'WB_feed_datail')]/div[contains(@class,
   'WB_media_expand')][3]/div[@class='comment_lists']/div[@class=
   'W_pages_minibtn']/a[contains(@class, 'btn_page_next')]/span[text()=
   "下一页"]

这样就把定位规则写得很严,只能顺着这个路径找到定位标志,如下图


手工修改校验规则

既然已经手工修改了内容抓取规则,如果这个修改对应一个设置了isKey特性的信息属性,那么也需要修改校验规则。自动生成的校验规则是:

   count(//*[@class='comment_list S_line1 clearfix WB_feed_type' and count(./dd/a[position()=1]/text())>0])>0

在右边的编辑框中输入

   count(//*[contains(@class,'comment_list S_line1') and count(./dd/a[position()=1]/text())>0])>0

只要鼠标焦点移动到别的地方,修改即刻生效,如下图



关于信息结构加载

加载以前定义的信息结构后,再次生成各种抓取规则文件,那么都是自动生成的,并没有考虑手工编辑的规则文件,如果此时点击Schema或者Instruction按钮,就会用自动生成的文件覆盖手工修改过的文件,并不做任何提示,请使用时注意。