最近整理一下手头上搞过的一些爬虫,有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. Media Player Classic - HC 源代码分析 4:核心类 (CMainFrame)(3)

    ===================================================== Media Player Classic - HC 源代码分析系列文章列表: Media P ...

  2. 学习Qt,Getting started

    在界面的设计中,现在用的比较多的是Qt和WPF(C#),以前的MFC已出现衰老趋势.本人最近在学习Qt,觉得很有用,遂决定将学习历程记录下来,或许有感于后之来者,不亦乐哉. 一.Hello Qt #i ...

  3. 【Qt编程】基于Qt的词典开发系列<五>--无边框窗口的拖动

    在上一篇文章中,我们讲述了如何进行无边框窗口的缩放与拖动,而在一些情况下,我们的窗口只需要进行拖动也不需要改变其大小,比如:QQ的登录窗口.本来在上一篇文章中已经讲述了如何进行窗口的拖动,但是却与窗口 ...

  4. Markdown语法及编辑器

    宗旨 Markdown 的目标是实现「易读易写」. 可读性,无论如何,都是最重要的.一份使用 Markdown 格式撰写的文件应该可以直接以纯文本发布,并且看起来不会像是由许多标签或是格式指令所构成. ...

  5. AndroidStudio加快Gradle速度的方法-android study之旅(103)

    方法1 打开setting,搜索compiler ,按照如图配置,不要问我为什么,宝宝心里苦~ 方法2 到开项目的根目录的gradle.properties ,把下面的注释解除 org.gradle. ...

  6. bash编程语法自我总结

    脚本2种执行方式: 1 直接执行,等于bash衍生一个子程序,当该子程序完成后,子程序内各项变量活动作不会传回父程序 2 利用source执行,直接在父程序中执行 X=/bin/xdo cmd 执行c ...

  7. The 13th tip of DB Query Analyzer, powerful processing EXCEL file

    The 13thtip of DB Query Analyzer, powerful processing EXCEL file MA Genfeng (Guangdong UnitollServic ...

  8. 实现Redhat Linux 6和Windows通过Windows Server AD统一认证并共享访问Oracle ZS存储系统

    Windows Server 2012 AD设置 1.  建立新的组织单位OU 为用户提前建立好OU,是为了AD用户管理简单清晰. 2.  建立新的用户和用户组 建立新的用户的时候,要同时将用户归属到 ...

  9. PuTTY的下载安装和基本使用方法教程

    PuTTY是一款开源(Open Source Software)的连接软件,主要由Simon Tatham维护,使用MIT许可证授权.包含的组件有:PuTTY, PuTTYgen,PSFTP, PuT ...

  10. java向上转型和向下转型1

    在java继承体系中,认为父类(超类)在上层,子类在下层(派生类) ,向上转型就是把子类对象转成父类对象. public class Father { public void eat(){ Syste ...