最新消息:

关于AJAX抓取页面的几篇文章

js代码 admin 5074浏览 0评论

一种Ajax网页内容的抓取方法及系统”专利   www.tecsoo.com下载

 

抓取AJAX网页的方法-Firefox组件,C#集成

现在AJAX的使用越来越广泛了,但是如果经常写网页抓取程序的人会发现,很多网页内容是通用AJAX进行加载的,实际抓取到的内容寥寥无几。

通过网络到处查找方法,发现用firefox浏览器能够正常把AJAX内容通过HTML呈现出来,那么是否意味着我们获取AJAX网页有希望了?

功夫不负有心人,进一步研究发现,firefox确实有一款C#组件,可以用C#集成到桌面程序中。

1)需要引用一个叫Skybound.Gecko.dll的文件。

2)此外还需要导入一个firefox支持的文件夹,代码如下:

Xpcom.Initialize(@”C:\xulrunner-1.9.1.14.en-US.win32.sdk\xulrunner-sdk\bin”);

xulrunner-1.9.1.14.en-US.win32.sdk这个文件夹比较大,压缩后都有二十多M,无法上传,可以去google一下,但是记得一定要搜这个名字,因为我试过其它的有些不能用。

3)直接指定URL就可以访问网站了,可以通过this.geckoWebBrowser1.Navigate(URL);来指定。还有很多功能,自己去发现吧。

如何抓取ajax加载的页面

ajax加载的页面,一般我们都是通过分析脚本和网络请求来有针对性的抓取采集页面,但是这个方法不太通用,每个页面都必须有针对性的写脚本抓取。 要想做的通用,只能通过浏览器上入手。windows上可以用程序调用IE的浏览器接口来获取页面document,还可以通过chrome或者 firefox插件形式来获取要采集的信息后post到服务器上。linux下可以通过phantomjs操纵webit来获取document的内容。
phantomjs项目地址 https://github.com/ariya/phantomjs/
phantomjs有好多优点:不依赖X,可以工作在文本模式下,官网里叫做headless;可以抓取页面截图;能监视网络传输;可以禁用图片加载;自定义cookie,自定义头信息等。

phantomjs编译安装:
sudo apt-get install build-essential chrpath git-core libssl-dev libfontconfig1-dev
git clone git://github.com/ariya/phantomjs.git
cd phantomjs
git checkout 1.8
./build.sh

由于源码里面带了webkit浏览器,所以编译时间比较长。
抓取天猫某商品示例

var page = require('webpage').create();
//id已经隐藏
page.open("http://detail.tmall.com/item.htm?id=xxxxxxxx", function (status) {
var shop = page.evaluate(function () {
return document.getElementById('shop-info').getElementsByTagName('h3')[0].innerText;
});
var title = page.evaluate(function () {
return document.getElementById('J_EditItem').parentNode.getElementsByTagName('a')[0].innerText;
});
var price = page.evaluate(function () {
return [document.getElementById("J_StrPrice").innerText, document.getElementById('J_PromoBox').getElementsByTagName('strong')[0].innerText];
});
console.log('店铺 ' + shop);
console.log('标题 ' + title);
console.log('价格 ' + price);
});

保存成test.js
执行 [phantomjs源码目录]/bin/phantomjs test.js,
输出结果:
店铺 xxx数码专营店
标题 包邮 优派KB855苹果G6造型笔记本 台式机IPAD iphone手机蓝牙键盘
价格 106.00,99.00

phanomjs还有nodejs的插件,可以用nodejs来控制,这样我们就可以把抓取的结果写入到nodejs支持的各种数据库中了。

scrapy抓取ajax请求的网页

在上一篇博客

http://zhouxi2010.iteye.com/blog/1450177

中介绍了用scrapy抓取网页,但是只能抓取普通html中的链接,对于ajax请求的网页却抓不到,但是实际应用中ajax请求又是十分普遍的,所以这里在记录下抓取ajax页面的方法.

仍然是spiders/book.py:

 

Java代码  收藏代码
  1. class BookSpider(CrawlSpider):
  2.     …………….
  3.     …………….
  4.     …………….
  5.     def parse_item(self, response):
  6.         hxs = HtmlXPathSelector(response)
  7.         item = BookItem()
  8.         ……..
  9.         ……….
  10.         #这里url是虚构的,使用时需要修改
  11.         url =  “http://test_url/callback.php?ajax=true”
  12.         request =  Request(url, callback=self.parse_ajax)
  13.         request.meta[‘item’] = item
  14.         #这里将ajax的url找出来,然后够找请求,框架执行请求收到返回后再回调
  15.         yield request
  16.     def parse_ajax(self, response):
  17.         data = response.body
  18.         #这里写正则匹配或者选择XPathSelector获取需要捕获的数据,略
  19.         ajaxdata = get_data(data)
  20.         #由于返回可能是js,可以采用python来模拟js解释器,不过这里偷懒就用json来进行转换
  21.         if ajaxdata:
  22.             x = ‘{“data”: “‘ + ajaxdata.replace(‘\n’, ”) + ‘”}’
  23.             ajaxdata = simplejson.loads(x)[‘data’]
  24.         else:
  25.             ajaxdata = ”
  26.         item = response.meta[‘item’]
  27.         item[‘ajaxdata’] = ajaxdata
  28.         for key in item:
  29.             if isinstance(item[key], unicode):
  30.                 item[key] = item[key].encode(‘utf8’)
  31.         #到这里一个Item的全部元素都抓齐了,所以返回item以供保存
  32.         return item

