最近整理一下手头上搞过的一些爬虫,有HttpClients+jsoup,Jsoup,htmlunit,HeadlessChrome

一、HttpClients+jsoup,这是第一代比较low,很快就被第二代代替了!

二、Jsoup

需要的jar包:

 <dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.10.3</version>
</dependency>

代码如下:

 // 请求超时时间,30秒
public static final int TIME_OUT = 30*1000;
// 模拟浏览器请求头信息
public static Map<String,String> headers = new HashMap<String,String>();
static{
headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:55.0) Gecko/20100101 Firefox/55.0");
headers.put("Accept", "text/html");
headers.put("Accept-Language", "zh-CN,zh");
} //根据url获取html文档
protected Document getDoc(String url) throws IOException{
if(logger.isDebugEnabled())
logger.debug(url);
//新建一个连接
Connection conn = Jsoup.connect(url).timeout(TIME_OUT);
conn = conn.headers(headers);
conn = conn.proxy(Proxy.NO_PROXY);
Document doc = conn.get(); if(logger.isTraceEnabled()){
logger.trace("["+url+"]\n"+doc);
}
return doc;
}
 public static final String CHINAZ_ICP_URL = "http://icp.chinaz.com/?type=host&s=%s";
public List<String> doHandler(String domain) {
List<String> results = new ArrayList<String>();
String url = String.format(CHINAZ_ICP_URL, domain);
Document doc;
try {
doc = this.getDoc(url);
// 获取当前页ICP信息所在标签
Elements eles = doc.select("ul.IcpMain01>li:lt(7)>p"); if(null == eles || eles.isEmpty()){
return results;
}
//获取ICP信息
for (Element element : eles) {
//当前元素为认证信息时,跳过
if("safe".equals(element.attr("id"))){
continue;
}
Node firstNode = element.childNode(0);
if(firstNode.childNodeSize() > 0){
results.add(element.child(0).text());
}else{
results.add(((TextNode)firstNode).text());
}
}
} catch (IOException e) {
logger.error("get Chinaz ICP message error :",e);
}
doc = null;
return results;
}

参考Jsoup的文档:链接http://www.open-open.com/jsoup/

Jsoup不支持xpath解析,这个很蛋疼,但是有人去搞个一个支持xpath的东西---JsoupXpath,链接https://www.cnblogs.com/wanghaomiao/p/4899355.html,有兴趣的网友可以自己尝试一下!

三、htmlunit

支持Xpath解析,能够模拟浏览器动作,比如点击下一页,加载更多等等功能。文档链接:http://htmlunit.sourceforge.net/

需要的jar包

 <dependency>
<groupId>net.sourceforge.htmlunit</groupId>
<artifactId>htmlunit</artifactId>
<version>2.18</version>
</dependency>

代码如下:

 import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.TopLevelWindow;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlTableRow; import java.io.IOException;
import java.util.ArrayList;
import java.util.List; public class UrlTest { public static void main(String[] args) {
BaseCollector baseCollector = new BaseCollector();
WebClient webClient = baseCollector.getWebClient();
String url="http://htmlunit.sourceforge.net/";
HtmlPage homePage= null;
try {
homePage = webClient.getPage(url);
if (homePage != null && homePage instanceof HtmlPage) {
homePage.getEnclosingWindow().setName("IpHomePage");
System.out.println("打开 IPHomePage ");
System.out.println("内容是: "+homePage.getBody().getTextContent()); List<HtmlTableRow> htmlTableRows = (List<HtmlTableRow>) homePage.getByXPath("/html/body/pre");
if (htmlTableRows != null && htmlTableRows.size() > 0) {
for (int i = 0; i < htmlTableRows.size(); i++) {
HtmlTableRow htmlTableRow = htmlTableRows.get(i);
//日期
String firstTime = htmlTableRow.getCell(0).getTextContent().trim();
System.out.println(firstTime);
} }
closeWindowByName(webClient, "IPHomePage");
System.out.println("关闭 IPHomePage ");
}
webClient.close(); } catch (IOException e) {
System.out.println(e.getMessage()+" ===="+e);
}catch (FailingHttpStatusCodeException e){
System.out.println(e.getMessage()+" ===="+e);
}
System.out.println("内容是: "+homePage.getBody().getTextContent());
} public static void closeWindowByName(WebClient webClient, String name){
List<TopLevelWindow> list = webClient.getTopLevelWindows();
List windowNames = new ArrayList();
for (int j = 0; j < list.size(); j++) {
if(list.get(j).getName().equals(name)){
list.get(j).close();
}
windowNames.add(list.get(j).getName());
}
System.out.println("当前窗口 : {}"+list.toString());
}
}

四、HeadlessChrome

1,Headless Chrome 与PhantomJS对比

