最近对网页的抓取进行了一些研究,针对于ajax生成的数据在源码中是无法呈现出来的,通过普通的网页爬取是采集不到的,因此需要一些特殊的处理。通过上网查找资料以及调查,在此简单的总结一下。我用的编程语言是Java。
1.对于简单的或者对性能要求不高的情况,我们可以通过一些工具来模拟浏览器来实现。如:Casperjs、HtmlUnit等。
最近简单的研究了一下casperjs,对于官方的文档我表示写的不太详细,对于初学者学习来讲,我觉得是有一定难度的而且对于它的传播来说也是不利的。但是还是感觉挺有意思的。我们可以按照他的语法来得到Document,甚至我们可以通过写js、jquery的代码来实现内容的提取。然后通过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(); }
} }
以上就是对最近几天研究的一点总结,比较浅显,还请高手们不吝赐教。 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|