爬取虎牙之二:试用htmlunit模拟js爬取ajax页面

  • jsoup无法爬取动态的ajax界面,百度了许久之后有人说htmlunit等爬虫工具可以支持模拟浏览器行为,百度上查了htmlunit的简单用法,爬取虎牙直播分栏的js链接。模拟点击。获取点击后的下一个页面。
  • 有人说用htmlunit获取不到ajax的页面,答案是错误的,用htmlunit可以获取点击后的页面源码,但是使用很有条件,对于输出。他只能打印一个js行为,也就是如果你界面上有多喝动态生成的页面按钮比如2.3.4**下一个。你要做的只能选择一个。如果想选择遍历所有,看来还是要选择下一页,然后将下一页再从新执行同样的操作(我没有这样试过不知道行不行,我用的是另外方法)。想想就很烦,并且htmlunit加载js很慢,如果爬取效率特别低。但是代码以及测试简单给大家:
  • 有个重要点就是一定要有thread.sleep();可能js执行慢需要反应吧,没有这句话会经常抓不到。
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlAnchor;
import com.gargoylesoftware.htmlunit.html.HtmlPage;



public class HTMLunit {
	public static void main(String[] args) throws IOException, InterruptedException
	{
	
		final WebClient webClient = new WebClient(BrowserVersion.CHROME);

 
	 webClient.getOptions().setTimeout(2000);
	 //webClient.getOptions().getTimeout();
	 webClient.getOptions().setJavaScriptEnabled(true);
	 webClient.getOptions().setThrowExceptionOnScriptError(false);	 
	 webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
 webClient.getOptions().setActiveXNative(false); 
 webClient.getOptions().setCssEnabled(false); 
// 
 webClient.waitForBackgroundJavaScript(600*1000); 
 webClient.setAjaxController(new NicelyResynchronizingAjaxController()); 
 
	HtmlPage page=webClient.getPage("https://www.huya.com/g/wzry");	 
	Listanchors=page.getAnchors();
	//System.out.println(anchors);
	Listjsanchors=new ArrayList();
	for(HtmlAnchor anchor:anchors)
	{ String href=anchor.getAttribute("href");
	/*
	 * 抓取js的链接
	 */
		if(href.startsWith("javascript:"))
		{						
			{jsanchors.add(anchor);}
		}
		else if("#".equals(href))
		{
			if(anchor.hasAttribute("onclick"))
			{jsanchors.add(anchor);}
		}
	}
	HtmlAnchor t1=jsanchors.get(0);HtmlPage newpage=t1.click();Thread.sleep(1000);System.out.println(newpage.asText());	
//	for(HtmlAnchor anchor:jsanchors)
//	{		
//		 /*
//		 * 这段话会失败,因为htmlunit只能执行一次 会输出相同页
//		 */
//		Thread.sleep(600);
//		HtmlPage newpage=anchor.click();	
//		Thread.sleep(600);		
//		System.out.print(newpage.asText());
//		
//	}		
	}
}

输出:

大乔
孙膑
可筛选热门英雄啦!
美女 质量局
来一波5排好撒 Song 1623
绝迹国一Pro程,单排上王者~ 寒夜 1533
单排只用小乔-契约之战-狂铁 东辰-子轩 1527
我真的不da野,是野怪先动的手 LYG丶七鱼 1517
国服刘备,一天一个王者 袖天-狠人 1499
小贱;赔钱虎野区霸主 钻上星耀上王者 东辰-小贱 1497
新秀happy:中午跟佳哥,天才哥打五排 happy 1494

  • 虽然这种方式不太好,但是也能将就抓取小数据。也算是成功模拟了吧。
  • 对于这种低效率,出错大的抓取方式抓取大规模数据肯定是不行的。那么下篇就讲解如何抓取json文件(后台传来的数据源文件)。
    如果对后端、爬虫等感性趣欢迎关注我的个人公众号交流:bigsai

你可能感兴趣的:(爬取虎牙之二:试用htmlunit模拟js爬取ajax页面)