在 Chrome 未提供原生 Headless 模式前,Web 开发者可以使用 PhantomJS 等第三方 Headless 浏览器。现在官方准备提供 Headless 了,PhantomJS 维护者 Vitaly Slobodin 随即在邮件列表上宣布辞职。另一个流行浏览器 Firefox 也准备提供 Headless 模式。

2,什么是Headless Chrome

Headless Chrome 是 Chrome 浏览器的无界面形态,可以在不打开浏览器的前提下,使用所有 Chrome 支持的特性运行你的程序。相比于现代浏览器,Headless Chrome 更加方便测试 web 应用,获得网站的截图,做爬虫抓取信息等。

3,环境配置

首先需要下载chrome-driver,不同版本的Chrome对应不同的Chrome-driver,大家可以通过这链接下载对应的Chrome-driver       http://npm.taobao.org/mirrors/chromedriver/

支持各种elements的获取,List<WebElement> elements = driver.findElements(By.xpath("//*[@id=\"body\"]/ul[2]/li"));

可以模拟浏览器的各种动作,driver.findElement(By.linkText("下一页")).click();

使用Python来搞HeadlessChrome更方便简单,简直爽翻天。。。。。链接:https://blog.csdn.net/u010986776/article/details/79266448

大家可以参考一下

需要的jar包:

 <dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-chrome-driver</artifactId>
<version>3.11.0</version>
</dependency>

代码如下:

 import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions; import java.util.List;
import java.util.concurrent.TimeUnit; /**
* Created by sqy on 2018/5/2.
*/
public class HeadlessChromeTest { public static void main(String args[]) { //G:\chromedriver
System.setProperty("webdriver.chrome.driver","G:\\chromedriver\\chromedriver.exe");
ChromeOptions chromeOptions = new ChromeOptions();
// 设置为 headless 模式 (必须)
chromeOptions.addArguments("--headless");
// 设置浏览器窗口打开大小 (非必须)
chromeOptions.addArguments("--window-size=1920,1080");
WebDriver driver = new ChromeDriver(chromeOptions);
driver.get("https://lvyou.baidu.com/scene/s-feb/"); System.out.println("url: "+driver.getCurrentUrl()); for(int i=0;i<12;i++){
try {
/**
* WebDriver自带了一个智能等待的方法。
dr.manage().timeouts().implicitlyWait(arg0, arg1);
Arg0:等待的时间长度,int 类型 ;
Arg1:等待时间的单位 TimeUnit.SECONDS 一般用秒作为单位。
*/
driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
} catch (Exception e) {
e.printStackTrace();
}
//点击按钮
driver.findElement(By.linkText("下一页")).click();
List<WebElement> elements = driver.findElements(By.xpath("//*[@id=\"body\"]/ul[2]/li"));
for (WebElement el:elements) {
System.out.println(el.getText());
}
System.out.println("url: "+driver.getCurrentUrl());
} /**
* dr.quit()和dr.close()都可以退出浏览器,简单的说一下两者的区别:第一个close,
* 如果打开了多个页面是关不干净的,它只关闭当前的一个页面。第二个quit,
* 是退出了所有Webdriver所有的窗口,退的非常干净,所以推荐使用quit最为一个case退出的方法。
*/
driver.quit(); }
}

HeadlessChrome的webdriver是在selenium里面的所以很多功能可以通过查询java selenium 功能来查找自己想要实现的功能!

例如截屏功能

   //截图
File scrFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
try {
String savePath = "H:\\bbb\\screenshot.png";
//复制内容到指定文件中
FileUtils.copyFile(scrFile, new File(savePath));
} catch (Exception e) {
e.printStackTrace();
}

----------------------------------------------------若有不正之处,请谅解和批评指正,不胜感激!!!!!