网络爬虫如何抓取web2.0 Ajax页面

伴随着AJAX/Web2.0的流行,如何抓取Ajax页面成了搜索引擎急需解决的一个问题,因为Ajax颠覆了传统的纯HTTP请求/响应协议机制,如果搜索引擎依旧采用“爬”的机制,是无法抓取到AJAX页面的有效数据的。

AJAX,也就是Asychronous Javascript and XML,由于采用了Javascript驱动的异步请求/响应机制,以往的爬虫们缺乏Javascript语义上的理解,基本上是无法模拟触发 Javascript的异步调用并解析返回的异步回调逻辑和内容。

另外AJAX的应用中,Javascript会对DOM结构进行大量地变动,甚至页面所有的内容都是通过Javascript直接从服务器端读取并动态绘制出来.这个对于”习惯了”DOM结构相对不变的静态页面,简直是无法理解的.

由此可以看出,以往的爬虫是基于协议驱动的,而对于AJAX这样的技术,所需要的“爬虫”引擎必须是基于事件驱动的。要实现事件驱动,首先需要解决下面几点问题

●Javascript的交互分析和解释

●DOM事件的处理和解释分发

●动态DOM内容语义的抽取

至于具体如何去实现,个人觉得Crawling Ajax-driven Web 2.0 Applications这篇论文很有参考价值。有兴趣地可以研究研究。

自动滚屏抓取新浪微博

Sat, 01/01/2011 – 15:18 — Fuller

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

schema_weibo_sina.preview
图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抓取模式

ajax_mode_weibo_sina.preview
图2

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


4 定义分页抓取规则

clue_weibo_sina.preview
图3

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

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

clue_pref_weibo_sina.preview
图4

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

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

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


5 自动滚屏抓取

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

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


6 设置滚屏参数

roll_weibo_sina
图5

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

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

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

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


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

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

Comments

Sun, 05/26/2013 – 18:21 — calien2

DataScraper用不了

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

Sun, 05/26/2013 – 21:38 — Fuller

DataScraper的连接状态

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

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

Mon, 05/20/2013 – 10:29 — zlslb

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

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

Mon, 05/20/2013 – 11:23 — Fuller

是否继续翻页的问题

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

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

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

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

Sat, 10/06/2012 – 10:14 — felix

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

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

Sat, 10/06/2012 – 22:37 — Fuller

抓取AJAX网页的几个参数

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

Thu, 05/16/2013 – 16:19 — zlslb

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

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

Thu, 05/16/2013 – 22:21 — Fuller

检查FreeFormat是不是唯一的

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

Mon, 10/08/2012 – 09:30 — felix

抓取新浪微博速度有

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

Fri, 05/17/2013 – 09:09 — zlslb

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

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

Fri, 05/17/2013 – 10:59 — Fuller

主题名是什么?

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

Mon, 05/20/2013 – 16:35 — zlslb

Fuller好,请看下新浪weibo5

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

Wed, 10/10/2012 – 10:48 — Fuller

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

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

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

Mon, 10/08/2012 – 08:39 — felix

能直接在图形界面上

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

Mon, 10/08/2012 – 09:03 — Fuller

界面上设置不了lazyCycle

必须用crontab.xml设置

Sun, 09/23/2012 – 23:11 — felix

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

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

Mon, 09/24/2012 – 00:02 — Allen_Tung

我也是一直被这个问

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

Mon, 09/24/2012 – 09:25 — Fuller

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

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

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

Mon, 09/24/2012 – 16:17 — Allen_Tung

fuller: 新版本已经下

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

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

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

Mon, 09/24/2012 – 20:34 — Fuller

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

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

Tue, 09/25/2012 – 00:25 — Allen_Tung

这里说的主题名是指

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

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

Tue, 09/25/2012 – 20:57 — Fuller

step名字不能改

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

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

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

Thu, 09/27/2012 – 09:30 — Allen_Tung

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

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

Thu, 09/20/2012 – 10:46 — Allen_Tung

我发现自己编写了cront

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

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

