加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ajax动态网页抓取学习总结

发布时间:2020-12-16 01:57:01 所属栏目:百科 来源:网络整理
导读:最近对网页的抓取进行了一些研究,针对于 ajax 生成的数据在源码中是无法呈现出来的,通过普通的网页爬取是采集不到的,因此需要一些特殊的处理。通过上网查找资料以及调查,在此简单的总结一下。我用的编程语言是 Java 。 1. 对于简单的或者对性能要求不高

最近对网页的抓取进行了一些研究,针对于ajax生成的数据在源码中是无法呈现出来的,通过普通的网页爬取是采集不到的,因此需要一些特殊的处理。通过上网查找资料以及调查,在此简单的总结一下。我用的编程语言是Java

1.对于简单的或者对性能要求不高的情况,我们可以通过一些工具来模拟浏览器来实现。如:CasperjsHtmlUnit等。

最近简单的研究了一下casperjs,对于官方的文档我表示写的不太详细,对于初学者学习来讲,我觉得是有一定难度的而且对于它的传播来说也是不利的。但是还是感觉挺有意思的。我们可以按照他的语法来得到Document,甚至我们可以通过写jsjquery的代码来实现内容的提取。然后通过java来调用这些脚本,将结果返回。或者我们可以直接调用它将完整的网页源码返回,然后通过模板来统一解析我们想要的结果。不过这种情况在网页的抓取上是秒级的。因此这种情况不能保证其性能。

2.第二种是对网页进行分析,模拟规则来提取所需的内容。

对于这一块对于初学抓取的我们来说,是有一定的难度的。而且对于网页的发出的请求,我们是需要借助一些工具的,如httpwatch。比如,你想对天猫的价格进行分析,可以先通过httpwatch来分析网页的请求,然后再定位到价格数据的请求链接,最后通过它来模拟请求得到数据,这样我们就提取到我们想要的内容了。

使用httpclient来爬取网页的内容是很快的,抓取效率在毫秒级。因此,从效率角度采用这种方式比较合适。但是从灵活性的角度来考虑问题的话,可能会有一定的限制。


补充:htmlunit 加载动态网页以提取天猫价格为例

package com.asiainfo.test;

import java.io.IOException;
import java.net.MalformedURLException;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import org.junit.Test;

import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController;
import com.gargoylesoftware.htmlunit.ProxyConfig;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.WebClientOptions;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlPage;

public class HttpUnitTest {
String url = "http://detail.tmall.com/item.htm?spm=0.0.0.0.HkxFxe&id=520129049356";

@Test
public void test2() {

// 指定浏览器,并指定浏览器模拟的版本;注:指定了浏览器的版本了之后,解析js就不报错了
WebClient webClient = new WebClient(BrowserVersion.CHROME);

// webclient参数载体
WebClientOptions clientOptions = webClient.getOptions();
ProxyConfig proxyConfig = new ProxyConfig();
proxyConfig.setProxyHost("proxy.asiainfo.com");
proxyConfig.setProxyPort(8080);

// 设置webClient的相关参数
clientOptions.setJavaScriptEnabled(true);
clientOptions.setCssEnabled(false);
clientOptions.setTimeout(10000);
clientOptions.setThrowExceptionOnScriptError(false);
clientOptions.setProxyConfig(proxyConfig);
webClient.setAjaxController(new NicelyResynchronizingAjaxController());

// 模拟浏览器打开一个目标网址
HtmlPage rootPage;
try {
rootPage = webClient.getPage(url);
// body html信息
HtmlElement htmlElement = rootPage.getBody();
String xmlContent = htmlElement.asXml();
System.out.println(xmlContent);

// 测试js生成的部分是否加载成功 注:天猫的价格是动态生成的
Document doc = Jsoup.parse(xmlContent);
Elements select = doc.select(".tm-price");
if (select != null && select.size() > 0) {
String text = select.get(0).text();
System.out.println(text);
}

} catch (FailingHttpStatusCodeException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

}
}


以上就是对最近几天研究的一点总结,比较浅显,还请高手们不吝赐教。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读