卓越网翻页抓取不了怎么办

《怎样分级抓取》一文使用卓越网作为例子,但是,那篇文章定义的信息结构主题名demo_JY_mobile_list)并没有实现翻页抓取,而是只抓取当前页。最近,网购行业的竞争处于白热化状态,主要的在线购物网站在最近一段时间频繁改版,卓越网采用了大量javascript/js代码,做几个小实验就能发现一些有趣现象,例如:

  • 假设要抓取所有手机,样本页面是 http://www.amazon.com.cn/gp/search/ref=sr_nr_n_0?rh=n%3A664978051%2Cn%3A665002051&bbn=664978051&ie=UTF8&qid=1289961576&rnid=664978051 ,现在翻到第2页,第3页,第N页,再去看页面的源代码(用Firefox浏览器菜单“查看”-〉“页面源代码”),发现都是一样的,都是第一页。这样用普通的网络爬虫抓取网页源代码并从中提取价格等数据是行不通的。
  • 每次翻页时,第一行三个商品先显示,后面其它行的显示有些滞后。
  • 使用一些开发工具进行观察,鼠标在网页上移动时,频繁激发各种浏览器事件并伴随着DOM的修改。

因为MetaSeeker有强大的AJAX网页抓取能力,而且对是否采用AJAX是透明的,我们可以不去管卓越网页上Javascript是怎样实现的,还是像前面讲述的案例一样,进行数据映射和FreeFormat映射,由MetaStudio自动生成抓取规则。但是,我们还需要多设置一些选项,才能将AJAX显示出来的内容有效地抓取下来。所以,《怎样分级抓取》一文并没有讲解翻页抓取,因为如果不设置AJAX选项,翻页后无法抓到数据。

本文的抓取目标:

  • 样本页面:http://www.amazon.com.cn/gp/search/ref=sr_nr_n_0?rh=n%3A664978051%2Cn%3A665002051&bbn=664978051&ie=UTF8&qid=1289961576&rnid=664978051
  • 主题名:demo_JY_list_1(请注意下面的注释)
  • 要实现的抓取目标
    • 在商品列表网页抓取如下商品信息
      • 商品名:商品名称
      • 商品网页:显示商品详细信息的网页地址,这个地址有很多用处,例如,用做导航,以便执行多级采集
      • 市场价格:卓越给出的市面价格
      • 卓越价格:卓越的优惠价。
    • 翻页抓取


注释1:如果设置了AJAX抓取选项,那么信息结构的加载过程稍有区别,请阅读本文的相关章节

注释2:目标网站的网页结构可能会改变,一些重大改变将影响信息结构的可用性,如果发现某些信息属性定位失败,请参照《修改失效的抓取规则》调整信息属性的映射关系

本文并不是入门教程,如果您不熟悉MetaStudio和DataScraper的操作方法,请按顺序阅读《MetaSeeker速成手册》



1 抓取卓越网数据的规则


图1

抓取规则由MetaStudio自动生成,用户只需要在MetaStudio的Bucket Editor工作台上进行数据映射和FreeFormat映射即可。如图1,有下面的步骤:

  1. 选择产品列表中第一个商品作为样例
  2. 为所有四个信息属性进行数据映射和FreeFormat映射,详细参看《抓取当当百货价格》《抓取京东商城商品价格》
  3. 卓越网商品列表网页被组织成多个块,例如,第一行三个商品属于一个块,中间多行商品属于另一个块,最后一行三个商品属于第三块,如果察看HTML DOM结构,就能清楚地看到这一点。本步做的FreeFormat映射是为了抓取第一块的多实例。
  4. 本步所作的FreeFormat映射有两个目的:1,为了精确定位,详细参见《抓取新蛋网商品价格》;2,为了定位多个信息块(见第上步)

注释:第4和第3步作的FreeFormat映射分别从“块”的角度和从“商品”的角度分别抓取多实例,从中可以看出MetaSeeker抓取多维数据的端倪,这是MetaSeeker区别于其它网站抓取软件的显著优势,MetaSeeker以树状整理箱存储结构化抓取结果,可以存储无限维度的数据。



图2

