爬取虎牙之二:试用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
    在这里插入图片描述
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

<p> <span style="font-size:14px;color:#337FE5;">【为什么学爬虫?】</span> </p> <p> <span style="font-size:14px;">       1、爬虫入手容易,但是深入较难,如何写出高效率的爬虫,如何写出灵活性高可扩展的爬虫都是一项技术活。另外在爬虫过程中,经常容易遇到被反爬虫,比如字体反爬、IP识别、验证码等,如何层层攻克难点拿到想要的数据,这门课程,你都能学到!</span> </p> <p> <span style="font-size:14px;">       2、如果是作为一个其他行业的开发者,比如app开发,web开发,学习爬虫能让你加强对技术的认知,能够开发出更加安全的软件和网站</span> </p> <p> <br /> </p> <span style="font-size:14px;color:#337FE5;">【课程设计】</span> <p class="ql-long-10663260"> <span> </span> </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 一个完整的爬虫程序,无论大小,总体来说可以分成三个步骤,分别是: </p> <ol> <li class="" style="font-size:11pt;color:#494949;"> 网络请求:模拟浏览器的行为从网上抓取数据。 </li> <li class="" style="font-size:11pt;color:#494949;"> 数据解析:将请求下来的数据进行过滤,提取我们想要的数据。 </li> <li class="" style="font-size:11pt;color:#494949;"> 数据存储:将提取到的数据存储到硬盘或者内存中。比如用mysql数据库或者redis等。 </li> </ol> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 那么本课程也是按照这几个步骤循序渐进的进行讲解,带领学生完整的掌握每个步骤的技术。另外,因为爬虫的多样性,在爬取的过程中可能会发生被反爬、效率低下等。因此我们又增加了两个章节用来提高爬虫程序的灵活性,分别是: </p> <ol> <li class="" style="font-size:11pt;color:#494949;"> 爬虫进阶:包括IP代理,多线程爬虫,图形验证码识别、JS加密解密、动态网页爬虫、字体反爬识别等。 </li> <li class="" style="font-size:11pt;color:#494949;"> Scrapy和分布式爬虫:Scrapy框架、Scrapy-redis组件、分布式爬虫等。 </li> </ol> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 通过爬虫进阶的知识点我们能应付大量的反爬网站,而Scrapy框架作为一个专业的爬虫框架,使用他可以快速提高我们编写爬虫程序的效率和速度。另外如果一台机器不能满足你的需求,我们可以用分布式爬虫让多台机器帮助你快速爬取数据。 </p> <p style="font-size:11pt;color:#494949;">   </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 从基础爬虫到商业化应用爬虫,本套课程满足您的所有需求! </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> <br /> </p> <p> <br /> </p> <p> <span style="font-size:14px;background-color:#FFFFFF;color:#337FE5;">【课程服务】</span> </p> <p> <span style="font-size:14px;">专属付费社群+定期答疑</span> </p> <p> <br /> </p> <p class="ql-long-24357476"> <span style="font-size:16px;"><br /> </span> </p> <p> <br /> </p> <p class="ql-long-24357476"> <span style="font-size:16px;"></span> </p>
<p style="font-size:16px;"> 涉及内容: </p> <p style="font-size:16px;"> 注意,学习此视频必须有一定基础的同学 </p> <p style="font-size:16px;"> 区块链相关知识、钱包相关知识、p2p相关知识、uniapp相关知识 </p> <p style="font-size:16px;">     01前言 </p> <p style="font-size:16px;">     02成果展示 </p> <p style="font-size:16px;">     03前言区块链概念和六层模型介绍 </p> <p style="font-size:16px;">     04翻译一个带币的js简单例子原理介绍 </p> <p style="font-size:16px;">     05区块链springboot工程搭建和区块相关实现 </p> <p style="font-size:16px;">     06区块链中加密算法相关介绍以及实现 </p> <p style="font-size:16px;">     07钱包相关实体类介绍 </p> <p style="font-size:16px;">     08redis数据库等配置和工具类的介绍 </p> <p style="font-size:16px;">     09区块链相关实体类介绍 </p> <p style="font-size:16px;">     10挖矿相关实体类和POW相关的介绍 </p> <p style="font-size:16px;">     11 p2p 点对点 server和client代码 </p> <p style="font-size:16px;">     12 p2p 原理的简单介绍 </p> <p style="font-size:16px;">     13 节点钱包相关启动实现 </p> <p style="font-size:16px;">     14 web控制层逻辑基础代码 </p> <p style="font-size:16px;">     15 web功能的整体介绍 </p> <p style="font-size:16px;">     16 web钱包功能-创建钱包账户的完整功能实现 </p> <p style="font-size:16px;">     17 web钱包功能-获取挖矿钱包信息和根据钱包地址获取信息 </p> <p style="font-size:16px;">     18 web钱包功能-获取当前节点所有钱包 </p> <p style="font-size:16px;">     19 全节点钱包轻钱包中心化钱包的概念 </p> <p style="font-size:16px;">     20 p2p三个节点的相关配置并启动 </p> <p style="font-size:16px;">     21 p2p 节点添加相关流程 </p> <p style="font-size:16px;">     22 p2p 节点列表相关实现 </p> <p style="font-size:16px;">     23 区块相关挖矿与挖矿奖励等讲解 </p> <p style="font-size:16px;">     24 区块链相关的查询操作 </p> <p style="font-size:16px;">     25 交易转账相关逻辑 </p> <p style="font-size:16px;">     26 三台机器节点运行 uniapp开发前准备 </p> <p style="font-size:16px;">     27 uniapp首页和我的页面实现 </p> <p style="font-size:16px;">     28 uniapp 节点钱包和节点钱包列表展示 </p> <p style="font-size:16px;">     29 uniapp添加节点,节点列表挖矿区块链查询等 </p> <p style="font-size:16px;">     30 uniapp我的钱包转账查询交易等 </p> <p style="font-size:16px;">     31 课程总结以及代码资料等相关说明 </p> <div> <br /></div>
<p> <span style="font-family:-apple-system, system-ui, 'PingFang SC', Helvetica, Tahoma, Arial, 'Microsoft YaHei', 微软雅黑, 黑体, Heiti, sans-serif, SimSun, 宋体, serif;font-size:12px;background-color:#ffffff;">1、系统全面介绍了Python的基础语法 </span> </p> <p> <span style="font-family:-apple-system, system-ui, 'PingFang SC', Helvetica, Tahoma, Arial, 'Microsoft YaHei', 微软雅黑, 黑体, Heiti, sans-serif, SimSun, 宋体, serif;font-size:12px;background-color:#ffffff;">2、在课程中融入了算法思想 </span> </p> <p> <span style="font-family:-apple-system, system-ui, 'PingFang SC', Helvetica, Tahoma, Arial, 'Microsoft YaHei', 微软雅黑, 黑体, Heiti, sans-serif, SimSun, 宋体, serif;font-size:12px;background-color:#ffffff;">3、帮助初学者厘清逻辑,掌握Python的主体脉络 </span> </p> <p> <span style="font-family:-apple-system, system-ui, 'PingFang SC', Helvetica, Tahoma, Arial, 'Microsoft YaHei', 微软雅黑, 黑体, Heiti, sans-serif, SimSun, 宋体, serif;font-size:12px;background-color:#ffffff;">4、从全方位立体角度解析知识点 </span> </p> <p> <span style="font-family:-apple-system, system-ui, 'PingFang SC', Helvetica, Tahoma, Arial, 'Microsoft YaHei', 微软雅黑, 黑体, Heiti, sans-serif, SimSun, 宋体, serif;font-size:12px;background-color:#ffffff;">5、实战案例驱动、课程包含近200个相关案例、边讲解边实操</span> </p> <p> <span style="font-family:-apple-system, system-ui, 'PingFang SC', Helvetica, Tahoma, Arial, 'Microsoft YaHei', 微软雅黑, 黑体, Heiti, sans-serif, SimSun, 宋体, serif;font-size:12px;background-color:#ffffff;"><br /> </span> </p> <p> <span style="font-family:-apple-system, system-ui, 'PingFang SC', Helvetica, Tahoma, Arial, 'Microsoft YaHei', 微软雅黑, 黑体, Heiti, sans-serif, SimSun, 宋体, serif;font-size:12px;background-color:#ffffff;"><img src="https://img-bss.csdnimg.cn/202107120808123109.png" alt="" /><br /> </span> </p>
©️2021 CSDN 皮肤主题: 代码科技 设计师:Amelia_0503 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值