- 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