自动滚屏抓取新浪微博

微博是一种新媒体和通信工具,上面有大量值得挖掘的信息,首先需要将微博的内容抓取下来。单从微博的网页结构来说,上面的数据具有很规整的语义结构和元数据,所以,对于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

用MetaSeeker抓取微博数据有限制么

调用新浪微博的API抓取数据是有频次等等的限制,接口升级之后很多信息都抓不到了,但是MetaSeeker就可以抓取,想问一下这中间有什么不同么?我还没具体搞清楚,能否麻烦了解的朋友解释一下,谢谢了

MetaSeeker是网页抓取

MetaSeeker是网页抓取,不通过API,网页上能看到什么就抓什么。也不能简单地下结论说MetaSeeker抓取不受限制。虽然软件没有用量限制,但是被抓的网站会计数,抓的多了就会用一些限制手段,比如,出现验证码,或者暂时封锁账号。为了应对这种情况,要想办法分散流量,让每台计算机在一天里面不要抓取太多网页,方法有:
1,过一段时间重新换一下IP地址
2,过一段时间把MetaSeeker停下来,换一下微博账号(登录微博的账号)
3,做上述事情的时候可以同时手工清除所有cookie
4,同时部署多台计算机,同时运行MetaSeeker,每台计算机分担的工作少一些

如何同时抓取微博用户主页多个部分的信息

抓取微博内容已经可以成功抓取了,但是在抓取微博内容列表的同时想要同时抓取该页面的粉丝数、微博数和关注数等,我自己试过定义完之后就所需要的信息属性都能抓到,但只能抓到一条微博内容,无法同时将整个微博内容列表抓下,这种应该怎么解决呢?要分级抓取么?谢谢

问题已经解决了

创建一个嵌套的整理箱,形成树状的结构就可以了直接全部抓取了~~

可以套用一个规则给其它线索

一个规则定义好以后,可以套用给其它结构相同的网页,不用重新定义规则。

有很多方法可以录入线索,如果少量几个,可以用这个接口 http://www.metacamp.cn/datastore/manageclue.htm

针对某一网页的抓取规则是否能应用到别的类似网页

比如抓取新浪某一用户的微博信息,定义了该用户主页微博信息的抓取规则之后,这个规则是不是不能用到其他用户主页的微博信息抓取中?如果想抓取另一个用户主页的相同内容,是不是要重新定义该用户的数据采集规则?

提问:关于微博抓取时“加载中”的解决方法

您好,请问:在抓取微博数据的时候,整页的信息加载不全如何克服?
手动下拉可以经过两次加载看到整个页面,但上面的代码还停留在第一次加载之前,以至于显示不了“下一页”而无法翻页
所以即使等待加载后完毕,下一页显示出来了,但是点击映射时,无法找到“下一页”的位置
谢谢 O(∩_∩)O~

手工刷新DOM

等待一段时间后还没有加载完,可以点击菜单“文件”-〉“刷新DOM”,这样就不会遇到找不到节点的问题了。

在定义信息结构的时候,要尽量做到:
1)拉动内嵌浏览器的卷滚条,往下滚屏,让所有内容显示完。很多内容不滚动到那里是不显示的
2)尽量等待加载完,否则如果信息结构已经定义了一半,网页才加载完,会自动执行一次DOM刷新,就会与已经做的映射有冲突
3)新浪微博会不断刷新DOM,应该在定义信息结构前,选择菜单“文件”-〉“禁止JS”,否则会因为DOM自动刷新后有些节点被删除了导致崩溃

新浪微博抓取问题

你好,在新浪微博抓取信息时,设置样例复制或Freeformat后,转发数和评论数都抓取的是转发数,而不设置这两个,可以正常抓取。我看了一下代码,新浪微博的转发数和评论数的class值和结构基本一样,请问,有什么方法可以解决这个问题吗?谢谢

DataScraper用不了

我在metastudio里面定义好了,打开DataScraper,打开主题点提取的时候老是提示我Failed: Crawl cannot be initiated from the state of FAILED请问是什么原因呢

DataScraper的连接状态

DataScraper窗口中部有个状态面板,最右端有两个服务器的连接状态,如果显示绿色图标,表示连接成功,如果不是绿色图标,表示连接失败。

DataScraper以前正常运行过吗?帐号申请到后过了多久了?

我以前运行过,这几

我以前运行过,这几天同样出现这个问题

试用期有限制

通常有三个月,到期就连不上了

谢谢Fuller!问题已解决,但是新浪微博翻页仍然不好

我直接在设置信息属性时,将key和block一起点上了,freeformat映射时,直接将微博内容全部扒下来了,哇哈哈~但是翻页的时候翻两页就停了,不知道哪篇文章是教怎么继续翻的·······谢谢~谢谢啦!

是否继续翻页的问题

没有一个专门的文档讲这个问题,主要做如下检查:

1,如果只翻了两页,那可能是第二页上的翻页链接定位不对,那么在MetaStudio上验证一下第二页是否符合信息结构。也就是说,在MetaStudio上加载了信息结构后,在URL网址输入处输入第二页的网址,或者在MetaStudio的内嵌浏览器中翻到第二页,选择菜单“文件”-〉“分析页面”,如果没有弹出错误窗口,就表示第二页也符合,就要找其它原因了

2,微博上采用大量Javascript代码用于动态显示内容,那么就需要设置AJAX抓取选项。而且网络爬虫连互联网的带宽必须足够,最好是ADSL,否则可能会出现一些通信失败造成翻页失败。

再观察DataScraper的日志窗口中有什么提示

设置积极模式后到第二页可以自动滚屏了,但是滚一点就停了。

怎么延长第二页的滚屏时间?

抓取AJAX网页的几个参数

如果用crontab.xml控制,那么timerTriggered不要设置,将scrollMorePages设置大一些lazyCycle设置大一些,都可以延长滚屏时间

请问为什么抓取新浪微博时只能抓取到两条呢?

我打开了一个用户的微博页面,运用的是freeformat来抓取多个实例,也建立了线索,但是在点击了MAP和test this,输出结果当中也只有一个,但是并没有报错,在datacraper中抓取时也未有错误,但是最后结果却只抓了两条,不知道是freeformat的节点选错了还是怎么回事?谢谢!

检查FreeFormat是不是唯一的

有些@id是消息的id,全局唯一,这种不能用,否则只能抓取一条,要调整以下FreeFormat映射,看看是否达到预期

抓取新浪微博速度有

抓取新浪微博速度有点慢,都有哪些优化放法?

哇,回的好快!!谢谢!!

我选择freeformat的时候选择的是定位之后上面的一个节点,而且我看每个定位处都是同样的class,比如定位“内容”时,我找到的class就是content,不知道这样都为什么还是抓不了~~~

主题名是什么?

告诉我主题名,我们检查一下

Fuller好,请看下新浪weibo5

在Metastudio里面输出信息完整,但是Datascraper中抓到一半就停止了,是怎么回事呢???

抓取新浪微博的速度不要太快

如果长期抓取,一定要限制单机抓取的速度,否则,新浪微博会采取一些封锁措施。

如果想提高速度,可以运行多个线程。新浪微博网页上有很多javascript代码,很消耗cpu和带宽,所以,要用高档一些的电脑,用ADSL宽带

能直接在图形界面上

能直接在图形界面上调lazycyle参数吗?

界面上设置不了lazyCycle

必须用crontab.xml设置

翻页之后还会自动滚屏吗?怎么设置?

爬取新浪微博,按照步骤设置了自动滚屏和翻页,第一页可以滚屏并且可以翻到第二页,但是到了第二页就不会自动滚屏了,导致信息没显示完,更严重的是第二页页面中的下一页没有滚出来,导致不能翻页。急求解决方案,万分感激。

我也是一直被这个问

我也是一直被这个问题缠住很久了…
哎,可惜版主忙啊…没能赐教…

老版本抓新浪微博滚屏会变慢

老版本抓新浪微博的时候翻到第二页,滚屏就变慢了,请下载最新版本。

如果网络状况差,滚屏抓取也会中断,必须调高lazyCycle这个参数,在crontab.xml文件中

fuller: 新版本已经下

fuller:
新版本已经下载了,而我真的尝试了非常多次了,包括crontab所有的参数可能的调整,都是不行,把额外滚屏设成60,延迟为1,lazy为25,都不行,跟没设的时候是同一个反应的。

因为我实在搞不懂,设置了crontab这个文件之后,打开datacraper时它会自动弹出一个框,这个框只有上面的浏览器窗口和下面的状态栏,线索名称和状态就都一直显示是unsigned,这个框我想就是针对那个crontab配置文件所弹出来的框吧?可是这个线程他根本不动啊?