图2显示抓取多维数据的情景,在Yahoo财经网站上抓取多只股票的对比信息,有下面三个维度:

  • 不同股票代码
  • 每只股票的特征数据
  • 抓取能够导航到指定股票的不同主题的网页的超链接

关于怎样抓取多维数据将在专门的教程中讲解。



2 翻页抓取卓越网的规则


图3

图3显示超链接抓取规则的定义过程,即线索映射,详细说明请参见《批量抓取当当网价格数据》,下面只简单罗列各步骤:

  1. 选择翻页标志“下一页
  2. 创建记号线索,记号,即标志,此例指“下一页
  3. 将这个线索设置成线内线索,只用于翻页,而不存储超链接。
  4. 线索映射,指明在网页的什么范围抓取含有上述记号的线索
  5. 记号映射,是一种快捷操作,让MetaStudio自动填写记号值记号节点

至此,信息结构基本上定义完了,可以按照《抓取当当百货价格》介绍的方法保存信息结构。但是,这个信息结构生成的抓取规则还不能抓取卓越网,因为卓越网用AJAX显示商品信息,需要做一些额外的配置。



3 配置AJAX抓取模式


图4

图4显示配置AJAX模式的菜单,可以设置两种模式的某一个或者同时设置。下面简单讲解一下两种模式的含义,如果想详细了解AJAX抓取原理,请在GooSeeker网站上搜索“AJAX”,可以看到大量文章。

  • 延长模式:选择该模式后,DataScraper判断“网页内容是否加载完了”的标准就改变了,能够明显感受到DataScraper等待的时间延长了。延长模式没有必要总是设置,但是对某些网站是必须的,例如,新浪微博上显示的评论数和转载数是在网页加载完后才使用AJAX方法显示出来,我们将在新浪微博抓取案例中详细讲解。
  • 积极模式:选择该模式后,DataScraper不再等待“网页内容是否加载完了”才开始抓取,而是积极地去尝试,只要网页上有了需要的数据就启动抓取过程,但是,DataScraper有一套机制确保抓取多实例时不发生遗漏。积极模式也不一定总设置,但是在某些网站上,用户点击超链接或者按钮,浏览器并没有加载一个新网页,而是局部修改网页的DOM,此时,网站抓取器找不到判断“网页内容是否加载完了”的标准,只有积极地去测试。

虽然延长模式和积极模式看起来对DataScraper的速度有相反方向的影响,但是实测结果是DataScraper总体速度变慢了,因为网页要用Javascript/JS来来回回发送很多HTTPRequest消息,这要花很多时间。另外,如果感觉难于准确选择延长模式和积极模式,不妨同时设置,牺牲一点速度,换来简单性。



4 怎样加载AJAX信息结构

如果想使用MetaStudio编辑以前定义的信息结构,需要加载它。设置了AJAX抓取模式后,加载过程有稍许变化。


图5

图5有如下步骤:

  1. 转到MetaStudio的Schema List工作台
  2. 输入查询条件并回车,可以含有通配符
  3. 选中信息结构,点击鼠标右键,弹出菜单,选择菜单项“加载
  4. 看到一个弹出框,提醒用户该信息结构还没有加载完成,只有选择了菜单“文件”-〉“后续分析”才算完成
  5. 在执行后续分析之前,可以看到工具条上没有显示主题名和整理箱名
  6. 不要急于执行后续分析,要等到浏览器上显示了被抓取的信息才执行,否则会加载失败。

注意:连续加载两个使用相同样本页面的信息结构会失败,观察MetaStudio底端的状态条,能够看到MetaStudio加载过程停顿了,状态条上没有显示“完成”字样。这是MetaStudio的bug,要避免,或者重启MetaStudio后再加载同一个信息结构。



5 对抓取过程的影响

基本上不影响DataScraper的执行,详细操作过程说明参见《批量抓取当当网价格数据》,如果使用周期性自动化批量抓取模式,在指令文件中有几个选项与AJAX有关,可以做适当的调整,但不是必须的,详细参见《周期性抓取调度文件》

Comments

抓取新浪新闻评论的问题