杨幂的新浪微博修正

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

Wed, 09/19/2012 – 15:21 — Allen_Tung

我刚刚到服务器上下

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

Wed, 09/19/2012 – 21:33 — Fuller

我测试的结果很好

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

Thu, 09/20/2012 – 09:56 — Allen_Tung

原来我对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?

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

Thu, 09/20/2012 – 20:15 — Fuller

多线程

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

Thu, 09/20/2012 – 22:55 — Allen_Tung

我在您的邮箱里发了

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

Tue, 09/18/2012 – 20:38 — Allen_Tung

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

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

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

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

谢谢!

Tue, 09/18/2012 – 23:41 — Fuller

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

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

crontab.xml需要手工建立

Wed, 09/19/2012 – 09:00 — Allen_Tung

请问最新版本是指网

请问最新版本是指网址: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的参数?还是说默认不用建立就好?

Wed, 09/19/2012 – 14:29 — Fuller

crontab.xml是每次启动时读取

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

Wed, 09/19/2012 – 14:47 — Allen_Tung

我在帮助里面看到我

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

Wed, 09/19/2012 – 21:23 — Fuller

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

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

Wed, 09/12/2012 – 16:52 — Allen_Tung

谢谢你! 我设置了积

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

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

Wed, 09/12/2012 – 21:30 — Fuller

翻页线索定位不准

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

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

Thu, 09/13/2012 – 09:19 — Allen_Tung

谢谢您的解答! 我按

谢谢您的解答!

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

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

谢谢!

Fri, 09/14/2012 – 22:37 — Fuller

抓取新浪微博防止中断

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

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

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

Mon, 09/10/2012 – 23:08 — Allen_Tung

关于额外滚屏参数的疑问

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

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

Tue, 09/11/2012 – 09:47 — Fuller

滚屏参数对每一页都有效

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

Wed, 09/12/2012 – 10:12 — Allen_Tung

翻页之后就滚不了屏了

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

Wed, 09/12/2012 – 16:37 — Fuller

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

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

Wed, 09/05/2012 – 21:37 — Allen_Tung

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

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

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

Wed, 09/05/2012 – 23:19 — Fuller

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

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

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

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

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

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

Thu, 09/06/2012 – 11:39 — Allen_Tung

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

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

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

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

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

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

Thu, 09/06/2012 – 11:50 — Fuller

设置block特性

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

Thu, 09/06/2012 – 09:22 — Allen_Tung

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

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

Thu, 09/06/2012 – 09:32 — Fuller

测试一下

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

Thu, 09/06/2012 – 08:48 — Allen_Tung

非常谢谢您这么及时

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

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

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

22

在上一篇博客

http://zhouxi2010.iteye.com/blog/1450177

中介绍了用scrapy抓取网页,但是只能抓取普通html中的链接,对于ajax请求的网页却抓不到,但是实际应用中ajax请求又是十分普遍的,所以这里在记录下抓取ajax页面的方法.

仍然是spiders/book.py:

 

Java代码  收藏代码
  1. class BookSpider(CrawlSpider):    
  2.     …………….  
  3.     …………….  
  4.     …………….  
  5.     def parse_item(self, response):    
  6.         hxs = HtmlXPathSelector(response)    
  7.         item = BookItem()    
  8.         ……..  
  9.         ……….  
  10.         #这里url是虚构的,使用时需要修改  
  11.         url =  “http://test_url/callback.php?ajax=true”  
  12.         request =  Request(url, callback=self.parse_ajax)  
  13.         request.meta[‘item’] = item  
  14.         #这里将ajax的url找出来,然后够找请求,框架执行请求收到返回后再回调  
  15.         yield request  
  16.   
  17.     def parse_ajax(self, response):  
  18.         data = response.body  
  19.         #这里写正则匹配或者选择XPathSelector获取需要捕获的数据,略  
  20.         ajaxdata = get_data(data)  
  21.   
  22.         #由于返回可能是js,可以采用python来模拟js解释器,不过这里偷懒就用json来进行转换  
  23.         if ajaxdata:  
  24.             x = ‘{“data”: “‘ + ajaxdata.replace(‘\n’) + ‘”}’  
  25.             ajaxdata = simplejson.loads(x)[‘data’]  
  26.         else:  
  27.             ajaxdata =   
  28.          
  29.         item = response.meta[‘item’]  
  30.         item[‘ajaxdata’] = ajaxdata  
  31.         for key in item:  
  32.             if isinstance(item[key], unicode):  
  33.                 item[key] = item[key].encode(‘utf8’)  
  34.         #到这里一个Item的全部元素都抓齐了,所以返回item以供保存  
  35.         return item  

转载请注明:jinglingshu的博客 » 关于AJAX抓取页面的几篇文章

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址