然后再次用那个可以自己搜索主题名称的并手工提取的界面那里启动时,就出现了那个问题了,每次到第二页的时候剩余线索就会出现AGA_L和AGAIN这两个,不断交替,最后就停住了。

crontab.xml中的主题名设置不对

主题名设置不对的话就没有可用的线索,就处于unsigned

这里说的主题名是指

这里说的主题名是指在crontab里面《theme》标签的值吗?我上传好一个名为“王力宏2”的主题之后,把crontab的这个值改好了,然后打开datascraper,就出现那种unsigned的情况了,是不是可能我在其他什么地方操作不对?

您在例子当中给出的crontab编写范例,有两个step name=craw的片段,是必须这样的吗?

step名字不能改

step的名字是确定的,不能改。thread的名字可以随便起,theme标签中的名字一定要与目标主题一致。每个线程有个参数start,单位是秒,不要太长,否则很久不运行

用Firefox打开crontab.xml,看看是否能够打开。

然后看看日志:datascraper.log.txt,看看有没有报错。

谢谢你!这么一说真的有问题

我打开firefox,然后直接把crontab拖到界面上去,它就提示打开错误:
XML解析错误:未组织好
位置:file:///C:/Users/TY/.datascraper/crontab.xml
行:14,列:15: ￿����1
--------------^

我发现自己编写了cront

我发现自己编写了crontab.xml文件之后,启动datascraper的时候它会自动多跳出一个窗口,可是这个窗口只有浏览器窗口还有下面的线程状态指示栏,也不会自动运行,不知道这个窗口的用处是什么的呢?也还是要在那个原本的datascraper的窗口里搜到想要执行的主题的名字,然后手动启动提取的吧??

我刚才又定义了一个主题“杨幂的新浪微博修正”,crontab.xml的格式也完全按照标准的来写了,在这里贴出来。可是依然是会中断…

杨幂的新浪微博修正

杨幂的新浪微博修正
60000
15
false
80
true
-1
-1
false
0
1
50

我刚刚到服务器上下

我刚刚到服务器上下了最新的版本,然后按照同样的方法设置了一个主题“姚晨的新浪微博8”,然后在crontab.xml里,把lazy参数设为了10,但依然出现了那个问题,就是翻到第二页的时候就不行了,直接跳到第三页,第三页翻到中途就断了,请指教!

我测试的结果很好

lazyCycle用12,我是4M ADSL,如果网速很慢,可以再提高这个值。

<step name="crawl">
<theme>姚晨的新浪微博8</theme>
<loadTimeout>60000</loadTimeout>
<lazyCycle>12</lazyCycle>
<updateClue>true</updateClue>
<dupRatio>100</dupRatio>
<scrollWindowRatio>2</scrollWindowRatio>
<scrollMorePages>6</scrollMorePages>
<depth>3</depth>
<width>-1</width>
<renew>false</renew>
<period>0</period>
</step>

如果想一直翻页到底,depth设置为-1

原来我对crontab.xml没读仔细

Q1:
在《周期性网页抓取调度文件》这个文档中,给出了crontab的编写格式,在那个文档里面,有两段的内容,是不是其实只用一段就可以了,带lazyCycle的那一段?

Q2:
在编写的时候,是不是要把
project_list_design.www.sxsoft.com


project_list_design.www.sxsoft.com

这个片段里面的都改成我现正在执行的主题名称?

Q3:
标签的name属性需要修改吗?还是说可以任意值?

Q4:
我在《周期性网页抓取调度文件》这个文档里对于启动线程和抓取多少个主题的关系理解得不清楚,意思是不是在这个xml里可以配置多个主题的参数,配置了多少个主题,启动datascraper的时候就会弹出多少个独立的对话框?
比如说我有A到E五个主题要抓取,那么在crontab里面,我需要编写5个不同的thread对吗?还是说在一个thread里可以同时放下多个不同的theme?

问题有点多而且杂,望见谅!

多线程

xml中,每个thread一个线程,在独立的窗口中运行。theme要改成你的主题名,而thread的name任意起,但是不能重名。多个thread并行执行,一个thread中可以有多个theme,他们是顺序执行。thread不要太多,视自己的计算机的处理能力而定,还跟服务器的服务速度有关。

我在您的邮箱里发了

我在您的邮箱里发了我“杨幂的新浪微博修正”的crontab的完整文件过去,能否帮忙指正???问题正如邮件里描述的那样,谢谢!

