htmlunit抓取动态网页(就是怎么用htmlunit爬虫工具来爬取京东页面下该类目下)
优采云 发布时间: 2022-01-24 18:07htmlunit抓取动态网页(就是怎么用htmlunit爬虫工具来爬取京东页面下该类目下)
由于是第一次使用爬虫爬取网页内容,对于一些特殊情况我不是很擅长处理。在这里,我将与您分享我遇到的一些情况。
public static String getPage(String s_url, String charset) {
if (s_url == null) {
return null;
}
try {
URL url = new URL(s_url);
BufferedReader bReader = new BufferedReader(new InputStreamReader(url.openStream(), charset));
String s;
StringBuffer sBuffer = new StringBuffer();
while ((s=bReader.readLine())!=null) {
sBuffer = sBuffer.append(s);
}
url = null;
return sBuffer.toString();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
上面的代码应该是最简单的获取网页源代码的方法了。您可以通过网页的url和编码方式直接获取网页的源代码,从而获得您想要的信息。但事情并不总是像想象的那么简单。目前的情况是这样的。我需要爬取的页面是京东三级分类下的商品信息。这种编码的结果都是乱码。后来在访问地址后面加上了?enc=utf-8,得到的页面终于没有乱码了,但是京东页面返回的结果却是“No product found”,真是心碎。如果大神知道如何解决这个问题,请告诉我。
好了,废话就说到这里,下面是如何使用htmlunit爬虫工具爬取京东页面
System.out.println("开始爬取页面了...");
//创建一个webclient
WebClient webClient = new WebClient(BrowserVersion.FIREFOX_24);
//htmlunit 对css和javascript的支持不好,所以请关闭之
webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setTimeout(10000);
try{
//获取页面
HtmlPage page = webClient.getPage("http://list.jd.com/list.html?cat=1620,1621,1627");
List divs = page.getByXPath("//div[@id='plist']");
HtmlDivision div = (HtmlDivision)divs.get(0);
HtmlUnorderedList ul = (HtmlUnorderedList)div.getFirstChild();
List lis = ul.getHtmlElementsByTagName("li");
for(int i = 0; i < lis.size(); i ++){
HtmlListItem li = lis.get(i);
String index = li.getAttribute("index");
if(index == null || "".equals(index))
continue;
//打印出页面中的商品所对应的skuid
System.out.println("第" + li.getAttribute("index") + "个商品的skuid=" + li.getAttribute("data-sku"));
}
//获取该类目下的商品总页数
List divs2 = page.getByXPath("//div[@id='J_bottomPage']");
HtmlDivision div2 = (HtmlDivision)divs2.get(0);
List b = div2.getHtmlElementsByTagName("b");
for(int i = 0; i < b.size(); i++){
String classname = b.get(i).getAttribute("class");
if(classname != null && !"".equals(classname)){
continue;
}
String pagetotal = b.get(i).getFirstChild().toString();
System.out.println("总页数为" + pagetotal);
}
System.out.println("哈哈");
}catch(Exception e){
e.printStackTrace();
}finally{
//关闭webclient
webClient.closeAllWindows();
}
如上,可以得到京东页面上该分类下所有产品的skuid和总页数。下一个问题很好解决~
htmlunit相关jar包下载地址: