首页 > 编程语言 >(转)java爬虫 httpclient htmlunit selenium 比较

(转)java爬虫 httpclient htmlunit selenium 比较

时间:2022-12-06 10:14:50浏览次数:66  
标签:浏览器 htmlunit selenium js java httpclient

原文链接:https://blog.csdn.net/qq_34661726/article/details/80585659

简单介绍。

1 httpclient

httpclient 是 HttpClient 是 Apache Jakarta Common 下的子项目 ,支持常用的各种协议,相对比较底层,很多java项目的互联网编程都是依赖于该包 。

2 htmlunit

相当与一个没有ui的浏览器,本身就是对httpclient进行封装。

3 selenium

这个最早是基于firfox的自动化测试软件,现在也支持其他的浏览器,比如ie,chrome 等,同时提供了多语言的接口,如python,java 等,其功能是完全模仿浏览器行为,对于爬虫而言是最后的利器。

 

区别

可以说如果你的水平如果“足够好”,httpclient可以满足你的所有要求,因为爬虫本质上就是发请求,收结果,只要你写的请求报文和正常情况下发出去的是一样,你就可以收到正确的结果,而httpclient 完全可以自定义报文,那为什么还要使用htmlunit?

而且由于htmlunit 本身是对httpclient的封装,加上其有对于js,css等的加载,其运行速度相对要比httpclient 慢的多,看起来似乎没有优势。其实不然,导致htmlunit慢的主要原因就是在于对于js,css的加载 。很多时候这个是非常必要的。

使用f12 打开浏览器的开发者工具你会发现,有的网页生成的dom 树和你在查看网页源代码里看到的代码并不一样,原因是dom树是在源代码的基础上用js渲染了一遍。要想得到这个渲染后的dom树,只用httpclient是不行的,他只能看到源代码,这个时候就得使用htmlunit了。除此之外,htmlunit得到的htmlpage对象还可以执行js,通过这种方式,你可以获得js中保存在变量里的值,或者可以执行页面里的函数,可以完成常用的加密(模拟登陆时)等功能。

selenium相对而言则更暴力,他对于每一个浏览器提供不同的插件(htmlunit的也有),可以完全模仿人对于浏览器操作,在使用selenium时,你真的可以看到一个个页面的打开关闭,看到鼠标的移动,文字的键入,所以用selenium ,只要是人能在操作的,他都能做到,缺点就是速度是最慢的,而且你还得在电脑里安装相应的浏览器,要有专门的驱动程序(而且对于linux支持也不好)。

如何选择

从开发效率来说,应该是selenium>htmlunit>httpclient (htmlunit 对于js的支持不是特别稳定,有时候也会莫名其妙报错),但是代码运行的速度则是反过来的,尤其js加载和页面的仿真,慢的真的不是一点半点,所以在可以的情况下,尽量使用数度快的工具吧,比如你就是爬一个静态页面,用httpclient就很好,反之如果js很简单就用htmlunit 或者找到相应的js文件,用js引擎去执行,实在没办法了,再考虑selenium吧。至于3个具体工具怎么用,敬请期待
————————————————
版权声明:本文为CSDN博主「dhyana-c」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_34661726/article/details/80585659

 

标签:浏览器,htmlunit,selenium,js,java,httpclient
From: https://www.cnblogs.com/stepforeward/p/16954381.html

相关文章

  • java抽象类的定义和使用
    1.抽象类的规则●抽象类不可以被实例化,也就是不能被new,会出现编译错误。抽象类如果想实例化可以通过非抽象子类的方式去实现。●抽象类中不一定有抽象方法,但有抽象方......
  • Java常见面试题
    1. Java中sleep和wait的区别①这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类。sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用b的sle......
  • Java程序设计——从方法学角度描述
    Java程序设计——从方法学角度描述作者:化志章 揭安全 钟林辉出版社:机械工业出版社  一、程序设计语言概述1.1程序的含义和程序设计策略1.2程序设计语言的......
  • Java使用LinkedList模拟一个堆栈或者队列数据结构
    用Java模拟一个堆栈或者队列数据结构。首先得明白堆栈和队列的数据结构:堆栈:先进后出队列:先进先出LinkedList中刚好有addFirst()和addLast()方法。1.publicclassStac......
  • java 如何正确使用接口返回对象Result
    1.Result的使用Result的使用,是java项目中开发接口的必备,它经常被我们用作接口的返回对象,方便前端或者其他程序的远程调用后处理业务。它一般包括以下几个属性:code:一般......
  • java 获取真实ip
    通过HttpServletRequest获取真实请求IPpackagecc.library.security.utils;importjavax.servlet.http.HttpServletRequest;/***CREATEBYfunnyZpCON2018/5/3......
  • Java网络编程---基于TCP协议实现客户端服务端通信
    首先,对于TCP协议,我们要明确:TCP:传输控制协议TCP会尽自己所能,尽量将数据发送给对方;但并不能保证100%可以发送给对方TCP会在数据发送不到对方的情况下,会给应用......
  • JavaSE复习day1
    JavaSE复习day1胡家伟1.代码格式注释单行注释:通常用于解释方法内某单行代码的作用。多行注释:通常用于解释一段代码的作用。文档注释:通常用于生成Java开发文档。......
  • 用Java实现分布式缓存(1)——缓存淘汰
    本文代码https://github.com/weloe/Java-Distributed-Cache/tree/main/src/main/java/com/weloe/cache/outstrategyhttps://github.com/weloe/Java-Distributed-Cache/tr......
  • JAVA 实现多线程发售火车票
    publicclassdemo05{publicstaticvoidmain(String[]args){TicketWindowtw=newTicketWindow();newThread(tw,"窗口1").start();ne......