很感谢你在出差时仍抽空回复!

很感谢你在出差时仍抽空回复!

有两个小疑问:那个crontab.xml文件,我在指定的文件夹下面似乎并没有找到,是不是默认情况下它是不存在的?如果我自己创建了它就会按照里面设定的参数来运行?

还有就是:您说的修复了BUG的版本已经上线了吗?

谢谢!

刚修改了抓取新浪微博出现的bug

请从服务器上下载最新版本,这次修改了两个bug,一个是滚屏速度变慢问题,一个是大家通常没有遇到的问题:翻页抓取新浪微博的时候,翻到第二页开始,如果关闭DataScraper窗口,会导致崩溃。

crontab.xml需要手工建立

请问最新版本是指网

请问最新版本是指网址:http://www.metacamp.cn/goomaster/secure/releaselist.htm?language=zh&nego_client=MetaStudio&nego_version=4.10.0
上的4.11.10的最新那两个吗??

crontab.xml建立以后是对所有的任务都生效的对吗?以后每次执行提取之前都会去读这个XML的参数对吧?

那么针对最新的版本,是否要调整crontab。xml的参数?还是说默认不用建立就好?

crontab.xml是每次启动时读取

每次启动时,DataScraper将crontab.xml读进来,这次升级,crontab.xml中的参数不用变。现在是4.11.10版本

我在帮助里面看到我

我在帮助里面看到我之前的版本是v4.11.10.0011(2012.08.07-21.30),这个并不是最新版本?

这次升级是紧急升级,所以没有升小版本号

build号升了,如果是中文版,应该是V4.11.10.0016

谢谢你! 我设置了积

谢谢你!
我设置了积极模式后,的确在翻页之后可以继续滚屏了~!
可是同样是“杨幂滚屏2”这个主题,它在翻了一页之后,也就是把第一页和第二页的内容抓取完之后,就停下来了?我仔细看了我所定义的线索貌似是没错的啊,怎么会不能继续翻页了?
然后我又换了刚刚入门时的当当教程来试试,很奇怪的是翻了4,5页之后,又不往下翻了,datascraper的剩余线索那里显示:FIN

不知道这个是什么引起的?

翻页线索定位不准

选择MetaStudio菜单“配置”-〉“首选项”,里面有两个tab,选择“线索定位”那个tab,选择“偏好class”,再在Clue Editor工作台上点ViewSCE按钮,看到的线索定位XPath表达式更短,这样更不容易受影响。

如果还有中断,滚屏次数多一些,让程序多等一会,让“下一页”那个按钮有充分时间显示出来

谢谢您的解答! 我按

谢谢您的解答!

我按照您的方法,试了一下,创建了一个“杨幂的新浪微博3”的主题,我尝试抓取的内容很简单,就是每条微博的时间,我从杨幂的第二页开始抓取,设置的参数足够大,滚屏30次,延时1秒,从第2页翻到第3页的过程是很正常的,程序在抓取完第二页的所有信息之后按预期一样停在了第二页的页面得最低端,等待着30次滚屏用完然后翻页;而程序从第三页翻页到第四页的时候却完全么没停顿,抓取完第三页的信息之后直接翻到了第四页(而我打开第三页的XML文件,看到第三页的信息已经正确而完整地抓取了),到了第四页之后,翻滚了一定的次数后(显然次数不足30次),它就在某个地方中断了。

我开始以为是我的滚屏次数又不够多,我就直接把他改成了翻滚60次,可是依然出现同样的问题,而且查看第四页的XML文件发现,程序每次都在同一个地方中断的,就是抓完某条A微博的时间之后就中断了,不知道从第三页跳到第四页时出现的异常会不会是原因?或是其他的原因??

谢谢!

抓取新浪微博防止中断

周期性抓取指令文件中有个参数lazyCycle,可以将这个参数设置更大一些,就能有所改善。通常,如果网络速度慢一些,滚屏后没有及时显示出追加的内容,容易出现中断,设置这个参数后,可以等待更长时间。

这种情况下,提高滚屏次数没有帮助,通常滚屏次数设置为5-10就够用了,滚屏抓取新浪微博时,将lazyCycle提高,比如,6,可能让每次滚屏后等待更多时间。

另外,翻到第二页开始,滚屏会变慢,这也加剧了该故障,我们将尽早修改这个bug,让滚屏速度不要变慢