我在抓取新浪新闻评论数遇到以下问题:
我是使用两级来抓取的,一级用来获得新闻的url,二级来抓取新闻的标题和评论,时间等信息。
问题1:
有些新闻页面的构造不同,造成Datascraper一直停顿在那个构造不同的页面上,不继续执行,请问Fuller这个问题怎么解决呢?
问题2:
新闻的评论数是动态生成的,按照本文中的方法设置了延长模式和积极模式,但是有些新闻的评论数没下载下来,并不是没有评论数。这是怎么回事?
很期待您的回复,谢谢
主题:新浪新闻详细

抓取JS动态内容

主题 新浪新闻详细 ,“评论人数”是JS动态加载的字段,那么就应该给这个字段设置key特性,并且设置延长模式和积极模式

另外,这个信息结构要尽量使用FreeFormat映射,增加定位精度和适用度

遇到不认识的网页结构后,DataScraper会等到超时,可以将超时时间设置短一些,或者为这个页面定义一个信息结构,与当前信息结构采用相同主题名,但是不同辅名

抓取评论时的问题

在使用DataScrape 抓取时,会产生两类错误:
1. Timeout to load the page. 这个错误是否可以通过延长超时时间来解决?
2. Suitable data schema cannot be found for clueid 222931 in 0st inthread cyclye. 这种错误的数量很多,这是什么导致的?怎么解决呢?
是不是因为有些新闻没有评论数,也就无法定位评论数信息属性,从而导致这个问题?能不能将没有新闻评论的新闻也抓取下来,无法定位的信息属性使用默认值呢?
怎么解决这个问题呢?
非常感谢您的回复。对我帮助很大

分析抓取失败原因

MetaStudio菜单“编辑”-〉“信息结构”-〉“加载”-〉“按线索”,输入失败的线索号,比如222931,就能看到MetaStudio加载信息结构并用它来分析这个网页,会告诉你哪个信息属性映射不上。

如果确实是评论数这个信息属性无法定位,那么,就不要设置key特性,这样没有评论数的网页也能抓取。但是,有评论数却加载比较慢的,就有可能漏掉这个数字。可以通过设置滚屏参数,让抓取慢一些,可以避免漏掉。

Timeout to load the page不一定是超时时间不够。当设置了AJAX选项后,即便信息结构不符合,也会等到超时,所以,还是要找出信息结构不符合的原因

问题解决了!

很高兴您耐心的回复。 通过去掉评论数的key特性,然后设置滚屏参数,可以解决,但就如你所说抓取速度很慢!因为大多数(95%左右)是新闻是有新闻评论的, 我想有没有更好的办法: 首先对有新闻设置key特性,然而对没有评论数的新闻,不让Datascraper提示Suitable...错误,而是让它下载除了评论数之外的数据呢?这样就可以不设置滚屏参数了,节省了很多的时间,有这样的解决方法吗?

key特性没有弹性

除非增加一个新的特性,而key特性表示一定要抓取得到,靠这点来判断网页结构是否符合信息结构。滚屏的屏数可以设置的小点

关于url问题

信息属性在设置clue时,href属性不是完整的地址,没有主页部分,结果导致二级无法找到网页的问题,这个怎么解决呢?比如 <a href="/shop/4794643" class="BL" title="表妹靓点餐厅" kid="123503" onclick="document.hippo.ext({cl_i:1,cl_a:20,cl_k:123503,query_id:'8a0bb8ce-9df8-4762-981b-095938e8eb5a'}).mv('cl_to_s',4794643);"
data-hippo-type="shop"
target="_blank"
rel="nofollow">表妹靓点餐厅</a>
可以看到href属性没有完整的url地址,从而无法正确的作为线索,有什么方法能够j解决吗?

二级线索自动补齐URL

二级无法找到网页不会是这个问题引起的,抓取第一级的时候会自动补齐URL才生成二级线索

模式问题

延长模式是datascraper等待“网页内容加载完了”进行抓取,而积极模式是DataScraper不再等待“网页内容是否加载完了”才开始抓取,而是积极地去尝试,只要网页上有了需要的数据就启动抓取过程。那么,延长模式和积极模式结合的话,到底是等待网页内容加载完了没有,这两个结合起来的模式和它们各自分开的时候相比有什么不同的地方?

网页抓取模式

两种模式分别使用两个不同的检查条件,如果条件满足,就进行抓取。您解释的检查条件是对的。如果两种模式都设置,那么任何一个条件满足了就启动抓取