Java 实现 HttpClients+jsoup,Jsoup,htmlunit,Headless Chrome 爬虫抓取数据的更多相关文章

  1. 玩爽了!直接在Chrome里抓取数据

    一个小测试发现可以自动做题,于是想通过脚本的方式看能不能获取相应的题库,刚好可以学习一下JS异步操作.花了一天时间,总算跑顺利了,遇到了不少坑.记录下来分享. 1.JS如何顺序执行 JS有强大的异步操 ...

  2. 直接在Chrome里抓取数据

    一个小测试发现可以自动做题,于是想通过脚本的方式看能不能获取相应的题库,刚好可以学习一下JS异步操作.花了一天时间,总算跑顺利了,遇到了不少坑.记录下来分享. 1.JS如何顺序执行 JS有强大的异步操 ...

  3. java抓取网页数据,登录之后抓取数据。

    最近做了一个从网络上抓取数据的一个小程序.主要关于信贷方面,收集的一些黑名单网站,从该网站上抓取到自己系统中. 也找了一些资料,觉得没有一个很好的,全面的例子.因此在这里做个笔记提醒自己. 首先需要一 ...

  4. Java模拟新浪微博登陆抓取数据

    前言:  兄弟们来了来了,最近有人在问如何模拟新浪微博登陆抓取数据,我听后默默地抽了一口老烟,暗暗的对自己说,老汉是时候该你出场了,所以今天有时间就整理整理,浅谈一二. 首先:  要想登陆新浪微博需要 ...

  5. selenium+chrome抓取数据,运行js

    某些特殊的网站需要用selenium来抓取数据,比如用js加密的,破解难度大的 selenium支持linux和win,前提是必须安装python3,环境配置好 抓取代码: #!/usr/bin/en ...

  6. Chrome 行情抓取插件

    Chrome 行情抓取插件 上班想偷偷摸摸看行情?自己动手写插件啊,尝试写了一个,新建文件夹,命名为StockMonitor,放入文件如下: 3个.png图标文件,19X19.48X48.128X12 ...

  7. Java Jsoup Spider抓取数据入库

    这里从车商网上进行数据抓取,请保持良好的职业道德不要将数据用于商业途径.工信部官网有汽车方面的公告目录,那里有最全的pdf或word数据,鉴于word和pdf解析的繁琐和耗时,我暂时用这个网站的数据进 ...

  8. jsoup使用样式class抓取数据时空格的处理

    最近在研究用android和jsoup抓取小说数据,jsoup的使用可以参照http://www.open-open.com/jsoup/;在抓纵横中文网永生这本书的目录内容时碰到了问题, 永生的书简 ...

  9. Java豆瓣电影爬虫——抓取电影详情和电影短评数据

    一直想做个这样的爬虫:定制自己的种子,爬取想要的数据,做点力所能及的小分析.正好,这段时间宝宝出生,一边陪宝宝和宝妈,一边把自己做的这个豆瓣电影爬虫的数据采集部分跑起来.现在做一个概要的介绍和演示. ...

随机推荐

  1. Android 4.1.2系统添加重启功能

    对于Android的的手机或者平板长期使用,感觉会出现慢的情况,所以偶尔还是需要重启一下,而长按电源键弹出的菜单又没有重启选项,所以特在此记录自己添加这个功能的过程. 首先关机的那个弹出菜单是在fra ...

  2. javascript加RoR实现JSONP

    我们知道不同域中的js代码受同源策略的限制,不同域中的AJAX同样受此限制,不过使用html中的script远程脚本可以跳过该限制,下面我们实际看一下利用RoR和js如何实现所谓的JSONP. 这里只 ...

  3. ruby用来发送互联网邮件

    其实只要你任性的可以,用telnet也是可以发邮件的哦.不过本猫没那么任性,还是用KISS原则来发邮件吧.本篇博文只介绍了如何发邮件,但没涉及收邮件的事,以后如有机会会单独开一篇博文介绍. ruby通 ...

  4. iOS 博客资源精选

    摘要:记录一些网上非常牛的人写的博文.收藏起来. 以备日后需要时学习备用. 1:iOS中UIWebView的Javascript与Objective-C通信 http://imchao.net/201 ...

  5. DataReport使用手记

    06年的一篇blog,转过来: 前几天,帮同事改一个VB的课业程序,具体任务就是在程序中添加报表功能,由于考虑到部署环境的问题,所以没有采用我以前惯用的Excel实现,而采用了同事提出的VB自带的Da ...

  6. jtds驱动更新对一个老问题的解决

    07年年末的一篇blog: 以前网站做初期开发时,有一个问题:hibernate下text大字符串读取时出这个异常:JDBCExceptionReporter - The amount of data ...

  7. CentOS, FreeBSD, Ubuntu LTS 维护风格的简单比较

    https://jackqq.wordpress.com/2014/06/24/centos-vs-freebsd-vs-ubuntu-lts/ 看到周围的人好多在用或者学 CentOS,忍不住也想看 ...

  8. PHP快速获取MySQL数据库表结构

    直接举例某个数据库中只有两个数据表,一个 test ,一个 xfp_keywords ,获取他们的数据库表结构. 此功能可以用于开发人员快速获取数据表结构通过获取的数据生成各种文件形式,用来快速理解数 ...

  9. ng-change事件中如何获取$event和如何在子元素事件中阻止调用父级元素事件(阻止事件冒泡)

    闲聊: 今天小颖要实现一个当改变了select内容后弹出一个弹框,并且点击select父元素使得弹框消失,这就得用到阻止事件的冒泡了:$event.stopPropagation(),然而小颖发现,在 ...

  10. C#语言中的XmlSerializer类的XmlSerializer.Deserialize (Stream)方法举例详解

    包含由指定的 XML 文档反序列化 Stream. 命名空间:   System.Xml.Serialization程序集:  System.Xml(位于 System.Xml.dll) 注意: 反序 ...