转自 http://blog.csdn.net/u013510614/article/details/50313931
抓取前端渲染的页面
随着AJAX技术不断的普及,以及现在AngularJS这种Single-page application框架的出现,现在js渲染出的页面越来越多。对于爬虫来说,这种页面是比较讨厌的:仅仅提取HTML内容,往往无法拿到有效的信息。那么如何处理这种页面呢?总的来说有两种做法:
- 在抓取阶段,在爬虫中内置一个浏览器内核,执行js渲染页面后,再抓取。这方面对应的工具有
Selenium
、HtmlUnit
或者PhantomJs
。但是这些工具都存在一定的效率问题,同时也不是那么稳定。好处是编写规则同静态页面一样。 - 因为js渲染页面的数据也是从后端拿到,而且基本上都是AJAX获取,所以分析AJAX请求,找到对应数据的请求,也是比较可行的做法。而且相对于页面样式,这种接口变化可能性更小。缺点就是找到这个请求,并进行模拟,是一个相对困难的过程,也需要相对多的分析经验。
对比两种方式,我的观点是,对于一次性或者小规模的需求,用第一种方式省时省力。但是对于长期性的、大规模的需求,还是第二种会更靠谱一些。对于一些站点,甚至还有一些js混淆的技术,这个时候,第一种的方式基本是万能的,而第二种就会很复杂了。
对于第一种方法,webmagic-selenium
就是这样的一个尝试,它定义了一个Downloader
,在下载页面时,就是用浏览器内核进行渲染。selenium的配置比较复杂,而且跟平台和版本有关,没有太稳定的方案。感兴趣的可以看我这篇博客:使用Selenium来抓取动态加载的页面
这里我主要介绍第二种方法,希望到最后你会发现:原来解析一个前端渲染的页面,也没有那么复杂。这里我们以AngularJS中文社区http://angularjs.cn/为例。
如何判断前端渲染
判断页面是否为js渲染的方式比较简单,在浏览器中直接查看源码(Windows下Ctrl+U,Mac下command+alt+u),如果找不到有效的信息,则基本可以肯定为js渲染。
这个例子中,在页面中的标题“有孚计算机网络-前端攻城师”在源码中无法找到,则可以断定是js渲染,并且这个数据是AJAX得到。
分析请求
下面我们进入最难的一部分:找到这个数据请求。这一步能帮助我们的工具,主要是浏览器中查看网络请求的开发者工具。
以Chome为例,我们打开“开发者工具”(Windows下是F12,Mac下是command+alt+i),然后重新刷新页面(也有可能是下拉页面,总之是所有你认为可能触发新数据的操作),然后记得保留现场,把请求一个个拿来分析吧!
这一步需要一点耐心,但是也并不是无章可循。首先能帮助我们的是上方的分类筛选(All、Document等选项)。如果是正常的AJAX,在XHR
标签下会显示,而JSONP请求会在Scripts
标签下,这是两个比较常见的数据类型。
然后你可以根据数据大小来判断一下,一般结果体积较大的更有可能是返回数据的接口。剩下的,基本靠经验了,例如这里这个"latest?p=1&s=20"一看就很可疑…
对于可疑的地址,这时候可以看一下响应体是什么内容了。这里在开发者工具看不清楚,我们把URLhttp://angularjs.cn/api/article/latest?p=1&s=20
复制到地址栏,重新请求一次(如果用Chrome推荐装个jsonviewer,查看AJAX结果很方便)。查看结果,看来我们找到了想要的。
同样的办法,我们进入到帖子详情页,找到了具体内容的请求:http://angularjs.cn/api/article/A0y2
。
编写程序
回想一下之前列表+目标页的例子,会发现我们这次的需求,跟之前是类似的,只不过换成了AJAX方式-AJAX方式的列表,AJAX方式的数据,而返回数据变成了JSON。那么,我们仍然可以用上次的方式,分为两种页面来进行编写:
-
数据列表
在这个列表页,我们需要找到有效的信息,来帮助我们构建目标AJAX的URL。这里我们看到,这个
_id
应该就是我们想要的帖子的id,而帖子的详情请求,就是由一些固定URL加上这个id组成。所以在这一步,我们自己手动构造URL,并加入到待抓取队列中。这里我们使用JsonPath这种选择语言来选择数据(webmagic-extension包中提供了JsonPathSelector
来支持它)。if (page.getUrl().regex(LIST_URL).match()) { //这里我们使用JSONPATH这种选择语言来选择数据 List<String> ids = new JsonPathSelector("$.data[*]._id").selectList(page.getRawText()); if (CollectionUtils.isNotEmpty(ids)) { for (String id : ids) { page.addTargetRequest("http://angularjs.cn/api/article/"+id); } } }
-
目标数据
有了URL,实际上解析目标数据就非常简单了,因为JSON数据是完全结构化的,所以省去了我们分析页面,编写XPath的过程。这里我们依然使用JsonPath来获取标题和内容。
page.putField("title", new JsonPathSelector("$.data.title").select(page.getRawText())); page.putField("content", new JsonPathSelector("$.data.content").select(page.getRawText()));
这个例子完整的代码请看AngularJSProcessor.java
总结
在这个例子中,我们分析了一个比较经典的动态页面的抓取过程。实际上,动态页面抓取,最大的区别在于:它提高了链接发现的难度。我们对比一下两种开发模式:
-
后端渲染的页面
下载辅助页面=>发现链接=>下载并分析目标HTML
-
前端渲染的页面
发现辅助数据=>构造链接=>下载并分析目标AJAX
对于不同的站点,这个辅助数据可能是在页面HTML中已经预先输出,也可能是通过AJAX去请求,甚至可能是多次数据请求的过程,但是这个模式基本是固定的。
但是这些数据请求的分析比起页面分析来说,仍然是要复杂得多,所以这其实是动态页面抓取的难点。
本节这个例子希望做到的是,在分析出请求后,为这类爬虫的编写提供一个可遵循的模式,即发现辅助数据=>构造链接=>下载并分析目标AJAX
这个模式。
PS:
WebMagic 0.5.0之后会将Json的支持增加到链式API中,以后你可以使用:
page.getJson().jsonPath("$.name").get();
这样的方式来解析AJAX请求了。
同时也支持
page.getJson().removePadding("callback").jsonPath("$.name").get();
这样的方式来解析JSONP请求。
相关推荐
Java爬虫WebMagic是开发者常用来抓取网页数据的一个强大工具,尤其对于处理静态页面,它的易用性和灵活性使得在Java开发环境中非常受欢迎。WebMagic的设计理念是模块化,这使得我们可以灵活地组合各个组件来实现不同...
WebMagic是一个轻量级的Java爬虫框架,它使得开发者能够快速、方便地实现网页抓取功能。本项目是关于如何使用WebMagic抓取CSDN(China Software Developer Network)博客的内容,并通过JDBC(Java Database ...
`PageProcessor`是WebMagic的核心,它定义了如何处理每个抓取到的页面。我们需要重写`process(Page page)`方法,解析HTML并提取所需信息。CSDN博客页面通常包含博客标题、作者、发布时间和内容等信息。我们可以使用...
4. **Scheduler**:管理待抓取的URL,决定下一个要抓取的页面。 在房源抓取中,我们可以配置PageProcessor来识别和提取网页上的房源信息,例如价格、位置、面积等。然后,这些数据可以通过定制化的策略加入到待抓取...
标题提到的"仿站 抓取前端的页面",暗示了我们可能需要获取网页的静态内容以及动态加载的数据,这通常需要借助于前端开发工具和网络爬虫技术。 首先,我们需要了解前端页面的基本构成。前端页面主要由HTML(超文本...
WebMagic 抓取数据和 Elasticsearch 实现房源搜索 WebMagic 是一个流行的 Java 爬虫框架,能够快速抓取网页数据。通过结合 Elasticsearch,能够实时存储和检索抓取的数据,实现房源搜索功能。本文将详细介绍如何...
WebMagic是一个开源的Java爬虫框架,其设计目标是简化爬虫开发,让开发者能够快速构建自己的网络抓取项目。这个框架的核心在于模块化的设计,它将爬虫分为四个主要部分:`PageFetcher`(页面获取)、`HtmlParser`...
WebMagic主要由四个组件构成:`Seeder`(种子生成器)、`PageProcessor`(页面处理器)、`Downloader`(下载器)和`Pipeline`(管道)。`Seeder`负责提供初始的URL,`Downloader`用于下载网页内容,`PageProcessor`...
爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL...
webmagic爬虫修复HTTPS下无法抓取只支持TLSv1.2的站点的bug后重新打包的jar,用这个替换原jar,在爬取HTTPS站点后就不会报错了。
WebMagic是一个开源的Java爬虫框架,它设计的目标是简化网页抓取的流程,使得开发者能够更加专注于数据的提取和处理。在这个例子中,我们利用WebMagic来抓取某个特定博客的所有文章标题,这是一个非常基础但实用的...
网站前端页面爬取工具是IT领域中用于自动化获取网页数据的重要工具,对于数据分析、网站镜像、搜索引擎优化等场景有着广泛的应用。本文将详细介绍这类工具的功能、工作原理以及相关技术。 首先,我们要理解什么是...
在本案例中,爬虫是用WebMagic框架构建的,它是一个强大的Java爬虫库,专为简化网页抓取而设计。WebMagic以其模块化的结构、易用性和灵活性著称,使得开发者可以快速构建自己的爬虫项目。 首先,我们要理解爬虫的...
抓取Ajax网页的难点在于,大部分Ajax请求在页面加载后由JavaScript异步发出,因此传统的HTTP请求方式无法获取到这些动态生成的内容。使用`WebBrowser`控件可以解决这个问题,因为它能够执行JavaScript代码,等待Ajax...
Phantomjs特别适用于那些需要对JavaScript渲染后的页面进行操作的情况,例如自动化测试、屏幕截图、网页抓取等。 #### 二、Phantomjs与Python结合的应用场景 在实际应用中,Phantomjs经常被用来处理那些普通HTTP...
AJAX(Asynchronous JavaScript and XML)允许网页在不重新加载整个页面的情况下与服务器交换数据并更新部分网页内容。在数据抓取时,如果目标网站大量使用AJAX,我们就需要模拟浏览器的行为,通过发送适当的HTTP...
通过以上步骤,我们可以创建一个能够抓取JavaScript渲染页面的Python爬虫。然而,需要注意的是,对于大规模、高性能的爬虫项目,可能需要考虑其他策略,如使用Headless浏览器(如Chrome的无头模式)、分布式爬虫架构...
这个例子可能展示了如何使Ajax内容对搜索引擎友好,确保页面的可索引性,这通常涉及到使用HTML5的`<link rel="prefetch">`或服务端渲染等技术。 2. **CSS** 是用于控制网页样式和布局的语言,它可以改变网页的颜色...
我们可以定义URL种子,WebMagic会按照预设的规则遍历这些页面,抓取所需内容。同时,WebMagic支持CSS选择器和正则表达式,使得提取网页信息变得简单。在本例中,我们将使用WebMagic抓取与交通领域相关的网页,并将...
WebMagic是一个强大的Java爬虫框架,它为开发者提供了一种简单高效的方式来抓取网页内容。这个项目基于"webmagic实现CSDN博客抓取并打印"的标题,显然是利用WebMagic来从CSDN(China Software Developer Network)的...