htmlunit 抓取网页

htmlunit 抓取网页

htmlunit 抓取网页(一下Gecco中的htmlunit中中 )

网站优化优采云 发表了文章 • 0 个评论 • 67 次浏览 • 2021-12-13 18:04 • 来自相关话题

  htmlunit 抓取网页(一下Gecco中的htmlunit中中
)
  2021SC@SDUSC
  简要解释GECCO中的htmlunit
  Htmlunit是一个开源Java页面分析工具。阅读页面后,您可以有效地使用htmlunit分析页面上的内容。该项目可以模拟浏览器的操作,称为Java浏览器的开源实现。这个没有界面的浏览器运行得很快。HTML单元使用rhino作为JavaScript的解析引擎
  下载
  
com.geccocrawler
gecco-htmlunit
x.x.x

  京东产品详细信息中的价格信息是通过Ajax异步请求获取的,该请求以前是通过@Ajax annotation实现的。这里,htmlunit用于自动化Ajax请求
  @Gecco(matchUrl="http://item.jd.com/{code}.html", pipelines="consolePipeline", downloader="htmlUnitDownloder")
public class JDDetail implements HtmlBean {
private static final long serialVersionUID = -377053120283382723L;
@RequestParameter
private String code;

@Text
@HtmlField(cssPath=".p-price")
private String price;

@Text
@HtmlField(cssPath="#name > h1")
private String title;

@Text
@HtmlField(cssPath="#p-ad")
private String jdAd;

@HtmlField(cssPath="#product-detail-2")
private String detail;
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getJdAd() {
return jdAd;
}
public void setJdAd(String jdAd) {
this.jdAd = jdAd;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDetail() {
return detail;
}
public void setDetail(String detail) {
this.detail = detail;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public static void main(String[] args) throws Exception {
HttpRequest request = new HttpGetRequest("http://item.jd.com/1455427.html");
request.setCharset("GBK");
GeccoEngine.create()
.classpath("com.geccocrawler.gecco.htmlunit")
//开始抓取的页面地址
.start(request)
//开启几个爬虫线程
.thread(1)
.timeout(1000)
.run();
}
}
  使用htmlunit的优点和缺点确实可以节省大量工作,但htmlunit也有许多缺点:
  1、效率低下。在使用htmlunit之后,下载程序应该一起下载所有JS并执行所有JS代码。有时下载一个页面需要5~10秒
  2、rhino引擎与JS的兼容性。Rhino兼容性仍然存在许多问题。如果爬网时不想看到这些错误日志输出,可以配置log4j:
  log4j.logger.com.gargoylesoftware.htmlunit=OFF 查看全部

  htmlunit 抓取网页(一下Gecco中的htmlunit中中
)
  2021SC@SDUSC
  简要解释GECCO中的htmlunit
  Htmlunit是一个开源Java页面分析工具。阅读页面后,您可以有效地使用htmlunit分析页面上的内容。该项目可以模拟浏览器的操作,称为Java浏览器的开源实现。这个没有界面的浏览器运行得很快。HTML单元使用rhino作为JavaScript的解析引擎
  下载
  
com.geccocrawler
gecco-htmlunit
x.x.x

  京东产品详细信息中的价格信息是通过Ajax异步请求获取的,该请求以前是通过@Ajax annotation实现的。这里,htmlunit用于自动化Ajax请求
  @Gecco(matchUrl="http://item.jd.com/{code}.html", pipelines="consolePipeline", downloader="htmlUnitDownloder")
public class JDDetail implements HtmlBean {
private static final long serialVersionUID = -377053120283382723L;
@RequestParameter
private String code;

@Text
@HtmlField(cssPath=".p-price")
private String price;

@Text
@HtmlField(cssPath="#name > h1")
private String title;

@Text
@HtmlField(cssPath="#p-ad")
private String jdAd;

@HtmlField(cssPath="#product-detail-2")
private String detail;
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getJdAd() {
return jdAd;
}
public void setJdAd(String jdAd) {
this.jdAd = jdAd;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDetail() {
return detail;
}
public void setDetail(String detail) {
this.detail = detail;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public static void main(String[] args) throws Exception {
HttpRequest request = new HttpGetRequest("http://item.jd.com/1455427.html";);
request.setCharset("GBK");
GeccoEngine.create()
.classpath("com.geccocrawler.gecco.htmlunit")
//开始抓取的页面地址
.start(request)
//开启几个爬虫线程
.thread(1)
.timeout(1000)
.run();
}
}
  使用htmlunit的优点和缺点确实可以节省大量工作,但htmlunit也有许多缺点:
  1、效率低下。在使用htmlunit之后,下载程序应该一起下载所有JS并执行所有JS代码。有时下载一个页面需要5~10秒
  2、rhino引擎与JS的兼容性。Rhino兼容性仍然存在许多问题。如果爬网时不想看到这些错误日志输出,可以配置log4j:
  log4j.logger.com.gargoylesoftware.htmlunit=OFF

htmlunit 抓取网页(使用本文中推荐的开源工具——HtmlUnit,一款能够模拟浏览器的抓包神器!)

网站优化优采云 发表了文章 • 0 个评论 • 56 次浏览 • 2021-12-06 11:06 • 来自相关话题

  htmlunit 抓取网页(使用本文中推荐的开源工具——HtmlUnit,一款能够模拟浏览器的抓包神器!)
  之前一峰写过一篇关于使用Jsoup爬取网页内容的文章文章:
  [Jsoup] HTML 解析器,轻松访问网页内容
  Jsoup提供的api非常方便,完全类似于JQuery操作,轻松抓取网页数据。但是Jsoup等普通爬虫工具的缺点是无法处理js生成的内容。
  做过Html开发的都知道,现在很多网站都大量使用ajax和JavaScript来获取和处理数据,普通的爬虫工具已经无法处理js中的内容了。
  比如我们在本地新建一个测试web文件text.html,源码如下:
  

main.html




a {
line-height: 30px;
margin: 20px;
}




var datas = [ {
href : "http://www.jianshu.com/p/8d8edf25850d",
title : "推荐一款编程字体,让代码看着更美"
}, {
href : "http://www.jianshu.com/p/153d9f31288d",
title : "Android 利用Camera实现中轴3D卡牌翻转效果"
}, {
href : "http://www.jianshu.com/p/d6fb0c9c9c26",
title : "【Eclipse】挖掘专属最有用的快捷键组合"
}, {
href : "http://www.jianshu.com/p/72d69b49d135",
title : "【IIS】Windows下利用IIS建立网站并实现局域网共享"
} ];
window.onload = function() {
var infos = document.getElementById("infos");
for( var i = 0 ; i < datas.length ; i++)
{
var a = document.createElement("a");
a.href = datas[i].href ;
a.innerText = datas[i].title;
infos.appendChild(a);
infos.appendChild(document.createElement("br"))
}
}


HtmlUnit 测试网页内容!




  通过IIS发布本地网站(参考易峰之前写的文章:
  【IIS】Windows下,使用IIS建立网站,实现局域网共享),
  网页在浏览器中显示的效果如下:
  网页展示效果.jpg
  虽然通过网页评论元素可以看到body收录了网页显示中的文本内容:
  网络评论元素.jpg
  但是,它根本无法通过 Jsoup 工具使用!从网页源码中可以看出,我们需要抓取的内容是在页面显示后通过ajax和JavaScript加载的。
  那么该怎么办?使用本文推荐的开源工具——HtmlUnit,一款可以模拟浏览器的抓包神器!
  在官网下载对应的jar包,添加到工程项目的lib中。简单的测试代码如下:
  import java.io.IOException;
import java.net.MalformedURLException;
import java.text.ParseException;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomElement;
import com.gargoylesoftware.htmlunit.html.DomNodeList;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
/**
* @author 亦枫
* @created_time 2016年1月12日
* @file_user_todo Java测试类
* @blog http://www.jianshu.com/users/1 ... icles
*/
public class JavaTest {
/**
* 入口函数
* @param args
* @throws ParseException
*/
public static void main(String[] args) throws ParseException {

try {
WebClient webClient = new WebClient(BrowserVersion.CHROME);
HtmlPage htmlPage = (HtmlPage) webClient.getPage("http://localhost/test.html");
DomNodeList domNodeList = htmlPage.getElementsByTagName("a");
for (int i = 0; i < domNodeList.size(); i++) {
DomElement domElement = (DomElement) domNodeList.get(i);
System.out.println(domElement.asText());
}
webClient.close();
} catch (FailingHttpStatusCodeException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}


}

}
  运行后,控制台打印结果:
  HtmlUnit 测试结果.jpg
  可见HtmlUnit可以抓取AJAX和JavaScript加载的内容。
  HtmlUnit的介绍在官网上很详细。以下内容为易峰翻译的部分内容,供大家参考:
  HtmlUnit 是一个基于 Java 的浏览器程序,没有图形界面。它可以调用 HTML 文档并提供 API,让开发者可以像在普通浏览器上操作一样访问 Web 内容、填写表单、单击超链接等。
  它可以很好地支持 JavaScript,并且仍在改进中。同时,它可以解析非常复杂的AJAX库,模拟不同配置下的Chrome、Firefox和IE浏览器。
  HtmlUnit 通常用于测试目的和检索 网站 信息。
  HtmlUnit 提供了很多用于测试网络请求和抓取网页内容的功能。可以到官网或者其他网站学习使用。 查看全部

  htmlunit 抓取网页(使用本文中推荐的开源工具——HtmlUnit,一款能够模拟浏览器的抓包神器!)
  之前一峰写过一篇关于使用Jsoup爬取网页内容的文章文章:
  [Jsoup] HTML 解析器,轻松访问网页内容
  Jsoup提供的api非常方便,完全类似于JQuery操作,轻松抓取网页数据。但是Jsoup等普通爬虫工具的缺点是无法处理js生成的内容。
  做过Html开发的都知道,现在很多网站都大量使用ajax和JavaScript来获取和处理数据,普通的爬虫工具已经无法处理js中的内容了。
  比如我们在本地新建一个测试web文件text.html,源码如下:
  

main.html




a {
line-height: 30px;
margin: 20px;
}




var datas = [ {
href : "http://www.jianshu.com/p/8d8edf25850d",
title : "推荐一款编程字体,让代码看着更美"
}, {
href : "http://www.jianshu.com/p/153d9f31288d",
title : "Android 利用Camera实现中轴3D卡牌翻转效果"
}, {
href : "http://www.jianshu.com/p/d6fb0c9c9c26",
title : "【Eclipse】挖掘专属最有用的快捷键组合"
}, {
href : "http://www.jianshu.com/p/72d69b49d135",
title : "【IIS】Windows下利用IIS建立网站并实现局域网共享"
} ];
window.onload = function() {
var infos = document.getElementById("infos");
for( var i = 0 ; i < datas.length ; i++)
{
var a = document.createElement("a");
a.href = datas[i].href ;
a.innerText = datas[i].title;
infos.appendChild(a);
infos.appendChild(document.createElement("br"))
}
}


HtmlUnit 测试网页内容!




  通过IIS发布本地网站(参考易峰之前写的文章:
  【IIS】Windows下,使用IIS建立网站,实现局域网共享),
  网页在浏览器中显示的效果如下:
  网页展示效果.jpg
  虽然通过网页评论元素可以看到body收录了网页显示中的文本内容:
  网络评论元素.jpg
  但是,它根本无法通过 Jsoup 工具使用!从网页源码中可以看出,我们需要抓取的内容是在页面显示后通过ajax和JavaScript加载的。
  那么该怎么办?使用本文推荐的开源工具——HtmlUnit,一款可以模拟浏览器的抓包神器!
  在官网下载对应的jar包,添加到工程项目的lib中。简单的测试代码如下:
  import java.io.IOException;
import java.net.MalformedURLException;
import java.text.ParseException;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomElement;
import com.gargoylesoftware.htmlunit.html.DomNodeList;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
/**
* @author 亦枫
* @created_time 2016年1月12日
* @file_user_todo Java测试类
* @blog http://www.jianshu.com/users/1 ... icles
*/
public class JavaTest {
/**
* 入口函数
* @param args
* @throws ParseException
*/
public static void main(String[] args) throws ParseException {

try {
WebClient webClient = new WebClient(BrowserVersion.CHROME);
HtmlPage htmlPage = (HtmlPage) webClient.getPage("http://localhost/test.html";);
DomNodeList domNodeList = htmlPage.getElementsByTagName("a");
for (int i = 0; i < domNodeList.size(); i++) {
DomElement domElement = (DomElement) domNodeList.get(i);
System.out.println(domElement.asText());
}
webClient.close();
} catch (FailingHttpStatusCodeException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}


}

}
  运行后,控制台打印结果:
  HtmlUnit 测试结果.jpg
  可见HtmlUnit可以抓取AJAX和JavaScript加载的内容。
  HtmlUnit的介绍在官网上很详细。以下内容为易峰翻译的部分内容,供大家参考:
  HtmlUnit 是一个基于 Java 的浏览器程序,没有图形界面。它可以调用 HTML 文档并提供 API,让开发者可以像在普通浏览器上操作一样访问 Web 内容、填写表单、单击超链接等。
  它可以很好地支持 JavaScript,并且仍在改进中。同时,它可以解析非常复杂的AJAX库,模拟不同配置下的Chrome、Firefox和IE浏览器。
  HtmlUnit 通常用于测试目的和检索 网站 信息。
  HtmlUnit 提供了很多用于测试网络请求和抓取网页内容的功能。可以到官网或者其他网站学习使用。

htmlunit 抓取网页(htmlunit网络工具一个没有没有 )

网站优化优采云 发表了文章 • 0 个评论 • 38 次浏览 • 2021-12-06 11:02 • 来自相关话题

  htmlunit 抓取网页(htmlunit网络工具一个没有没有
)
  1:背景
  我想用jsoup抓取一个页面,但是我抓取的数据总是不完整。然后我发现有些数据是在页面用js执行后渲染在页面上的,也就是说只有在执行js后才在数据页面上。会显示数据,但是jsoup无法实现执行页面的js。
  2:解决
  搜索后发现htmlunit网络工具可以执行js,相当于没有页面的浏览器。解决办法是先用htmlUnit发送网络请求,执行js获取页面,然后用jsoup转换成Document页面对象。然后用jsoup分析页面读取数据。
  3: htmlUnit 发送请求
   1 public static Document getDocument() throws IOException, InterruptedException{
2 /*String url="https://www.marklines.com/cn/v ... 3B%3B
3 Connection connect = Jsoup.connect(url).userAgent("")
4 .header("Cookie", "PLAY_LANG=cn; _plh=b9289d0a863a8fc9c79fb938f15372f7731d13fb; PLATFORM_SESSION=39034d07000717c664134556ad39869771aabc04-_ldi=520275&_lsh=8cf91cdbcbbb255adff5cba6061f561b642f5157&csrfToken=209f20c8473bc0518413c226f898ff79cd69c3ff-1539926671235-b853a6a63c77dd8fcc364a58&_lpt=%2Fcn%2Fvehicle_sales%2Fsearch&_lsi=1646321; _ga=GA1.2.2146952143.1539926675; _gid=GA1.2.1032787565.1539926675; _plh_notime=8cf91cdbcbbb255adff5cba6061f561b642f5157")
5 .timeout(360000000);
6 Document document = connect.get();*/
7 WebClient wc = new WebClient(BrowserVersion.CHROME);
8 //是否使用不安全的SSL
9 wc.getOptions().setUseInsecureSSL(true);
10 //启用JS解释器,默认为true
11 wc.getOptions().setJavaScriptEnabled(true);
12 //禁用CSS
13 wc.getOptions().setCssEnabled(false);
14 //js运行错误时,是否抛出异常
15 wc.getOptions().setThrowExceptionOnScriptError(false);
16 //状态码错误时,是否抛出异常
17 wc.getOptions().setThrowExceptionOnFailingStatusCode(false);
18 //是否允许使用ActiveX
19 wc.getOptions().setActiveXNative(false);
20 //等待js时间
21 wc.waitForBackgroundJavaScript(600*1000);
22 //设置Ajax异步处理控制器即启用Ajax支持
23 wc.setAjaxController(new NicelyResynchronizingAjaxController());
24 //设置超时时间
25 wc.getOptions().setTimeout(1000000);
26 //不跟踪抓取
27 wc.getOptions().setDoNotTrackEnabled(false);
28 WebRequest request=new WebRequest(new URL("https://www.marklines.com/cn/v ... 6quot;));
29 request.setAdditionalHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0");
30 request.setAdditionalHeader("Cookie","PLAY_LANG=cn; _plh=b9289d0a863a8fc9c79fb938f15372f7731d13fb; PLATFORM_SESSION=39034d07000717c664134556ad39869771aabc04-_ldi=520275&_lsh=8cf91cdbcbbb255adff5cba6061f561b642f5157&csrfToken=209f20c8473bc0518413c226f898ff79cd69c3ff-1539926671235-b853a6a63c77dd8fcc364a58&_lpt=%2Fcn%2Fvehicle_sales%2Fsearch&_lsi=1646321; _ga=GA1.2.2146952143.1539926675; _gid=GA1.2.1032787565.1539926675; _plh_notime=8cf91cdbcbbb255adff5cba6061f561b642f5157");
31 try {
32 //模拟浏览器打开一个目标网址
33 HtmlPage htmlPage = wc.getPage(request);
34 //为了获取js执行的数据 线程开始沉睡等待
35 Thread.sleep(1000);//这个线程的等待 因为js加载需要时间的
36 //以xml形式获取响应文本
37 String xml = htmlPage.asXml();
38 //并转为Document对象return
39 return Jsoup.parse(xml);
40 //System.out.println(xml.contains("结果.xls"));//false
41 } catch (FailingHttpStatusCodeException e) {
42 e.printStackTrace();
43 } catch (MalformedURLException e) {
44 e.printStackTrace();
45 } catch (IOException e) {
46 e.printStackTrace();
47 }
48 return null;
49 }
  4:返回的Document对象交给jsoup处理
  我这里只做了一个简单的输出,我检查了数据是否全部渲染完毕。
   1 Document doc=getDocument();
2 Element table=doc.select("table.table.table-bordered.aggregate_table").get(0);//获取到表格
3 Element tableContext=table.getElementsByTag("tbody").get(0);
4 Elements contextTrs=tableContext.getElementsByTag("tr");
5 System.out.println(contextTrs.size());
6
7
8 String context=doc.toString();
9 OutputStreamWriter pw = null;
10 pw = new OutputStreamWriter(new FileOutputStream("D:/test.txt"),"GBK");
11 pw.write(context);
12 pw.close(); 查看全部

  htmlunit 抓取网页(htmlunit网络工具一个没有没有
)
  1:背景
  我想用jsoup抓取一个页面,但是我抓取的数据总是不完整。然后我发现有些数据是在页面用js执行后渲染在页面上的,也就是说只有在执行js后才在数据页面上。会显示数据,但是jsoup无法实现执行页面的js。
  2:解决
  搜索后发现htmlunit网络工具可以执行js,相当于没有页面的浏览器。解决办法是先用htmlUnit发送网络请求,执行js获取页面,然后用jsoup转换成Document页面对象。然后用jsoup分析页面读取数据。
  3: htmlUnit 发送请求
   1 public static Document getDocument() throws IOException, InterruptedException{
2 /*String url="https://www.marklines.com/cn/v ... 3B%3B
3 Connection connect = Jsoup.connect(url).userAgent("")
4 .header("Cookie", "PLAY_LANG=cn; _plh=b9289d0a863a8fc9c79fb938f15372f7731d13fb; PLATFORM_SESSION=39034d07000717c664134556ad39869771aabc04-_ldi=520275&_lsh=8cf91cdbcbbb255adff5cba6061f561b642f5157&csrfToken=209f20c8473bc0518413c226f898ff79cd69c3ff-1539926671235-b853a6a63c77dd8fcc364a58&_lpt=%2Fcn%2Fvehicle_sales%2Fsearch&_lsi=1646321; _ga=GA1.2.2146952143.1539926675; _gid=GA1.2.1032787565.1539926675; _plh_notime=8cf91cdbcbbb255adff5cba6061f561b642f5157")
5 .timeout(360000000);
6 Document document = connect.get();*/
7 WebClient wc = new WebClient(BrowserVersion.CHROME);
8 //是否使用不安全的SSL
9 wc.getOptions().setUseInsecureSSL(true);
10 //启用JS解释器,默认为true
11 wc.getOptions().setJavaScriptEnabled(true);
12 //禁用CSS
13 wc.getOptions().setCssEnabled(false);
14 //js运行错误时,是否抛出异常
15 wc.getOptions().setThrowExceptionOnScriptError(false);
16 //状态码错误时,是否抛出异常
17 wc.getOptions().setThrowExceptionOnFailingStatusCode(false);
18 //是否允许使用ActiveX
19 wc.getOptions().setActiveXNative(false);
20 //等待js时间
21 wc.waitForBackgroundJavaScript(600*1000);
22 //设置Ajax异步处理控制器即启用Ajax支持
23 wc.setAjaxController(new NicelyResynchronizingAjaxController());
24 //设置超时时间
25 wc.getOptions().setTimeout(1000000);
26 //不跟踪抓取
27 wc.getOptions().setDoNotTrackEnabled(false);
28 WebRequest request=new WebRequest(new URL("https://www.marklines.com/cn/v ... 6quot;));
29 request.setAdditionalHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0");
30 request.setAdditionalHeader("Cookie","PLAY_LANG=cn; _plh=b9289d0a863a8fc9c79fb938f15372f7731d13fb; PLATFORM_SESSION=39034d07000717c664134556ad39869771aabc04-_ldi=520275&_lsh=8cf91cdbcbbb255adff5cba6061f561b642f5157&csrfToken=209f20c8473bc0518413c226f898ff79cd69c3ff-1539926671235-b853a6a63c77dd8fcc364a58&_lpt=%2Fcn%2Fvehicle_sales%2Fsearch&_lsi=1646321; _ga=GA1.2.2146952143.1539926675; _gid=GA1.2.1032787565.1539926675; _plh_notime=8cf91cdbcbbb255adff5cba6061f561b642f5157");
31 try {
32 //模拟浏览器打开一个目标网址
33 HtmlPage htmlPage = wc.getPage(request);
34 //为了获取js执行的数据 线程开始沉睡等待
35 Thread.sleep(1000);//这个线程的等待 因为js加载需要时间的
36 //以xml形式获取响应文本
37 String xml = htmlPage.asXml();
38 //并转为Document对象return
39 return Jsoup.parse(xml);
40 //System.out.println(xml.contains("结果.xls"));//false
41 } catch (FailingHttpStatusCodeException e) {
42 e.printStackTrace();
43 } catch (MalformedURLException e) {
44 e.printStackTrace();
45 } catch (IOException e) {
46 e.printStackTrace();
47 }
48 return null;
49 }
  4:返回的Document对象交给jsoup处理
  我这里只做了一个简单的输出,我检查了数据是否全部渲染完毕。
   1 Document doc=getDocument();
2 Element table=doc.select("table.table.table-bordered.aggregate_table").get(0);//获取到表格
3 Element tableContext=table.getElementsByTag("tbody").get(0);
4 Elements contextTrs=tableContext.getElementsByTag("tr");
5 System.out.println(contextTrs.size());
6
7
8 String context=doc.toString();
9 OutputStreamWriter pw = null;
10 pw = new OutputStreamWriter(new FileOutputStream("D:/test.txt"),"GBK");
11 pw.write(context);
12 pw.close();

htmlunit 抓取网页(的java程序是什么?答案是有哪些??)

网站优化优采云 发表了文章 • 0 个评论 • 56 次浏览 • 2021-12-02 09:02 • 来自相关话题

  htmlunit 抓取网页(的java程序是什么?答案是有哪些??)
  1.HtmlUnit1.1 简介
  HtmlUnit是一个用java编写的无界面浏览器,建模html文档,通过API调用页面,填写表单,点击链接等,像普通浏览器一样操作。通常用于测试和从网页中获取信息。
  官方简介翻译
HtmlUnit是一个无界面浏览器Java程序。它为HTML文档建模,提供了调用页面、填写表单、单击链接等操作的API。就跟你在浏览器里做的操作一样。
HtmlUnit不错的JavaScript支持(不断改进),甚至可以使用相当复杂的AJAX库,根据配置的不同模拟Chrome、Firefox或Internet Explorer等浏览器。
HtmlUnit通常用于测试或从web站点检索信息。
  1.2使用场景
  对于使用java实现的网络爬虫程序,我们一般可以使用apache的HttpClient组件来获取HTML页面信息。HttpClient实现的http请求返回的响应一般是纯文本文档页面,也就是最原创的html页面。
  对于静态的html页面,使用httpClient就足以爬取我们需要的信息。但是对于越来越多的动态网页,更多的数据是通过异步JS代码获取和渲染的。原来的html页面不收录这部分数据。
  
  在上图我们看到的网页中,初始文件加载完成后,红框中的数据列表是看不到的。浏览器通过执行异步JS请求,将获取到的动态数据渲染到原创文档页面,最终成为我们看到的网页。对于这部分需要JS代码执行的数据,httpClient显得力不从心。虽然我们可以拿到JS执行的请求路径,然后用java代码拿到我们需要的那部分数据,更别说从JS脚本里能不能分析出请求路径和请求参数,就分析这部分源码代码价格已经很高了。
  通过上面的介绍,我们了解到目前的动态网页很大一部分是通过异步JS请求获取,然后通过JS渲染页面的。那么我们可以做这样的假设吗,假设我们的爬虫程序模拟了一个浏览器,在获取到html页面后,像浏览器一样执行异步JS代码,在JS渲染完html页面后,就可以愉快的获取到页面上的节点信息了页面不见了。那么有没有这样的java程序呢?
  答案是肯定的。
  HtmlUnit就是这样一个库,用来让界面意外地显示所有异步工作。由于没有需要显示的耗时工作,HtmlUnit 加载一个完整的网页比实际的浏览器块更多。并且根据不同的配置,HtmlUnit可以模拟市面上常用的浏览器,如Chrome、Firefox、IE浏览器等。
  通过HtmlUnit库,加载一个完整的Html页面(图片和视频除外),然后就可以将其转换为我们常用的字符串格式,并使用Jsoup等其他工具获取元素。当然,你也可以直接从HtmlUnit提供的对象中获取网页元素,甚至可以操作按钮、表单等控件。除了不能像可见浏览器那样使用鼠标和键盘来浏览网页,我们可以使用HtmlUnit来模拟和操作所有其他操作,比如登录网站、写博客等都可以完全的。当然,网页内容抓取是最简单的应用。
  2.J4L2.1官方简介
  J4L OCR 工具是一组可用于在 Java 应用程序中收录 OCR 功能的组件。这意味着您可以接收传真、PDF 文件或扫描文档并从图像中提取业务信息。主要的3个组件是:
  j4l工具的详细使用步骤请参考这篇文章文章:Java使用J4L识别验证码
  本文文章主要介绍使用HtmlUnit模拟登录
  3.实际案例3.1.场景
  一个登录页面,包括一个表单,需要填写用户名、登录密码和验证码才能实现用户登录。
  3.2 操作步骤
  使用htmlunit模拟登录是一个获取登录页面-&gt;找到输入框-&gt;填写用户名和密码-&gt;填写验证码-&gt;模拟点击登录的过程。
  4.实现代码4.1maven引入HtmlUnit依赖
  
  net.sourceforge.htmlunit
  htmlunit
  2.18
  4.2 主要方法
  登录.java
   public static void main(String[] args) throws Exception {
login();
}
public static void login() throws Exception {
WebClient webClient = new WebClient(BrowserVersion.CHROME);//设置浏览器内核
webClient.getOptions().setJavaScriptEnabled(true);// js是否可用
webClient.getOptions().setCssEnabled(true);//css 一般设置false因为影响运行速度
webClient.getOptions().setThrowExceptionOnScriptError(false);//设置js抛出异常:false
webClient.getOptions().setActiveXNative(false);
//ajax
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
webClient.getOptions().setUseInsecureSSL(false);
//允许重定向
webClient.getOptions().setRedirectEnabled(true);
//连接超时
webClient.getOptions().setTimeout(5000);
//js执行超时
webClient.setJavaScriptTimeout(10000 * 3);
//允许cookie
webClient.getCookieManager().setCookiesEnabled(true);
String url = "http://hrportalneu.cs/HRPortal ... 3B%3B
HtmlPage page = webClient.getPage(url);
webClient.waitForBackgroundJavaScript(5000);
HtmlPage newPage;
newPage = readyPage(page, webClient, "btnCheckIn1");
System.out.println("url----------------" + newPage.getUrl());
System.out.println("Login执行后页面:" + newPage.asXml());
IOUtils.write(newPage.asXml().getBytes(), new FileWriter(new File("D:/checkIn.txt")));
if (!newPage.asXml().contains("登录成功")) {
login();
}
webClient.close();
}
public static HtmlPage readyPage(HtmlPage page, WebClient webClient, String type) throws Exception {
//封装页面元素
HtmlForm form = page.getHtmlElementById("form1");
HtmlTextInput tbxUsername = form.getInputByName("tbxUsername");
tbxUsername.setValueAttribute("用户名*******");
HtmlPasswordInput tbxPassword = form.getInputByName("tbxPassword");
tbxPassword.setValueAttribute("密码*******");
//获取验证码图片
HtmlImage verify_img = (HtmlImage) page.getElementById("AuthCode1$codeText$img");
File file = new File("D:\\" + "check" + ".png");
//保存验证码图片
verify_img.saveAs(file);
System.out.println("验证码图片已保存!");
//保存路径
String filePath = file.getPath();
//裁剪验证码 这里使用原始的图片文件识别成功率不高 可以先进行裁剪
ImageUtil.cutImage(filePath, 1, 1, 96, 34);
//自动识别验证码
OCRFacade facade = new OCRFacade();
//识别验证码
String code = facade.recognizeFile(filePath, "eng");
//处理字符串
code = code.replaceAll(" ", "");
code = code.replaceAll("\\n", "");
System.out.println("验证码:" + code);
//定位验证码输入框
HtmlTextInput verify_code = form.getInputByName("AuthCode1$codeText");
//填入自动识别出来的验证码
verify_code.setValueAttribute(code);
System.out.println("原始页面:" + page.asXml());
HtmlPage newPage = null;
//操作按钮
if (type.equals("btnCheckIn1")) {
DomElement btnCheckIn1 = page.getElementById("btnCheckIn1");
System.out.println("doCheckIn");
newPage = btnCheckIn1.click();
}
//等待js加载
webClient.waitForBackgroundJavaScript(5000);
return newPage;
} 
  图像实用程序
  public class ImageUtil {
public static void cutImage(String filePath, int x, int y, int w, int h)
throws Exception {
// 首先通过ImageIo中的方法,创建一个Image + InputStream到内存
ImageInputStream iis = ImageIO
.createImageInputStream(new FileInputStream(filePath));
// 再按照指定格式构造一个Reader(Reader不能new的)
Iterator it = ImageIO.getImageReadersByFormatName("gif");
ImageReader imagereader = (ImageReader) it.next();
// 再通过ImageReader绑定 InputStream
imagereader.setInput(iis);
// 设置感兴趣的源区域。
ImageReadParam par = imagereader.getDefaultReadParam();
par.setSourceRegion(new Rectangle(x, y, w, h));
// 从 reader得到BufferImage
BufferedImage bi = imagereader.read(0, par);
// 将BuffeerImage写出通过ImageIO
ImageIO.write(bi, "png", new File(filePath));
}
}
  在控制台中,查看执行Login后的页面,查看是否登录成功。 查看全部

  htmlunit 抓取网页(的java程序是什么?答案是有哪些??)
  1.HtmlUnit1.1 简介
  HtmlUnit是一个用java编写的无界面浏览器,建模html文档,通过API调用页面,填写表单,点击链接等,像普通浏览器一样操作。通常用于测试和从网页中获取信息。
  官方简介翻译
HtmlUnit是一个无界面浏览器Java程序。它为HTML文档建模,提供了调用页面、填写表单、单击链接等操作的API。就跟你在浏览器里做的操作一样。
HtmlUnit不错的JavaScript支持(不断改进),甚至可以使用相当复杂的AJAX库,根据配置的不同模拟Chrome、Firefox或Internet Explorer等浏览器。
HtmlUnit通常用于测试或从web站点检索信息。
  1.2使用场景
  对于使用java实现的网络爬虫程序,我们一般可以使用apache的HttpClient组件来获取HTML页面信息。HttpClient实现的http请求返回的响应一般是纯文本文档页面,也就是最原创的html页面。
  对于静态的html页面,使用httpClient就足以爬取我们需要的信息。但是对于越来越多的动态网页,更多的数据是通过异步JS代码获取和渲染的。原来的html页面不收录这部分数据。
  
  在上图我们看到的网页中,初始文件加载完成后,红框中的数据列表是看不到的。浏览器通过执行异步JS请求,将获取到的动态数据渲染到原创文档页面,最终成为我们看到的网页。对于这部分需要JS代码执行的数据,httpClient显得力不从心。虽然我们可以拿到JS执行的请求路径,然后用java代码拿到我们需要的那部分数据,更别说从JS脚本里能不能分析出请求路径和请求参数,就分析这部分源码代码价格已经很高了。
  通过上面的介绍,我们了解到目前的动态网页很大一部分是通过异步JS请求获取,然后通过JS渲染页面的。那么我们可以做这样的假设吗,假设我们的爬虫程序模拟了一个浏览器,在获取到html页面后,像浏览器一样执行异步JS代码,在JS渲染完html页面后,就可以愉快的获取到页面上的节点信息了页面不见了。那么有没有这样的java程序呢?
  答案是肯定的。
  HtmlUnit就是这样一个库,用来让界面意外地显示所有异步工作。由于没有需要显示的耗时工作,HtmlUnit 加载一个完整的网页比实际的浏览器块更多。并且根据不同的配置,HtmlUnit可以模拟市面上常用的浏览器,如Chrome、Firefox、IE浏览器等。
  通过HtmlUnit库,加载一个完整的Html页面(图片和视频除外),然后就可以将其转换为我们常用的字符串格式,并使用Jsoup等其他工具获取元素。当然,你也可以直接从HtmlUnit提供的对象中获取网页元素,甚至可以操作按钮、表单等控件。除了不能像可见浏览器那样使用鼠标和键盘来浏览网页,我们可以使用HtmlUnit来模拟和操作所有其他操作,比如登录网站、写博客等都可以完全的。当然,网页内容抓取是最简单的应用。
  2.J4L2.1官方简介
  J4L OCR 工具是一组可用于在 Java 应用程序中收录 OCR 功能的组件。这意味着您可以接收传真、PDF 文件或扫描文档并从图像中提取业务信息。主要的3个组件是:
  j4l工具的详细使用步骤请参考这篇文章文章:Java使用J4L识别验证码
  本文文章主要介绍使用HtmlUnit模拟登录
  3.实际案例3.1.场景
  一个登录页面,包括一个表单,需要填写用户名、登录密码和验证码才能实现用户登录。
  3.2 操作步骤
  使用htmlunit模拟登录是一个获取登录页面-&gt;找到输入框-&gt;填写用户名和密码-&gt;填写验证码-&gt;模拟点击登录的过程。
  4.实现代码4.1maven引入HtmlUnit依赖
  
  net.sourceforge.htmlunit
  htmlunit
  2.18
  4.2 主要方法
  登录.java
   public static void main(String[] args) throws Exception {
login();
}
public static void login() throws Exception {
WebClient webClient = new WebClient(BrowserVersion.CHROME);//设置浏览器内核
webClient.getOptions().setJavaScriptEnabled(true);// js是否可用
webClient.getOptions().setCssEnabled(true);//css 一般设置false因为影响运行速度
webClient.getOptions().setThrowExceptionOnScriptError(false);//设置js抛出异常:false
webClient.getOptions().setActiveXNative(false);
//ajax
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
webClient.getOptions().setUseInsecureSSL(false);
//允许重定向
webClient.getOptions().setRedirectEnabled(true);
//连接超时
webClient.getOptions().setTimeout(5000);
//js执行超时
webClient.setJavaScriptTimeout(10000 * 3);
//允许cookie
webClient.getCookieManager().setCookiesEnabled(true);
String url = "http://hrportalneu.cs/HRPortal ... 3B%3B
HtmlPage page = webClient.getPage(url);
webClient.waitForBackgroundJavaScript(5000);
HtmlPage newPage;
newPage = readyPage(page, webClient, "btnCheckIn1");
System.out.println("url----------------" + newPage.getUrl());
System.out.println("Login执行后页面:" + newPage.asXml());
IOUtils.write(newPage.asXml().getBytes(), new FileWriter(new File("D:/checkIn.txt")));
if (!newPage.asXml().contains("登录成功")) {
login();
}
webClient.close();
}
public static HtmlPage readyPage(HtmlPage page, WebClient webClient, String type) throws Exception {
//封装页面元素
HtmlForm form = page.getHtmlElementById("form1");
HtmlTextInput tbxUsername = form.getInputByName("tbxUsername");
tbxUsername.setValueAttribute("用户名*******");
HtmlPasswordInput tbxPassword = form.getInputByName("tbxPassword");
tbxPassword.setValueAttribute("密码*******");
//获取验证码图片
HtmlImage verify_img = (HtmlImage) page.getElementById("AuthCode1$codeText$img");
File file = new File("D:\\" + "check" + ".png");
//保存验证码图片
verify_img.saveAs(file);
System.out.println("验证码图片已保存!");
//保存路径
String filePath = file.getPath();
//裁剪验证码 这里使用原始的图片文件识别成功率不高 可以先进行裁剪
ImageUtil.cutImage(filePath, 1, 1, 96, 34);
//自动识别验证码
OCRFacade facade = new OCRFacade();
//识别验证码
String code = facade.recognizeFile(filePath, "eng");
//处理字符串
code = code.replaceAll(" ", "");
code = code.replaceAll("\\n", "");
System.out.println("验证码:" + code);
//定位验证码输入框
HtmlTextInput verify_code = form.getInputByName("AuthCode1$codeText");
//填入自动识别出来的验证码
verify_code.setValueAttribute(code);
System.out.println("原始页面:" + page.asXml());
HtmlPage newPage = null;
//操作按钮
if (type.equals("btnCheckIn1")) {
DomElement btnCheckIn1 = page.getElementById("btnCheckIn1");
System.out.println("doCheckIn");
newPage = btnCheckIn1.click();
}
//等待js加载
webClient.waitForBackgroundJavaScript(5000);
return newPage;
} 
  图像实用程序
  public class ImageUtil {
public static void cutImage(String filePath, int x, int y, int w, int h)
throws Exception {
// 首先通过ImageIo中的方法,创建一个Image + InputStream到内存
ImageInputStream iis = ImageIO
.createImageInputStream(new FileInputStream(filePath));
// 再按照指定格式构造一个Reader(Reader不能new的)
Iterator it = ImageIO.getImageReadersByFormatName("gif");
ImageReader imagereader = (ImageReader) it.next();
// 再通过ImageReader绑定 InputStream
imagereader.setInput(iis);
// 设置感兴趣的源区域。
ImageReadParam par = imagereader.getDefaultReadParam();
par.setSourceRegion(new Rectangle(x, y, w, h));
// 从 reader得到BufferImage
BufferedImage bi = imagereader.read(0, par);
// 将BuffeerImage写出通过ImageIO
ImageIO.write(bi, "png", new File(filePath));
}
}
  在控制台中,查看执行Login后的页面,查看是否登录成功。

htmlunit 抓取网页(网页获取和解析速度和性能的应用场景详解! )

网站优化优采云 发表了文章 • 0 个评论 • 50 次浏览 • 2021-11-29 03:14 • 来自相关话题

  htmlunit 抓取网页(网页获取和解析速度和性能的应用场景详解!
)
  (4)支持代理服务器
  (5) 支持自动cookies管理等。
  Java爬虫开发中应用最广泛的网页获取技术之一。它具有一流的速度和性能。它在功能支持方面相对较低。不支持JS脚本执行、CSS解析、渲染等准浏览器功能。推荐给需要快速获取网页的用户。无需解析脚本和 CSS 场景。
  示例代码如下:
  package cn.ysh.studio.crawler.httpclient;import org.apache.http.client.HttpClient;import org.apache.http.client.ResponseHandler;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.BasicResponseHandler;import org.apache.http.impl.client.DefaultHttpClient;/**
* 基于HtmlClient抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHttpClientTest{publicstaticvoid main(String[] args)throwsException{//目标页面String url ="http://www.yshjava.cn";//创建一个默认的HttpClientHttpClient httpclient =newDefaultHttpClient();try{//以get方式请求网页http://www.yshjava.cnHttpGet httpget =newHttpGet(url);//打印请求地址System.out.println("executing request "+ httpget.getURI());//创建响应处理器处理服务器响应内容ResponseHandlerresponseHandler=newBasicResponseHandler();//执行请求并获取结果String responseBody = httpclient.execute(httpget, responseHandler);System.out.println("----------------------------------------");System.out.println(responseBody);System.out.println("----------------------------------------");}finally{//关闭连接管理器
httpclient.getConnectionManager().shutdown();}}}
  汤
  jsoup 是一个 Java HTML 解析器,可以直接解析 URL 地址和 HTML 文本内容。它提供了一个非常省力的API,可以通过DOM、CSS和类似jQuery的操作方法来检索和操作数据。
  网页获取和分析的速度非常快,推荐使用。
  主要功能如下:
  1. 从 URL、文件或字符串解析 HTML;
  2. 使用 DOM 或 CSS 选择器来查找和检索数据;
  3. 可操作的 HTML 元素、属性和文本;
  示例代码如下:
  package cn.ysh.studio.crawler.jsoup;import java.io.IOException;import org.jsoup.Jsoup;/**
* 基于Jsoup抓取网页内容
* @author www.yshjava.cn
*/publicclassJsoupTest{publicstaticvoid main(String[] args)throwsIOException{//目标页面String url ="http://www.yshjava.cn";//使用Jsoup连接目标页面,并执行请求,获取服务器响应内容String html =Jsoup.connect(url).execute().body();//打印页面内容System.out.println(html);}}
  单位
  htmlunit 是一个开源的java 页面分析工具。阅读完页面后,您可以有效地使用htmlunit 来分析页面上的内容。该项目可以模拟浏览器操作,被称为java浏览器的开源实现。这个没有界面的浏览器也非常快。使用 Rhinojs 引擎。模拟js操作。
  网页获取和解析速度更快,性能更好。推荐用于需要解析网页脚本的应用场景。
  示例代码如下:
  package cn.ysh.studio.crawler.htmlunit;import com.gargoylesoftware.htmlunit.BrowserVersion;import com.gargoylesoftware.htmlunit.Page;import com.gargoylesoftware.htmlunit.WebClient;/**
* 基于HtmlUnit抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHtmlUnitSpider{publicstaticvoid main(String[] s)throwsException{//目标网页String url ="http://www.yshjava.cn";//模拟特定浏览器FIREFOX_3WebClient spider =newWebClient(BrowserVersion.FIREFOX_3);//获取目标网页Page page = spider.getPage(url);//打印网页内容System.out.println(page.getWebResponse().getContentAsString());//关闭所有窗口
spider.closeAllWindows();}}
  瓦蒂
  Watij(读作 wattage)是一种使用 Java 开发的 Web 应用程序测试工具。鉴于 Watij 的简单性和 Java 语言的强大功能,Watij 可以让您在真实浏览器中完成 Web 应用程序的自动化测试。因为调用了本地浏览器,所以支持CSS渲染和JS执行。
  网页抓取速度一般,IE版本过低(6/7)可能导致内存泄漏。
  示例代码如下:
  package cn.ysh.studio.crawler.ie;import watij.runtime.ie.IE;/**
* 基于Watij抓取网页内容,仅限Windows平台
*
* @author www.yshjava.cn
*/publicclassWatijTest{publicstaticvoid main(String[] s){//目标页面String url ="http://www.yshjava.cn";//实例化IE浏览器对象
IE ie =new IE();try{//启动浏览器
ie.start();//转到目标网页
ie.goTo(url);//等待网页加载就绪
ie.waitUntilReady();//打印页面内容System.out.println(ie.html());}catch(Exception e){
e.printStackTrace();}finally{try{//关闭IE浏览器
ie.close();}catch(Exception e){}}}}
  硒
  Selenium 也是一种用于 Web 应用程序测试的工具。Selenium 测试直接在浏览器中运行,就像真正的用户在操作一样。支持的浏览器包括 IE、Mozilla Firefox、Mozilla Suite 等。该工具的主要功能包括: 测试浏览器兼容性——测试您的应用程序是否可以在不同浏览器和操作系统上正常运行。测试系统功能——创建回归测试以验证软件功能和用户需求。支持自动录制动作和自动生成。测试Net、Java、Perl等不同语言的脚本。Selenium是ThoughtWorks专门为web应用编写的验收测试工具。
  网页抓取速度较慢,对于爬虫来说不是一个好的选择。
  示例代码如下:
  package cn.ysh.studio.crawler.selenium;import org.openqa.selenium.htmlunit.HtmlUnitDriver;/**
* 基于HtmlDriver抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHtmlDriverTest{publicstaticvoid main(String[] s){//目标网页String url ="http://www.yshjava.cn";HtmlUnitDriver driver =newHtmlUnitDriver();try{//禁用JS脚本功能
driver.setJavascriptEnabled(false);//打开目标网页
driver.get(url);//获取当前网页源码String html = driver.getPageSource();//打印网页源码System.out.println(html);}catch(Exception e){//打印堆栈信息
e.printStackTrace();}finally{try{//关闭并退出
driver.close();
driver.quit();}catch(Exception e){}}}}
  网络规范
  具有支持脚本执行和 CSS 渲染的接口的开源 Java 浏览器。速度是平均的。
  示例代码如下:
  package cn.ysh.studio.crawler.webspec;import org.watij.webspec.dsl.WebSpec;/**
* 基于WebSpec抓取网页内容
*
* @author www.yshjava.cn
*/publicclassWebspecTest{publicstaticvoid main(String[] s){//目标网页String url ="http://www.yshjava.cn";//实例化浏览器对象WebSpec spec =newWebSpec().mozilla();//隐藏浏览器窗体
spec.hide();//打开目标页面
spec.open(url);//打印网页源码System.out.println(spec.source());//关闭所有窗口
spec.closeAll();}} 查看全部

  htmlunit 抓取网页(网页获取和解析速度和性能的应用场景详解!
)
  (4)支持代理服务器
  (5) 支持自动cookies管理等。
  Java爬虫开发中应用最广泛的网页获取技术之一。它具有一流的速度和性能。它在功能支持方面相对较低。不支持JS脚本执行、CSS解析、渲染等准浏览器功能。推荐给需要快速获取网页的用户。无需解析脚本和 CSS 场景。
  示例代码如下:
  package cn.ysh.studio.crawler.httpclient;import org.apache.http.client.HttpClient;import org.apache.http.client.ResponseHandler;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.BasicResponseHandler;import org.apache.http.impl.client.DefaultHttpClient;/**
* 基于HtmlClient抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHttpClientTest{publicstaticvoid main(String[] args)throwsException{//目标页面String url ="http://www.yshjava.cn";//创建一个默认的HttpClientHttpClient httpclient =newDefaultHttpClient();try{//以get方式请求网页http://www.yshjava.cnHttpGet httpget =newHttpGet(url);//打印请求地址System.out.println("executing request "+ httpget.getURI());//创建响应处理器处理服务器响应内容ResponseHandlerresponseHandler=newBasicResponseHandler();//执行请求并获取结果String responseBody = httpclient.execute(httpget, responseHandler);System.out.println("----------------------------------------");System.out.println(responseBody);System.out.println("----------------------------------------");}finally{//关闭连接管理器
httpclient.getConnectionManager().shutdown();}}}
  汤
  jsoup 是一个 Java HTML 解析器,可以直接解析 URL 地址和 HTML 文本内容。它提供了一个非常省力的API,可以通过DOM、CSS和类似jQuery的操作方法来检索和操作数据。
  网页获取和分析的速度非常快,推荐使用。
  主要功能如下:
  1. 从 URL、文件或字符串解析 HTML;
  2. 使用 DOM 或 CSS 选择器来查找和检索数据;
  3. 可操作的 HTML 元素、属性和文本;
  示例代码如下:
  package cn.ysh.studio.crawler.jsoup;import java.io.IOException;import org.jsoup.Jsoup;/**
* 基于Jsoup抓取网页内容
* @author www.yshjava.cn
*/publicclassJsoupTest{publicstaticvoid main(String[] args)throwsIOException{//目标页面String url ="http://www.yshjava.cn";//使用Jsoup连接目标页面,并执行请求,获取服务器响应内容String html =Jsoup.connect(url).execute().body();//打印页面内容System.out.println(html);}}
  单位
  htmlunit 是一个开源的java 页面分析工具。阅读完页面后,您可以有效地使用htmlunit 来分析页面上的内容。该项目可以模拟浏览器操作,被称为java浏览器的开源实现。这个没有界面的浏览器也非常快。使用 Rhinojs 引擎。模拟js操作。
  网页获取和解析速度更快,性能更好。推荐用于需要解析网页脚本的应用场景。
  示例代码如下:
  package cn.ysh.studio.crawler.htmlunit;import com.gargoylesoftware.htmlunit.BrowserVersion;import com.gargoylesoftware.htmlunit.Page;import com.gargoylesoftware.htmlunit.WebClient;/**
* 基于HtmlUnit抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHtmlUnitSpider{publicstaticvoid main(String[] s)throwsException{//目标网页String url ="http://www.yshjava.cn";//模拟特定浏览器FIREFOX_3WebClient spider =newWebClient(BrowserVersion.FIREFOX_3);//获取目标网页Page page = spider.getPage(url);//打印网页内容System.out.println(page.getWebResponse().getContentAsString());//关闭所有窗口
spider.closeAllWindows();}}
  瓦蒂
  Watij(读作 wattage)是一种使用 Java 开发的 Web 应用程序测试工具。鉴于 Watij 的简单性和 Java 语言的强大功能,Watij 可以让您在真实浏览器中完成 Web 应用程序的自动化测试。因为调用了本地浏览器,所以支持CSS渲染和JS执行。
  网页抓取速度一般,IE版本过低(6/7)可能导致内存泄漏。
  示例代码如下:
  package cn.ysh.studio.crawler.ie;import watij.runtime.ie.IE;/**
* 基于Watij抓取网页内容,仅限Windows平台
*
* @author www.yshjava.cn
*/publicclassWatijTest{publicstaticvoid main(String[] s){//目标页面String url ="http://www.yshjava.cn";//实例化IE浏览器对象
IE ie =new IE();try{//启动浏览器
ie.start();//转到目标网页
ie.goTo(url);//等待网页加载就绪
ie.waitUntilReady();//打印页面内容System.out.println(ie.html());}catch(Exception e){
e.printStackTrace();}finally{try{//关闭IE浏览器
ie.close();}catch(Exception e){}}}}
  硒
  Selenium 也是一种用于 Web 应用程序测试的工具。Selenium 测试直接在浏览器中运行,就像真正的用户在操作一样。支持的浏览器包括 IE、Mozilla Firefox、Mozilla Suite 等。该工具的主要功能包括: 测试浏览器兼容性——测试您的应用程序是否可以在不同浏览器和操作系统上正常运行。测试系统功能——创建回归测试以验证软件功能和用户需求。支持自动录制动作和自动生成。测试Net、Java、Perl等不同语言的脚本。Selenium是ThoughtWorks专门为web应用编写的验收测试工具。
  网页抓取速度较慢,对于爬虫来说不是一个好的选择。
  示例代码如下:
  package cn.ysh.studio.crawler.selenium;import org.openqa.selenium.htmlunit.HtmlUnitDriver;/**
* 基于HtmlDriver抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHtmlDriverTest{publicstaticvoid main(String[] s){//目标网页String url ="http://www.yshjava.cn";HtmlUnitDriver driver =newHtmlUnitDriver();try{//禁用JS脚本功能
driver.setJavascriptEnabled(false);//打开目标网页
driver.get(url);//获取当前网页源码String html = driver.getPageSource();//打印网页源码System.out.println(html);}catch(Exception e){//打印堆栈信息
e.printStackTrace();}finally{try{//关闭并退出
driver.close();
driver.quit();}catch(Exception e){}}}}
  网络规范
  具有支持脚本执行和 CSS 渲染的接口的开源 Java 浏览器。速度是平均的。
  示例代码如下:
  package cn.ysh.studio.crawler.webspec;import org.watij.webspec.dsl.WebSpec;/**
* 基于WebSpec抓取网页内容
*
* @author www.yshjava.cn
*/publicclassWebspecTest{publicstaticvoid main(String[] s){//目标网页String url ="http://www.yshjava.cn";//实例化浏览器对象WebSpec spec =newWebSpec().mozilla();//隐藏浏览器窗体
spec.hide();//打开目标页面
spec.open(url);//打印网页源码System.out.println(spec.source());//关闭所有窗口
spec.closeAll();}}

htmlunit 抓取网页(Chrome浏览器如何模拟浏览器的登录,HtmlUnitPost的自我解剖)

网站优化优采云 发表了文章 • 0 个评论 • 45 次浏览 • 2021-11-25 18:16 • 来自相关话题

  htmlunit 抓取网页(Chrome浏览器如何模拟浏览器的登录,HtmlUnitPost的自我解剖)
  设计步骤:
  1、模拟浏览器登录,HtmlUnit是如何模拟浏览器登录的,请参考这篇文章爬虫自解剖(抓取网页HtmlUnit),因为HtmlUnit本身不支持JavaScript 好的,没有需要加载网页的CSS文件,所以在使用HtmlUnit之前,进行相关配置,禁用CSS和JavaScript,代码如下:
  
final WebClient webClient=new WebClient(BrowserVersion.CHROME);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setActiveXNative(false);
webClient.getOptions().setAppletEnabled(false);
webClient.getOptions().setPopupBlockerEnabled(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setPrintContentOnFailingStatusCode(false);
  2、 以上设置后,CSS/JS 和其他一些相关插件被禁用。我们来分析一下Post请求中的相关参数,打开Chrome浏览器,点击网页登录按钮旁边的review元素。 , 可以查看附近的相关html代码,相关html代码如下(只列出比较关注的部分)
  
登录
  从上面的代码可以看出,Post请求中需要用到的相关参数是email和password,所以这两项在Post请求中是必不可少的。模拟登录过程的代码如下图所示:
  
final HtmlPage page=webClient.getPage("http://www.****.com/#signin");
List forms=page.getForms();
HtmlForm login=forms.get(0);
HtmlTextInput email=login.getInputByName("email");
HtmlPasswordInput pwd=login.getInputByName("password");
DomNodeList btn=login.getElementsByTagName("button");
HtmlButton submit=(HtmlButton)btn.get(0);
email.setText(key.trim());
pwd.setText(map.get(key));
submit.click();
  这里登录成功,是不是很简单,我们不需要操作cookies,这次模拟的是Chrome浏览器登录
  备注和评论
  Listforms=page.getForms();表示获取页面上的所有Form表单
  HtmlForm login=forms.get(0); 由于整个页面只有一个表单,直接取第一个
  HtmlTextInput email=login.getInputByName("email");获取页面表单上的email输入框
  HtmlPasswordInput pwd=login.getInputByName("password");获取页面上的密码输入框
  下面两句用于获取页面的登录按钮
  DomNodeListbtn=login.getElementsByTagName("button");
  HtmlButton submit=(HtmlButton)btn.get(0);
  下面两句用于设置邮箱和密码 查看全部

  htmlunit 抓取网页(Chrome浏览器如何模拟浏览器的登录,HtmlUnitPost的自我解剖)
  设计步骤:
  1、模拟浏览器登录,HtmlUnit是如何模拟浏览器登录的,请参考这篇文章爬虫自解剖(抓取网页HtmlUnit),因为HtmlUnit本身不支持JavaScript 好的,没有需要加载网页的CSS文件,所以在使用HtmlUnit之前,进行相关配置,禁用CSS和JavaScript,代码如下:
  
final WebClient webClient=new WebClient(BrowserVersion.CHROME);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setActiveXNative(false);
webClient.getOptions().setAppletEnabled(false);
webClient.getOptions().setPopupBlockerEnabled(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setPrintContentOnFailingStatusCode(false);
  2、 以上设置后,CSS/JS 和其他一些相关插件被禁用。我们来分析一下Post请求中的相关参数,打开Chrome浏览器,点击网页登录按钮旁边的review元素。 , 可以查看附近的相关html代码,相关html代码如下(只列出比较关注的部分)
  
登录
  从上面的代码可以看出,Post请求中需要用到的相关参数是email和password,所以这两项在Post请求中是必不可少的。模拟登录过程的代码如下图所示:
  
final HtmlPage page=webClient.getPage("http://www.****.com/#signin");
List forms=page.getForms();
HtmlForm login=forms.get(0);
HtmlTextInput email=login.getInputByName("email");
HtmlPasswordInput pwd=login.getInputByName("password");
DomNodeList btn=login.getElementsByTagName("button");
HtmlButton submit=(HtmlButton)btn.get(0);
email.setText(key.trim());
pwd.setText(map.get(key));
submit.click();
  这里登录成功,是不是很简单,我们不需要操作cookies,这次模拟的是Chrome浏览器登录
  备注和评论
  Listforms=page.getForms();表示获取页面上的所有Form表单
  HtmlForm login=forms.get(0); 由于整个页面只有一个表单,直接取第一个
  HtmlTextInput email=login.getInputByName("email");获取页面表单上的email输入框
  HtmlPasswordInput pwd=login.getInputByName("password");获取页面上的密码输入框
  下面两句用于获取页面的登录按钮
  DomNodeListbtn=login.getElementsByTagName("button");
  HtmlButton submit=(HtmlButton)btn.get(0);
  下面两句用于设置邮箱和密码

htmlunit 抓取网页(htmlunit网络工具一个没有没有 )

网站优化优采云 发表了文章 • 0 个评论 • 42 次浏览 • 2021-11-24 08:10 • 来自相关话题

  htmlunit 抓取网页(htmlunit网络工具一个没有没有
)
  1:背景
  本来想用jsoup来抓取一个页面,但是我抓取的数据总是不完整,然后发现用js执行了页面后,在页面上渲染了一些数据,也就是说,只在执行js后的数据页上。会显示数据,但是jsoup无法实现执行页面的js。
  2:解决
  搜索后发现htmlunit网络工具可以执行js,相当于没有页面的浏览器。解决办法是先用htmlUnit发送网络请求,执行js获取页面,然后用jsoup转换成Document页面对象。然后用jsoup分析页面读取数据。
  3: htmlUnit 发送请求
   1 public static Document getDocument() throws IOException, InterruptedException{
2 /*String url="https://www.marklines.com/cn/v ... 3B%3B
3 Connection connect = Jsoup.connect(url).userAgent("")
4 .header("Cookie", "PLAY_LANG=cn; _plh=b9289d0a863a8fc9c79fb938f15372f7731d13fb; PLATFORM_SESSION=39034d07000717c664134556ad39869771aabc04-_ldi=520275&_lsh=8cf91cdbcbbb255adff5cba6061f561b642f5157&csrfToken=209f20c8473bc0518413c226f898ff79cd69c3ff-1539926671235-b853a6a63c77dd8fcc364a58&_lpt=%2Fcn%2Fvehicle_sales%2Fsearch&_lsi=1646321; _ga=GA1.2.2146952143.1539926675; _gid=GA1.2.1032787565.1539926675; _plh_notime=8cf91cdbcbbb255adff5cba6061f561b642f5157")
5 .timeout(360000000);
6 Document document = connect.get();*/
7 WebClient wc = new WebClient(BrowserVersion.CHROME);
8 //是否使用不安全的SSL
9 wc.getOptions().setUseInsecureSSL(true);
10 //启用JS解释器,默认为true
11 wc.getOptions().setJavaScriptEnabled(true);
12 //禁用CSS
13 wc.getOptions().setCssEnabled(false);
14 //js运行错误时,是否抛出异常
15 wc.getOptions().setThrowExceptionOnScriptError(false);
16 //状态码错误时,是否抛出异常
17 wc.getOptions().setThrowExceptionOnFailingStatusCode(false);
18 //是否允许使用ActiveX
19 wc.getOptions().setActiveXNative(false);
20 //等待js时间
21 wc.waitForBackgroundJavaScript(600*1000);
22 //设置Ajax异步处理控制器即启用Ajax支持
23 wc.setAjaxController(new NicelyResynchronizingAjaxController());
24 //设置超时时间
25 wc.getOptions().setTimeout(1000000);
26 //不跟踪抓取
27 wc.getOptions().setDoNotTrackEnabled(false);
28 WebRequest request=new WebRequest(new URL("https://www.marklines.com/cn/v ... 6quot;));
29 request.setAdditionalHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0");
30 request.setAdditionalHeader("Cookie","PLAY_LANG=cn; _plh=b9289d0a863a8fc9c79fb938f15372f7731d13fb; PLATFORM_SESSION=39034d07000717c664134556ad39869771aabc04-_ldi=520275&_lsh=8cf91cdbcbbb255adff5cba6061f561b642f5157&csrfToken=209f20c8473bc0518413c226f898ff79cd69c3ff-1539926671235-b853a6a63c77dd8fcc364a58&_lpt=%2Fcn%2Fvehicle_sales%2Fsearch&_lsi=1646321; _ga=GA1.2.2146952143.1539926675; _gid=GA1.2.1032787565.1539926675; _plh_notime=8cf91cdbcbbb255adff5cba6061f561b642f5157");
31 try {
32 //模拟浏览器打开一个目标网址
33 HtmlPage htmlPage = wc.getPage(request);
34 //为了获取js执行的数据 线程开始沉睡等待
35 Thread.sleep(1000);//这个线程的等待 因为js加载需要时间的
36 //以xml形式获取响应文本
37 String xml = htmlPage.asXml();
38 //并转为Document对象return
39 return Jsoup.parse(xml);
40 //System.out.println(xml.contains("结果.xls"));//false
41 } catch (FailingHttpStatusCodeException e) {
42 e.printStackTrace();
43 } catch (MalformedURLException e) {
44 e.printStackTrace();
45 } catch (IOException e) {
46 e.printStackTrace();
47 }
48 return null;
49 }
  4:返回的Document对象交给jsoup处理
  我这里只做了一个简单的输出,我检查了数据是否全部渲染完毕。
   1 Document doc=getDocument();
2 Element table=doc.select("table.table.table-bordered.aggregate_table").get(0);//获取到表格
3 Element tableContext=table.getElementsByTag("tbody").get(0);
4 Elements contextTrs=tableContext.getElementsByTag("tr");
5 System.out.println(contextTrs.size());
6
7
8 String context=doc.toString();
9 OutputStreamWriter pw = null;
10 pw = new OutputStreamWriter(new FileOutputStream("D:/test.txt"),"GBK");
11 pw.write(context);
12 pw.close(); 查看全部

  htmlunit 抓取网页(htmlunit网络工具一个没有没有
)
  1:背景
  本来想用jsoup来抓取一个页面,但是我抓取的数据总是不完整,然后发现用js执行了页面后,在页面上渲染了一些数据,也就是说,只在执行js后的数据页上。会显示数据,但是jsoup无法实现执行页面的js。
  2:解决
  搜索后发现htmlunit网络工具可以执行js,相当于没有页面的浏览器。解决办法是先用htmlUnit发送网络请求,执行js获取页面,然后用jsoup转换成Document页面对象。然后用jsoup分析页面读取数据。
  3: htmlUnit 发送请求
   1 public static Document getDocument() throws IOException, InterruptedException{
2 /*String url="https://www.marklines.com/cn/v ... 3B%3B
3 Connection connect = Jsoup.connect(url).userAgent("")
4 .header("Cookie", "PLAY_LANG=cn; _plh=b9289d0a863a8fc9c79fb938f15372f7731d13fb; PLATFORM_SESSION=39034d07000717c664134556ad39869771aabc04-_ldi=520275&_lsh=8cf91cdbcbbb255adff5cba6061f561b642f5157&csrfToken=209f20c8473bc0518413c226f898ff79cd69c3ff-1539926671235-b853a6a63c77dd8fcc364a58&_lpt=%2Fcn%2Fvehicle_sales%2Fsearch&_lsi=1646321; _ga=GA1.2.2146952143.1539926675; _gid=GA1.2.1032787565.1539926675; _plh_notime=8cf91cdbcbbb255adff5cba6061f561b642f5157")
5 .timeout(360000000);
6 Document document = connect.get();*/
7 WebClient wc = new WebClient(BrowserVersion.CHROME);
8 //是否使用不安全的SSL
9 wc.getOptions().setUseInsecureSSL(true);
10 //启用JS解释器,默认为true
11 wc.getOptions().setJavaScriptEnabled(true);
12 //禁用CSS
13 wc.getOptions().setCssEnabled(false);
14 //js运行错误时,是否抛出异常
15 wc.getOptions().setThrowExceptionOnScriptError(false);
16 //状态码错误时,是否抛出异常
17 wc.getOptions().setThrowExceptionOnFailingStatusCode(false);
18 //是否允许使用ActiveX
19 wc.getOptions().setActiveXNative(false);
20 //等待js时间
21 wc.waitForBackgroundJavaScript(600*1000);
22 //设置Ajax异步处理控制器即启用Ajax支持
23 wc.setAjaxController(new NicelyResynchronizingAjaxController());
24 //设置超时时间
25 wc.getOptions().setTimeout(1000000);
26 //不跟踪抓取
27 wc.getOptions().setDoNotTrackEnabled(false);
28 WebRequest request=new WebRequest(new URL("https://www.marklines.com/cn/v ... 6quot;));
29 request.setAdditionalHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0");
30 request.setAdditionalHeader("Cookie","PLAY_LANG=cn; _plh=b9289d0a863a8fc9c79fb938f15372f7731d13fb; PLATFORM_SESSION=39034d07000717c664134556ad39869771aabc04-_ldi=520275&_lsh=8cf91cdbcbbb255adff5cba6061f561b642f5157&csrfToken=209f20c8473bc0518413c226f898ff79cd69c3ff-1539926671235-b853a6a63c77dd8fcc364a58&_lpt=%2Fcn%2Fvehicle_sales%2Fsearch&_lsi=1646321; _ga=GA1.2.2146952143.1539926675; _gid=GA1.2.1032787565.1539926675; _plh_notime=8cf91cdbcbbb255adff5cba6061f561b642f5157");
31 try {
32 //模拟浏览器打开一个目标网址
33 HtmlPage htmlPage = wc.getPage(request);
34 //为了获取js执行的数据 线程开始沉睡等待
35 Thread.sleep(1000);//这个线程的等待 因为js加载需要时间的
36 //以xml形式获取响应文本
37 String xml = htmlPage.asXml();
38 //并转为Document对象return
39 return Jsoup.parse(xml);
40 //System.out.println(xml.contains("结果.xls"));//false
41 } catch (FailingHttpStatusCodeException e) {
42 e.printStackTrace();
43 } catch (MalformedURLException e) {
44 e.printStackTrace();
45 } catch (IOException e) {
46 e.printStackTrace();
47 }
48 return null;
49 }
  4:返回的Document对象交给jsoup处理
  我这里只做了一个简单的输出,我检查了数据是否全部渲染完毕。
   1 Document doc=getDocument();
2 Element table=doc.select("table.table.table-bordered.aggregate_table").get(0);//获取到表格
3 Element tableContext=table.getElementsByTag("tbody").get(0);
4 Elements contextTrs=tableContext.getElementsByTag("tr");
5 System.out.println(contextTrs.size());
6
7
8 String context=doc.toString();
9 OutputStreamWriter pw = null;
10 pw = new OutputStreamWriter(new FileOutputStream("D:/test.txt"),"GBK");
11 pw.write(context);
12 pw.close();

htmlunit 抓取网页(抓一个今日头条的首页内容解决方案-苏州安嘉)

网站优化优采云 发表了文章 • 0 个评论 • 71 次浏览 • 2021-11-16 09:06 • 来自相关话题

  htmlunit 抓取网页(抓一个今日头条的首页内容解决方案-苏州安嘉)
  不知道大家在使用jsoup的过程中是否遇到过爬取内容的情况,发现有些网页的内容是通过JavaScript异步加载的,导致我们的爬虫空手而归(只抓到了一个网页)。
  遇到这个问题首先想到的有两种解决方案:
  在等待网页异步加载后,使用类似于Python中延迟加载的方法抓取异步加载的网页。使用特殊的方法使被爬取的网页的外框模拟里面的JavaScript代码的执行,最终到达完整的网页。
  在搜索引擎的帮助下,我决定使用选项2来解决问题。选项 1 没有搜索更好的第三方库。在java中使用Option 1解决这个问题的朋友希望能和下一个一起讨论,太好了。
  案例很简单,抓取今日头条的首页内容。你可以看看今日头条的主页。里面的内容是异步加载的。
  添加jsoup和htmlunit的依赖
  
org.jsoup
jsoup
1.10.2
net.sourceforge.htmlunit
htmlunit
2.25




1

2

3

4

5

6

7

8

9

10


  首先我们单独使用jsoup解析今日头条首页
  String url = "https://www.toutiao.com/";
Connection connect = Jsoup.connect(url);
Document document = connect.get();
System.out.println(document);




1

2

3

4


  ↑ 这里只能获取网页的frame内容,不能获取首页的新闻内容
  接下来我们用htmlunit试试
  //构造一个webClient 模拟Chrome 浏览器
WebClient webClient = new WebClient(BrowserVersion.CHROME);
//屏蔽日志信息
LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log",
"org.apache.commons.logging.impl.NoOpLog");
java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(Level.OFF);
//支持JavaScript
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setActiveXNative(false);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getOptions().setTimeout(5000);
HtmlPage rootPage = webClient.getPage(url);
//设置一个运行JavaScript的时间
webClient.waitForBackgroundJavaScript(5000);
String html = rootPage.asXml();
Document document = Jsoup.parse(html);




1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19





<a target="_blank" rel="noopener"></a>


  这样我们就可以在运行后得到一个收录JavaScript的完整源码网页 查看全部

  htmlunit 抓取网页(抓一个今日头条的首页内容解决方案-苏州安嘉)
  不知道大家在使用jsoup的过程中是否遇到过爬取内容的情况,发现有些网页的内容是通过JavaScript异步加载的,导致我们的爬虫空手而归(只抓到了一个网页)。
  遇到这个问题首先想到的有两种解决方案:
  在等待网页异步加载后,使用类似于Python中延迟加载的方法抓取异步加载的网页。使用特殊的方法使被爬取的网页的外框模拟里面的JavaScript代码的执行,最终到达完整的网页。
  在搜索引擎的帮助下,我决定使用选项2来解决问题。选项 1 没有搜索更好的第三方库。在java中使用Option 1解决这个问题的朋友希望能和下一个一起讨论,太好了。
  案例很简单,抓取今日头条的首页内容。你可以看看今日头条的主页。里面的内容是异步加载的。
  添加jsoup和htmlunit的依赖
  
org.jsoup
jsoup
1.10.2
net.sourceforge.htmlunit
htmlunit
2.25




1

2

3

4

5

6

7

8

9

10


  首先我们单独使用jsoup解析今日头条首页
  String url = "https://www.toutiao.com/";
Connection connect = Jsoup.connect(url);
Document document = connect.get();
System.out.println(document);




1

2

3

4


  ↑ 这里只能获取网页的frame内容,不能获取首页的新闻内容
  接下来我们用htmlunit试试
  //构造一个webClient 模拟Chrome 浏览器
WebClient webClient = new WebClient(BrowserVersion.CHROME);
//屏蔽日志信息
LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log",
"org.apache.commons.logging.impl.NoOpLog");
java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(Level.OFF);
//支持JavaScript
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setActiveXNative(false);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getOptions().setTimeout(5000);
HtmlPage rootPage = webClient.getPage(url);
//设置一个运行JavaScript的时间
webClient.waitForBackgroundJavaScript(5000);
String html = rootPage.asXml();
Document document = Jsoup.parse(html);




1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19





<a target="_blank" rel="noopener"></a>


  这样我们就可以在运行后得到一个收录JavaScript的完整源码网页

htmlunit 抓取网页(编程之家为你收集整理的全部内容全部内容代码片段-编程之家小)

网站优化优采云 发表了文章 • 0 个评论 • 48 次浏览 • 2021-11-15 16:07 • 来自相关话题

  htmlunit 抓取网页(编程之家为你收集整理的全部内容全部内容代码片段-编程之家小)
  以下是编程之家通过互联网采集整理的一段代码片段。
  编程之家的编辑现在与您分享,也可以作为您的参考。
  最近在写爬虫的时候,在使用httpclient抓取一些网页的时候出现了一些问题,就是检索到的内容收录大量的密文(通过javascript脚本),无法获取到真实的内容(即呈现的内容)通过使用浏览器打开网页))。所以一般需要配合js引擎来解决这个问题。经过搜索,我发现htmlunit工具可以提供帮助。在了解和使用的过程中,我发现这是一个非常强大的开源工具。虽然名气不如httpclient,但实力不容小觑。少说八卦。可以从这里下载:/htmlunit/files/htmlunit/2.15/
  String url="http://outofmemory.cn/";//想采集的网址
String refer="http://open-open.com/";
URL link=new URL(url);
WebClient wc=new WebClient();
WebRequest request=new WebRequest(link);
request.setCharset("UTF-8");
request.setProxyHost("120.120.120.x");
request.setProxyPort(8080);
request.setAdditionalHeader("Referer",refer);//设置请求报文头里的refer字段
////设置请求报文头里的User-Agent字段
request.setAdditionalHeader("User-Agent","Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2");
//wc.addRequestHeader("User-Agent","Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2");
//wc.addRequestHeader和request.setAdditionalHeader功能应该是一样的。选择一个即可。
//其他报文头字段可以根据需要添加
wc.getCookieManager().setCookiesEnabled(true);//开启cookie管理
wc.getOptions().setJavaScriptEnabled(true);//开启js解析。对于变态网页,这个是必须的
wc.getOptions().setCssEnabled(true);//开启css解析。对于变态网页,这个是必须的。
wc.getOptions().setThrowExceptionOnFailingStatusCode(false);
wc.getOptions().setThrowExceptionOnScriptError(false);
wc.getOptions().setTimeout(10000);
//设置cookie。如果你有cookie,可以在这里设置
Set cookies=null;
Iterator i = cookies.iterator();
while (i.hasNext())
{
wc.getCookieManager().addCookie(i.next());
}
//准备工作已经做好了
HtmlPage page=null;
page = wc.getPage(request);
if(page==null)
{
System.out.println("采集 "+url+" 失败!!!");
return ;
}
String content=page.asText();//网页内容保存在content里
if(content==null)
{
System.out.println("采集 "+url+" 失败!!!");
return ;
}
//搞定了
CookieManager CM = wc.getCookieManager(); //WC = Your WebClient's name
Set cookies_ret = CM.getCookies();//返回的Cookie在这里,下次请求的时候可能可以用上啦。
  以上是编程之家()为大家采集整理的所有代码内容,希望文章可以帮助大家解决遇到的程序开发问题。
  如果你觉得编程之家网站的内容还不错,欢迎向程序员朋友推荐编程之家网站。
  总结
  以上就是使用HtmlUnit模拟浏览器抓取编程之家为您采集的网页数据的全部内容。希望文章可以帮助大家解决使用HtmlUnit模拟浏览器抓取网页数据时遇到的程序开发问题。
  如果你觉得编程之家网站的内容还不错,欢迎向程序员朋友推荐编程之家网站。 查看全部

  htmlunit 抓取网页(编程之家为你收集整理的全部内容全部内容代码片段-编程之家小)
  以下是编程之家通过互联网采集整理的一段代码片段。
  编程之家的编辑现在与您分享,也可以作为您的参考。
  最近在写爬虫的时候,在使用httpclient抓取一些网页的时候出现了一些问题,就是检索到的内容收录大量的密文(通过javascript脚本),无法获取到真实的内容(即呈现的内容)通过使用浏览器打开网页))。所以一般需要配合js引擎来解决这个问题。经过搜索,我发现htmlunit工具可以提供帮助。在了解和使用的过程中,我发现这是一个非常强大的开源工具。虽然名气不如httpclient,但实力不容小觑。少说八卦。可以从这里下载:/htmlunit/files/htmlunit/2.15/
  String url="http://outofmemory.cn/";//想采集的网址
String refer="http://open-open.com/";
URL link=new URL(url);
WebClient wc=new WebClient();
WebRequest request=new WebRequest(link);
request.setCharset("UTF-8");
request.setProxyHost("120.120.120.x");
request.setProxyPort(8080);
request.setAdditionalHeader("Referer",refer);//设置请求报文头里的refer字段
////设置请求报文头里的User-Agent字段
request.setAdditionalHeader("User-Agent","Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2");
//wc.addRequestHeader("User-Agent","Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2");
//wc.addRequestHeader和request.setAdditionalHeader功能应该是一样的。选择一个即可。
//其他报文头字段可以根据需要添加
wc.getCookieManager().setCookiesEnabled(true);//开启cookie管理
wc.getOptions().setJavaScriptEnabled(true);//开启js解析。对于变态网页,这个是必须的
wc.getOptions().setCssEnabled(true);//开启css解析。对于变态网页,这个是必须的。
wc.getOptions().setThrowExceptionOnFailingStatusCode(false);
wc.getOptions().setThrowExceptionOnScriptError(false);
wc.getOptions().setTimeout(10000);
//设置cookie。如果你有cookie,可以在这里设置
Set cookies=null;
Iterator i = cookies.iterator();
while (i.hasNext())
{
wc.getCookieManager().addCookie(i.next());
}
//准备工作已经做好了
HtmlPage page=null;
page = wc.getPage(request);
if(page==null)
{
System.out.println("采集 "+url+" 失败!!!");
return ;
}
String content=page.asText();//网页内容保存在content里
if(content==null)
{
System.out.println("采集 "+url+" 失败!!!");
return ;
}
//搞定了
CookieManager CM = wc.getCookieManager(); //WC = Your WebClient's name
Set cookies_ret = CM.getCookies();//返回的Cookie在这里,下次请求的时候可能可以用上啦。
  以上是编程之家()为大家采集整理的所有代码内容,希望文章可以帮助大家解决遇到的程序开发问题。
  如果你觉得编程之家网站的内容还不错,欢迎向程序员朋友推荐编程之家网站。
  总结
  以上就是使用HtmlUnit模拟浏览器抓取编程之家为您采集的网页数据的全部内容。希望文章可以帮助大家解决使用HtmlUnit模拟浏览器抓取网页数据时遇到的程序开发问题。
  如果你觉得编程之家网站的内容还不错,欢迎向程序员朋友推荐编程之家网站。

htmlunit 抓取网页(AngularJSjs渲染出的页面越来越多如何判断前端渲染页面)

网站优化优采云 发表了文章 • 0 个评论 • 53 次浏览 • 2021-11-13 13:21 • 来自相关话题

  htmlunit 抓取网页(AngularJSjs渲染出的页面越来越多如何判断前端渲染页面)
  随着AJAX技术的不断普及和AngularJS等单页应用框架的出现,越来越多的页面由js渲染。对于爬虫来说,这种页面比较烦人:只提取HTML内容往往得不到有效信息。那么如何处理这种页面呢?一般来说,有两种方法:
  在爬虫阶段,爬虫内置浏览器内核,执行js渲染页面后,进行爬虫。这方面对应的工具有Selenium、HtmlUnit或PhantomJs。但是,这些工具存在一定的效率问题,同时也不太稳定。优点是写入规则与静态页面相同。因为js渲染页面的数据也是从后端获取的,而且基本都是通过AJAX获取的,所以分析AJAX请求,找到对应数据的请求也是一种可行的方式。并且与页面样式相比,这个界面不太可能发生变化。缺点是找到这个请求并模拟它是一个比较困难的过程,需要比较多的分析经验。
  比较两种方法,我的观点是,对于一次性或小规模的需求,第一种方法省时省力。但对于长期、大规模的需求,第二种会更可靠。对于某些站点,甚至还有一些 js 混淆技术。这时候第一种方法基本上是万能的,第二种方法会很复杂。
  对于第一种方法,webmagic-selenium 就是这样一种尝试。它定义了一个Downloader,它在下载页面时使用浏览器内核进行渲染。selenium 的配置比较复杂,和平台和版本有关,所以没有稳定的解决方案。有兴趣可以看我的博客:使用Selenium爬取动态加载的页面
  这里我主要介绍第二种方法。希望最后你会发现:前端渲染页面的原创解析并没有那么复杂。这里我们以AngularJS中文社区为例。
  1 如何判断前端渲染
  判断页面是否被js渲染的方法比较简单。可以直接在浏览器中查看源码(Windows下Ctrl+U,Mac下command+alt+u)。如果找不到有效信息,基本可以为js渲染。
  
  
  在这个例子中,如果源代码中找不到页面上的标题“优府计算机网络-前端攻城引擎”,可以断定是js渲染,而这个数据是通过AJAX获取的。
  2 分析请求
  现在我们进入最难的部分:找到这个数据请求。这一步可以帮助我们的工具,主要是在浏览器中查看网络请求的开发者工具。
  以Chome为例,我们打开“开发者工具”(Windows下F12,Mac下command+alt+i),然后刷新页面(也可能是下拉页面,总之你所有的操作认为可能会触发新的数据),然后记得保持场景并一一分析请求!
  这一步需要一点耐心,但也不是不守规矩。首先可以帮助我们的是上面的分类过滤器(All、Document 等选项)。如果是普通的AJAX,会显示在XHR标签下,JSONP请求会在Scripts标签下。这是两种常见的数据类型。
  然后就可以根据数据的大小来判断了。一般来说,较大的结果更有可能是返回数据的接口。剩下的就基本靠经验了。比如这里的“latest?p=1&amp;s=20”一看就可疑……
  
  对于可疑地址,此时可以查看响应正文的内容。此处的开发人员工具中不清楚。我们把URL复制到地址栏,再次请求(如果Chrome建议安装jsonviewer,查看AJAX结果非常方便)。看看结果,似乎找到了我们想要的东西。
  
  同样的,我们到了帖子详情页,找到了具体内容的请求:。
  3 编写程序
  回顾之前的列表+目标页面的例子,我们会发现我们这次的需求和之前的差不多,只是换成了AJAX-AJAX风格的列表,AJAX风格的数据,返回的数据变成了JSON。那么,我们还是可以用最后一种方法,分成两页来写:
  数据表
  在这个列表页面上,我们需要找到有效的信息来帮助我们构建目标 AJAX URL。这里我们看到这个_id应该是我们想要的帖子的id,帖子详情请求是由一些固定的URL加上这个id组成的。所以在这一步,我们自己手动构造了URL,加入到要爬取的队列中。这里我们使用 JsonPath,一种选择语言来选择数据(webmagic-extension 包提供了 JsonPathSelector 来支持它)。
   
  如果 (page.getUrl().regex(LIST_URL).match()) {
  //这里我们使用JSONPATH作为选择语言来选择数据
  List ids = new JsonPathSelector("$.data[*]._id").selectList(page.getRawText());
  如果(采集Utils.isNotEmpty(ids)){
  for (String id: ids) {
  page.addTargetRequest(""+id);
  }
  }
  }
  目标数据
  有了URL,解析目标数据其实很简单。因为JSON数据是完全结构化的,省去了我们分析页面和编写XPath的过程。这里我们仍然使用 JsonPath 来获取标题和内容。
   
  page.putField("title", new JsonPathSelector("$.data.title").select(page.getRawText()));
  page.putField("content", new JsonPathSelector("$.data.content").select(page.getRawText()));
  本示例的完整代码请参见AngularJSProcessor.java
  4 总结
  在这个例子中,我们分析了一个比较经典的动态页面的爬取过程。其实动态页面爬取最大的区别就是增加了链接发现的难度。让我们比较一下两种开发模式:
  后台渲染页面
  下载辅助页面 =&gt; 发现链接 =&gt; 下载并分析目标 HTML
  前端渲染页面
  发现辅助数据 =&gt; 构建链接 =&gt; 下载并分析目标 AJAX
  对于不同的站点,这个辅助数据可能会提前在页面的HTML中输出,也可能是通过AJAX请求,甚至是多个数据请求的过程,但这种模式基本是固定的。
  但是这些数据请求的分析还是比页面分析复杂很多,所以这其实就是动态页面爬取的难点。
  本节的例子希望做的是提供一个可以遵循的模式,供此类爬虫在分析请求后的编写,即发现辅助数据=&gt; 构建链接=&gt; 下载并分析目标AJAX模型。
  PS:
  WebMagic 0.5.0 会给链 API 添加 Json 支持,你可以使用:
  page.getJson().jsonPath("$.name").get();
  这种方式来解析AJAX请求。
  还支持
  page.getJson().removePadding("callback").jsonPath("$.name").get();
  这种方式来解析 JSONP 请求。 查看全部

  htmlunit 抓取网页(AngularJSjs渲染出的页面越来越多如何判断前端渲染页面)
  随着AJAX技术的不断普及和AngularJS等单页应用框架的出现,越来越多的页面由js渲染。对于爬虫来说,这种页面比较烦人:只提取HTML内容往往得不到有效信息。那么如何处理这种页面呢?一般来说,有两种方法:
  在爬虫阶段,爬虫内置浏览器内核,执行js渲染页面后,进行爬虫。这方面对应的工具有Selenium、HtmlUnit或PhantomJs。但是,这些工具存在一定的效率问题,同时也不太稳定。优点是写入规则与静态页面相同。因为js渲染页面的数据也是从后端获取的,而且基本都是通过AJAX获取的,所以分析AJAX请求,找到对应数据的请求也是一种可行的方式。并且与页面样式相比,这个界面不太可能发生变化。缺点是找到这个请求并模拟它是一个比较困难的过程,需要比较多的分析经验。
  比较两种方法,我的观点是,对于一次性或小规模的需求,第一种方法省时省力。但对于长期、大规模的需求,第二种会更可靠。对于某些站点,甚至还有一些 js 混淆技术。这时候第一种方法基本上是万能的,第二种方法会很复杂。
  对于第一种方法,webmagic-selenium 就是这样一种尝试。它定义了一个Downloader,它在下载页面时使用浏览器内核进行渲染。selenium 的配置比较复杂,和平台和版本有关,所以没有稳定的解决方案。有兴趣可以看我的博客:使用Selenium爬取动态加载的页面
  这里我主要介绍第二种方法。希望最后你会发现:前端渲染页面的原创解析并没有那么复杂。这里我们以AngularJS中文社区为例。
  1 如何判断前端渲染
  判断页面是否被js渲染的方法比较简单。可以直接在浏览器中查看源码(Windows下Ctrl+U,Mac下command+alt+u)。如果找不到有效信息,基本可以为js渲染。
  
  
  在这个例子中,如果源代码中找不到页面上的标题“优府计算机网络-前端攻城引擎”,可以断定是js渲染,而这个数据是通过AJAX获取的。
  2 分析请求
  现在我们进入最难的部分:找到这个数据请求。这一步可以帮助我们的工具,主要是在浏览器中查看网络请求的开发者工具。
  以Chome为例,我们打开“开发者工具”(Windows下F12,Mac下command+alt+i),然后刷新页面(也可能是下拉页面,总之你所有的操作认为可能会触发新的数据),然后记得保持场景并一一分析请求!
  这一步需要一点耐心,但也不是不守规矩。首先可以帮助我们的是上面的分类过滤器(All、Document 等选项)。如果是普通的AJAX,会显示在XHR标签下,JSONP请求会在Scripts标签下。这是两种常见的数据类型。
  然后就可以根据数据的大小来判断了。一般来说,较大的结果更有可能是返回数据的接口。剩下的就基本靠经验了。比如这里的“latest?p=1&amp;s=20”一看就可疑……
  
  对于可疑地址,此时可以查看响应正文的内容。此处的开发人员工具中不清楚。我们把URL复制到地址栏,再次请求(如果Chrome建议安装jsonviewer,查看AJAX结果非常方便)。看看结果,似乎找到了我们想要的东西。
  
  同样的,我们到了帖子详情页,找到了具体内容的请求:。
  3 编写程序
  回顾之前的列表+目标页面的例子,我们会发现我们这次的需求和之前的差不多,只是换成了AJAX-AJAX风格的列表,AJAX风格的数据,返回的数据变成了JSON。那么,我们还是可以用最后一种方法,分成两页来写:
  数据表
  在这个列表页面上,我们需要找到有效的信息来帮助我们构建目标 AJAX URL。这里我们看到这个_id应该是我们想要的帖子的id,帖子详情请求是由一些固定的URL加上这个id组成的。所以在这一步,我们自己手动构造了URL,加入到要爬取的队列中。这里我们使用 JsonPath,一种选择语言来选择数据(webmagic-extension 包提供了 JsonPathSelector 来支持它)。
   
  如果 (page.getUrl().regex(LIST_URL).match()) {
  //这里我们使用JSONPATH作为选择语言来选择数据
  List ids = new JsonPathSelector("$.data[*]._id").selectList(page.getRawText());
  如果(采集Utils.isNotEmpty(ids)){
  for (String id: ids) {
  page.addTargetRequest(""+id);
  }
  }
  }
  目标数据
  有了URL,解析目标数据其实很简单。因为JSON数据是完全结构化的,省去了我们分析页面和编写XPath的过程。这里我们仍然使用 JsonPath 来获取标题和内容。
   
  page.putField("title", new JsonPathSelector("$.data.title").select(page.getRawText()));
  page.putField("content", new JsonPathSelector("$.data.content").select(page.getRawText()));
  本示例的完整代码请参见AngularJSProcessor.java
  4 总结
  在这个例子中,我们分析了一个比较经典的动态页面的爬取过程。其实动态页面爬取最大的区别就是增加了链接发现的难度。让我们比较一下两种开发模式:
  后台渲染页面
  下载辅助页面 =&gt; 发现链接 =&gt; 下载并分析目标 HTML
  前端渲染页面
  发现辅助数据 =&gt; 构建链接 =&gt; 下载并分析目标 AJAX
  对于不同的站点,这个辅助数据可能会提前在页面的HTML中输出,也可能是通过AJAX请求,甚至是多个数据请求的过程,但这种模式基本是固定的。
  但是这些数据请求的分析还是比页面分析复杂很多,所以这其实就是动态页面爬取的难点。
  本节的例子希望做的是提供一个可以遵循的模式,供此类爬虫在分析请求后的编写,即发现辅助数据=&gt; 构建链接=&gt; 下载并分析目标AJAX模型。
  PS:
  WebMagic 0.5.0 会给链 API 添加 Json 支持,你可以使用:
  page.getJson().jsonPath("$.name").get();
  这种方式来解析AJAX请求。
  还支持
  page.getJson().removePadding("callback").jsonPath("$.name").get();
  这种方式来解析 JSONP 请求。

htmlunit 抓取网页(网页获取和解析速度和性能的应用场景详解! )

网站优化优采云 发表了文章 • 0 个评论 • 64 次浏览 • 2021-11-12 00:03 • 来自相关话题

  htmlunit 抓取网页(网页获取和解析速度和性能的应用场景详解!
)
  (4)支持代理服务器
  (5) 支持自动cookies管理等。
  Java爬虫开发中应用最广泛的网页获取技术之一。它具有一流的速度和性能。它在功能支持方面相对较低。不支持JS脚本执行、CSS解析、渲染等准浏览器功能。推荐给需要快速获取网页的用户。无需解析脚本和 CSS 场景。
  示例代码如下:
  package cn.ysh.studio.crawler.httpclient;import org.apache.http.client.HttpClient;import org.apache.http.client.ResponseHandler;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.BasicResponseHandler;import org.apache.http.impl.client.DefaultHttpClient;/**
* 基于HtmlClient抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHttpClientTest{publicstaticvoid main(String[] args)throwsException{//目标页面String url ="http://www.yshjava.cn";//创建一个默认的HttpClientHttpClient httpclient =newDefaultHttpClient();try{//以get方式请求网页http://www.yshjava.cnHttpGet httpget =newHttpGet(url);//打印请求地址System.out.println("executing request "+ httpget.getURI());//创建响应处理器处理服务器响应内容ResponseHandlerresponseHandler=newBasicResponseHandler();//执行请求并获取结果String responseBody = httpclient.execute(httpget, responseHandler);System.out.println("----------------------------------------");System.out.println(responseBody);System.out.println("----------------------------------------");}finally{//关闭连接管理器
httpclient.getConnectionManager().shutdown();}}}
  汤
  jsoup 是一个 Java HTML 解析器,可以直接解析 URL 地址和 HTML 文本内容。它提供了一个非常省力的API,可以通过DOM、CSS和类似jQuery的操作方法来检索和操作数据。
  网页获取和分析速度非常快,推荐使用。
  主要功能如下:
  1. 从 URL、文件或字符串解析 HTML;
  2. 使用 DOM 或 CSS 选择器来查找和检索数据;
  3. 可操作的 HTML 元素、属性和文本;
  示例代码如下:
  package cn.ysh.studio.crawler.jsoup;import java.io.IOException;import org.jsoup.Jsoup;/**
* 基于Jsoup抓取网页内容
* @author www.yshjava.cn
*/publicclassJsoupTest{publicstaticvoid main(String[] args)throwsIOException{//目标页面String url ="http://www.yshjava.cn";//使用Jsoup连接目标页面,并执行请求,获取服务器响应内容String html =Jsoup.connect(url).execute().body();//打印页面内容System.out.println(html);}}
  单位
  htmlunit 是一个开源的java 页面分析工具。阅读完页面后,您可以有效地使用 htmlunit 来分析页面上的内容。该项目可以模拟浏览器操作,被称为java浏览器的开源实现。这个没有界面的浏览器也非常快。使用 Rhinojs 引擎。模拟js操作。
  网页获取和解析速度更快,性能更好。推荐用于需要解析网页脚本的应用场景。
  示例代码如下:
  package cn.ysh.studio.crawler.htmlunit;import com.gargoylesoftware.htmlunit.BrowserVersion;import com.gargoylesoftware.htmlunit.Page;import com.gargoylesoftware.htmlunit.WebClient;/**
* 基于HtmlUnit抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHtmlUnitSpider{publicstaticvoid main(String[] s)throwsException{//目标网页String url ="http://www.yshjava.cn";//模拟特定浏览器FIREFOX_3WebClient spider =newWebClient(BrowserVersion.FIREFOX_3);//获取目标网页Page page = spider.getPage(url);//打印网页内容System.out.println(page.getWebResponse().getContentAsString());//关闭所有窗口
spider.closeAllWindows();}}
  瓦蒂
  Watij(读作 wattage)是一种使用 Java 开发的 Web 应用程序测试工具。鉴于 Watij 的简单性和 Java 语言的强大功能,Watij 可以让您在真实浏览器中完成 Web 应用程序的自动化测试。因为调用了本地浏览器,所以支持CSS渲染和JS执行。
  网页抓取速度一般,IE版本过低(6/7)可能导致内存泄漏。
  示例代码如下:
  package cn.ysh.studio.crawler.ie;import watij.runtime.ie.IE;/**
* 基于Watij抓取网页内容,仅限Windows平台
*
* @author www.yshjava.cn
*/publicclassWatijTest{publicstaticvoid main(String[] s){//目标页面String url ="http://www.yshjava.cn";//实例化IE浏览器对象
IE ie =new IE();try{//启动浏览器
ie.start();//转到目标网页
ie.goTo(url);//等待网页加载就绪
ie.waitUntilReady();//打印页面内容System.out.println(ie.html());}catch(Exception e){
e.printStackTrace();}finally{try{//关闭IE浏览器
ie.close();}catch(Exception e){}}}}
  硒
  Selenium 也是 Web 应用程序测试的工具。Selenium 测试直接在浏览器中运行,就像真正的用户在操作一样。支持的浏览器包括 IE、Mozilla Firefox、Mozilla Suite 等。该工具的主要功能包括: 测试浏览器兼容性——测试您的应用程序,看看它是否能在不同的浏览器和操作系统上运行良好。测试系统功能——创建回归测试以验证软件功能和用户需求。支持自动录制动作和自动生成。测试Net、Java、Perl等不同语言的脚本。Selenium是ThoughtWorks专门为web应用编写的验收测试工具。
  网页抓取速度较慢,对于爬虫来说不是一个好的选择。
  示例代码如下:
  package cn.ysh.studio.crawler.selenium;import org.openqa.selenium.htmlunit.HtmlUnitDriver;/**
* 基于HtmlDriver抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHtmlDriverTest{publicstaticvoid main(String[] s){//目标网页String url ="http://www.yshjava.cn";HtmlUnitDriver driver =newHtmlUnitDriver();try{//禁用JS脚本功能
driver.setJavascriptEnabled(false);//打开目标网页
driver.get(url);//获取当前网页源码String html = driver.getPageSource();//打印网页源码System.out.println(html);}catch(Exception e){//打印堆栈信息
e.printStackTrace();}finally{try{//关闭并退出
driver.close();
driver.quit();}catch(Exception e){}}}}
  网络规范
  具有支持脚本执行和 CSS 渲染的接口的开源 Java 浏览器。速度是平均的。
  示例代码如下:
  package cn.ysh.studio.crawler.webspec;import org.watij.webspec.dsl.WebSpec;/**
* 基于WebSpec抓取网页内容
*
* @author www.yshjava.cn
*/publicclassWebspecTest{publicstaticvoid main(String[] s){//目标网页String url ="http://www.yshjava.cn";//实例化浏览器对象WebSpec spec =newWebSpec().mozilla();//隐藏浏览器窗体
spec.hide();//打开目标页面
spec.open(url);//打印网页源码System.out.println(spec.source());//关闭所有窗口
spec.closeAll();}} 查看全部

  htmlunit 抓取网页(网页获取和解析速度和性能的应用场景详解!
)
  (4)支持代理服务器
  (5) 支持自动cookies管理等。
  Java爬虫开发中应用最广泛的网页获取技术之一。它具有一流的速度和性能。它在功能支持方面相对较低。不支持JS脚本执行、CSS解析、渲染等准浏览器功能。推荐给需要快速获取网页的用户。无需解析脚本和 CSS 场景。
  示例代码如下:
  package cn.ysh.studio.crawler.httpclient;import org.apache.http.client.HttpClient;import org.apache.http.client.ResponseHandler;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.BasicResponseHandler;import org.apache.http.impl.client.DefaultHttpClient;/**
* 基于HtmlClient抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHttpClientTest{publicstaticvoid main(String[] args)throwsException{//目标页面String url ="http://www.yshjava.cn";//创建一个默认的HttpClientHttpClient httpclient =newDefaultHttpClient();try{//以get方式请求网页http://www.yshjava.cnHttpGet httpget =newHttpGet(url);//打印请求地址System.out.println("executing request "+ httpget.getURI());//创建响应处理器处理服务器响应内容ResponseHandlerresponseHandler=newBasicResponseHandler();//执行请求并获取结果String responseBody = httpclient.execute(httpget, responseHandler);System.out.println("----------------------------------------");System.out.println(responseBody);System.out.println("----------------------------------------");}finally{//关闭连接管理器
httpclient.getConnectionManager().shutdown();}}}
  汤
  jsoup 是一个 Java HTML 解析器,可以直接解析 URL 地址和 HTML 文本内容。它提供了一个非常省力的API,可以通过DOM、CSS和类似jQuery的操作方法来检索和操作数据。
  网页获取和分析速度非常快,推荐使用。
  主要功能如下:
  1. 从 URL、文件或字符串解析 HTML;
  2. 使用 DOM 或 CSS 选择器来查找和检索数据;
  3. 可操作的 HTML 元素、属性和文本;
  示例代码如下:
  package cn.ysh.studio.crawler.jsoup;import java.io.IOException;import org.jsoup.Jsoup;/**
* 基于Jsoup抓取网页内容
* @author www.yshjava.cn
*/publicclassJsoupTest{publicstaticvoid main(String[] args)throwsIOException{//目标页面String url ="http://www.yshjava.cn";//使用Jsoup连接目标页面,并执行请求,获取服务器响应内容String html =Jsoup.connect(url).execute().body();//打印页面内容System.out.println(html);}}
  单位
  htmlunit 是一个开源的java 页面分析工具。阅读完页面后,您可以有效地使用 htmlunit 来分析页面上的内容。该项目可以模拟浏览器操作,被称为java浏览器的开源实现。这个没有界面的浏览器也非常快。使用 Rhinojs 引擎。模拟js操作。
  网页获取和解析速度更快,性能更好。推荐用于需要解析网页脚本的应用场景。
  示例代码如下:
  package cn.ysh.studio.crawler.htmlunit;import com.gargoylesoftware.htmlunit.BrowserVersion;import com.gargoylesoftware.htmlunit.Page;import com.gargoylesoftware.htmlunit.WebClient;/**
* 基于HtmlUnit抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHtmlUnitSpider{publicstaticvoid main(String[] s)throwsException{//目标网页String url ="http://www.yshjava.cn";//模拟特定浏览器FIREFOX_3WebClient spider =newWebClient(BrowserVersion.FIREFOX_3);//获取目标网页Page page = spider.getPage(url);//打印网页内容System.out.println(page.getWebResponse().getContentAsString());//关闭所有窗口
spider.closeAllWindows();}}
  瓦蒂
  Watij(读作 wattage)是一种使用 Java 开发的 Web 应用程序测试工具。鉴于 Watij 的简单性和 Java 语言的强大功能,Watij 可以让您在真实浏览器中完成 Web 应用程序的自动化测试。因为调用了本地浏览器,所以支持CSS渲染和JS执行。
  网页抓取速度一般,IE版本过低(6/7)可能导致内存泄漏。
  示例代码如下:
  package cn.ysh.studio.crawler.ie;import watij.runtime.ie.IE;/**
* 基于Watij抓取网页内容,仅限Windows平台
*
* @author www.yshjava.cn
*/publicclassWatijTest{publicstaticvoid main(String[] s){//目标页面String url ="http://www.yshjava.cn";//实例化IE浏览器对象
IE ie =new IE();try{//启动浏览器
ie.start();//转到目标网页
ie.goTo(url);//等待网页加载就绪
ie.waitUntilReady();//打印页面内容System.out.println(ie.html());}catch(Exception e){
e.printStackTrace();}finally{try{//关闭IE浏览器
ie.close();}catch(Exception e){}}}}
  硒
  Selenium 也是 Web 应用程序测试的工具。Selenium 测试直接在浏览器中运行,就像真正的用户在操作一样。支持的浏览器包括 IE、Mozilla Firefox、Mozilla Suite 等。该工具的主要功能包括: 测试浏览器兼容性——测试您的应用程序,看看它是否能在不同的浏览器和操作系统上运行良好。测试系统功能——创建回归测试以验证软件功能和用户需求。支持自动录制动作和自动生成。测试Net、Java、Perl等不同语言的脚本。Selenium是ThoughtWorks专门为web应用编写的验收测试工具。
  网页抓取速度较慢,对于爬虫来说不是一个好的选择。
  示例代码如下:
  package cn.ysh.studio.crawler.selenium;import org.openqa.selenium.htmlunit.HtmlUnitDriver;/**
* 基于HtmlDriver抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHtmlDriverTest{publicstaticvoid main(String[] s){//目标网页String url ="http://www.yshjava.cn";HtmlUnitDriver driver =newHtmlUnitDriver();try{//禁用JS脚本功能
driver.setJavascriptEnabled(false);//打开目标网页
driver.get(url);//获取当前网页源码String html = driver.getPageSource();//打印网页源码System.out.println(html);}catch(Exception e){//打印堆栈信息
e.printStackTrace();}finally{try{//关闭并退出
driver.close();
driver.quit();}catch(Exception e){}}}}
  网络规范
  具有支持脚本执行和 CSS 渲染的接口的开源 Java 浏览器。速度是平均的。
  示例代码如下:
  package cn.ysh.studio.crawler.webspec;import org.watij.webspec.dsl.WebSpec;/**
* 基于WebSpec抓取网页内容
*
* @author www.yshjava.cn
*/publicclassWebspecTest{publicstaticvoid main(String[] s){//目标网页String url ="http://www.yshjava.cn";//实例化浏览器对象WebSpec spec =newWebSpec().mozilla();//隐藏浏览器窗体
spec.hide();//打开目标页面
spec.open(url);//打印网页源码System.out.println(spec.source());//关闭所有窗口
spec.closeAll();}}

htmlunit 抓取网页(htmlunit网络工具一个没有没有 )

网站优化优采云 发表了文章 • 0 个评论 • 69 次浏览 • 2021-11-10 22:05 • 来自相关话题

  htmlunit 抓取网页(htmlunit网络工具一个没有没有
)
  1:背景
  本来想用jsoup抓取一个页面,但是我抓取的数据总是不完整,然后发现页面用js执行后,有些数据渲染在页面上,也就是说,只在执行js后的数据页上。数据会显示出来,但是jsoup无法实现执行页面的js。
  2:解决
  搜索后发现htmlunit网络工具可以执行js,相当于没有页面的浏览器。解决办法是先用htmlUnit发送网络请求,执行js获取页面,然后用jsoup转换成Document页面对象。然后用jsoup分析页面读取数据。
  3: htmlUnit 发送请求
   1 public static Document getDocument() throws IOException, InterruptedException{
2 /*String url="https://www.marklines.com/cn/v ... 3B%3B
3 Connection connect = Jsoup.connect(url).userAgent("")
4 .header("Cookie", "PLAY_LANG=cn; _plh=b9289d0a863a8fc9c79fb938f15372f7731d13fb; PLATFORM_SESSION=39034d07000717c664134556ad39869771aabc04-_ldi=520275&_lsh=8cf91cdbcbbb255adff5cba6061f561b642f5157&csrfToken=209f20c8473bc0518413c226f898ff79cd69c3ff-1539926671235-b853a6a63c77dd8fcc364a58&_lpt=%2Fcn%2Fvehicle_sales%2Fsearch&_lsi=1646321; _ga=GA1.2.2146952143.1539926675; _gid=GA1.2.1032787565.1539926675; _plh_notime=8cf91cdbcbbb255adff5cba6061f561b642f5157")
5 .timeout(360000000);
6 Document document = connect.get();*/
7 WebClient wc = new WebClient(BrowserVersion.CHROME);
8 //是否使用不安全的SSL
9 wc.getOptions().setUseInsecureSSL(true);
10 //启用JS解释器,默认为true
11 wc.getOptions().setJavaScriptEnabled(true);
12 //禁用CSS
13 wc.getOptions().setCssEnabled(false);
14 //js运行错误时,是否抛出异常
15 wc.getOptions().setThrowExceptionOnScriptError(false);
16 //状态码错误时,是否抛出异常
17 wc.getOptions().setThrowExceptionOnFailingStatusCode(false);
18 //是否允许使用ActiveX
19 wc.getOptions().setActiveXNative(false);
20 //等待js时间
21 wc.waitForBackgroundJavaScript(600*1000);
22 //设置Ajax异步处理控制器即启用Ajax支持
23 wc.setAjaxController(new NicelyResynchronizingAjaxController());
24 //设置超时时间
25 wc.getOptions().setTimeout(1000000);
26 //不跟踪抓取
27 wc.getOptions().setDoNotTrackEnabled(false);
28 WebRequest request=new WebRequest(new URL("https://www.marklines.com/cn/v ... 6quot;));
29 request.setAdditionalHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0");
30 request.setAdditionalHeader("Cookie","PLAY_LANG=cn; _plh=b9289d0a863a8fc9c79fb938f15372f7731d13fb; PLATFORM_SESSION=39034d07000717c664134556ad39869771aabc04-_ldi=520275&_lsh=8cf91cdbcbbb255adff5cba6061f561b642f5157&csrfToken=209f20c8473bc0518413c226f898ff79cd69c3ff-1539926671235-b853a6a63c77dd8fcc364a58&_lpt=%2Fcn%2Fvehicle_sales%2Fsearch&_lsi=1646321; _ga=GA1.2.2146952143.1539926675; _gid=GA1.2.1032787565.1539926675; _plh_notime=8cf91cdbcbbb255adff5cba6061f561b642f5157");
31 try {
32 //模拟浏览器打开一个目标网址
33 HtmlPage htmlPage = wc.getPage(request);
34 //为了获取js执行的数据 线程开始沉睡等待
35 Thread.sleep(1000);//这个线程的等待 因为js加载需要时间的
36 //以xml形式获取响应文本
37 String xml = htmlPage.asXml();
38 //并转为Document对象return
39 return Jsoup.parse(xml);
40 //System.out.println(xml.contains("结果.xls"));//false
41 } catch (FailingHttpStatusCodeException e) {
42 e.printStackTrace();
43 } catch (MalformedURLException e) {
44 e.printStackTrace();
45 } catch (IOException e) {
46 e.printStackTrace();
47 }
48 return null;
49 }
  4:返回的Document对象交给jsoup处理
  我这里只做了一个简单的输出,我检查了数据是否全部渲染完毕。
   1 Document doc=getDocument();
2 Element table=doc.select("table.table.table-bordered.aggregate_table").get(0);//获取到表格
3 Element tableContext=table.getElementsByTag("tbody").get(0);
4 Elements contextTrs=tableContext.getElementsByTag("tr");
5 System.out.println(contextTrs.size());
6
7
8 String context=doc.toString();
9 OutputStreamWriter pw = null;
10 pw = new OutputStreamWriter(new FileOutputStream("D:/test.txt"),"GBK");
11 pw.write(context);
12 pw.close(); 查看全部

  htmlunit 抓取网页(htmlunit网络工具一个没有没有
)
  1:背景
  本来想用jsoup抓取一个页面,但是我抓取的数据总是不完整,然后发现页面用js执行后,有些数据渲染在页面上,也就是说,只在执行js后的数据页上。数据会显示出来,但是jsoup无法实现执行页面的js。
  2:解决
  搜索后发现htmlunit网络工具可以执行js,相当于没有页面的浏览器。解决办法是先用htmlUnit发送网络请求,执行js获取页面,然后用jsoup转换成Document页面对象。然后用jsoup分析页面读取数据。
  3: htmlUnit 发送请求
   1 public static Document getDocument() throws IOException, InterruptedException{
2 /*String url="https://www.marklines.com/cn/v ... 3B%3B
3 Connection connect = Jsoup.connect(url).userAgent("")
4 .header("Cookie", "PLAY_LANG=cn; _plh=b9289d0a863a8fc9c79fb938f15372f7731d13fb; PLATFORM_SESSION=39034d07000717c664134556ad39869771aabc04-_ldi=520275&_lsh=8cf91cdbcbbb255adff5cba6061f561b642f5157&csrfToken=209f20c8473bc0518413c226f898ff79cd69c3ff-1539926671235-b853a6a63c77dd8fcc364a58&_lpt=%2Fcn%2Fvehicle_sales%2Fsearch&_lsi=1646321; _ga=GA1.2.2146952143.1539926675; _gid=GA1.2.1032787565.1539926675; _plh_notime=8cf91cdbcbbb255adff5cba6061f561b642f5157")
5 .timeout(360000000);
6 Document document = connect.get();*/
7 WebClient wc = new WebClient(BrowserVersion.CHROME);
8 //是否使用不安全的SSL
9 wc.getOptions().setUseInsecureSSL(true);
10 //启用JS解释器,默认为true
11 wc.getOptions().setJavaScriptEnabled(true);
12 //禁用CSS
13 wc.getOptions().setCssEnabled(false);
14 //js运行错误时,是否抛出异常
15 wc.getOptions().setThrowExceptionOnScriptError(false);
16 //状态码错误时,是否抛出异常
17 wc.getOptions().setThrowExceptionOnFailingStatusCode(false);
18 //是否允许使用ActiveX
19 wc.getOptions().setActiveXNative(false);
20 //等待js时间
21 wc.waitForBackgroundJavaScript(600*1000);
22 //设置Ajax异步处理控制器即启用Ajax支持
23 wc.setAjaxController(new NicelyResynchronizingAjaxController());
24 //设置超时时间
25 wc.getOptions().setTimeout(1000000);
26 //不跟踪抓取
27 wc.getOptions().setDoNotTrackEnabled(false);
28 WebRequest request=new WebRequest(new URL("https://www.marklines.com/cn/v ... 6quot;));
29 request.setAdditionalHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0");
30 request.setAdditionalHeader("Cookie","PLAY_LANG=cn; _plh=b9289d0a863a8fc9c79fb938f15372f7731d13fb; PLATFORM_SESSION=39034d07000717c664134556ad39869771aabc04-_ldi=520275&_lsh=8cf91cdbcbbb255adff5cba6061f561b642f5157&csrfToken=209f20c8473bc0518413c226f898ff79cd69c3ff-1539926671235-b853a6a63c77dd8fcc364a58&_lpt=%2Fcn%2Fvehicle_sales%2Fsearch&_lsi=1646321; _ga=GA1.2.2146952143.1539926675; _gid=GA1.2.1032787565.1539926675; _plh_notime=8cf91cdbcbbb255adff5cba6061f561b642f5157");
31 try {
32 //模拟浏览器打开一个目标网址
33 HtmlPage htmlPage = wc.getPage(request);
34 //为了获取js执行的数据 线程开始沉睡等待
35 Thread.sleep(1000);//这个线程的等待 因为js加载需要时间的
36 //以xml形式获取响应文本
37 String xml = htmlPage.asXml();
38 //并转为Document对象return
39 return Jsoup.parse(xml);
40 //System.out.println(xml.contains("结果.xls"));//false
41 } catch (FailingHttpStatusCodeException e) {
42 e.printStackTrace();
43 } catch (MalformedURLException e) {
44 e.printStackTrace();
45 } catch (IOException e) {
46 e.printStackTrace();
47 }
48 return null;
49 }
  4:返回的Document对象交给jsoup处理
  我这里只做了一个简单的输出,我检查了数据是否全部渲染完毕。
   1 Document doc=getDocument();
2 Element table=doc.select("table.table.table-bordered.aggregate_table").get(0);//获取到表格
3 Element tableContext=table.getElementsByTag("tbody").get(0);
4 Elements contextTrs=tableContext.getElementsByTag("tr");
5 System.out.println(contextTrs.size());
6
7
8 String context=doc.toString();
9 OutputStreamWriter pw = null;
10 pw = new OutputStreamWriter(new FileOutputStream("D:/test.txt"),"GBK");
11 pw.write(context);
12 pw.close();

htmlunit 抓取网页(搜索索引可以作为数据挖掘的输入信息,后面才发现错了)

网站优化优采云 发表了文章 • 0 个评论 • 73 次浏览 • 2021-11-10 05:17 • 来自相关话题

  htmlunit 抓取网页(搜索索引可以作为数据挖掘的输入信息,后面才发现错了)
  由于一开始的理解错误,本以为搜索索引可以作为数据挖掘的输入信息,后来发现不对。solr/nutch/lucene形成的搜索索引只是一个搜索索引。只要用户提供查询关键字,就可以找到关键字。单词来自哪个文档并不是文档的文本列表信息,而是挖掘需要整个文档的文本列表(文件中所有单词的集合)才能挖掘出相关信息。
  详细看下Nutch抓取数据后的文件:
  Nutch的输出文件可以分为crawldb、index、index、linkdb和segments。
  Crawldb是所有需要爬取的超链接信息
  (另外:存储下载地址,以及下载日期,用于查看页面更新时间)
  Linkdb 中存储的是所有超链接以及每个链接的链接地址和锚文本。
  Segments:存放抓取到的页面的页面,与上面链接的深度有关。如果深度设置为2,则在segments下会生成两个以时间命名的子文件夹,例如“201”。每轮爬取时,根据 crawldb 生成 Segments。存储的信息包括6种内容,crawl_fetch、crawl_generate、crawl_parse、parse_data和parse_text。内容为抓取到的网页内容;crawl_generate 最初生成(要下载的 URL 集合);crawl_fetch(每个下载地址的状态),爬取时生成的内容;crawl_parse(包括用于更新crawldb的外部链接)、parse_data、Parse_text是在解析捕获的数据文件时生成的。其中crawl_generate、crawl_fetch和crawl_parse是crawldb的url数据的一部分。
  indexs:存储每次下载的独立索引目录。这个可以通过Crawldb、Linkdb和segments合成:bin/nutch index crawl/indexscrawl/crawldb crawl/linkdb crawl/segments/*
  index:索引合并,存储索引信息。(Nutch的索引中没有存储内容,内容是存储在segment中的,所以直接用Lucene读取Nutch生成的索引会出现问题。Lucene中的segment与Nutch中的segment不同。 Lucene中的segments是索引的一部分,而Nutch中的segment只是WebDB中网页各个部分的内容和索引,它生成的索引与这些segment无关。)
  因为挖掘的不是索引文件,而是文档的解析词列表,所以我们关心的是nutch是如何解析网页的。通常,网络爬虫在抓取网页时会解析网页的内容,并将内容下载到本地存储。如果网页可以解析,自然解析pdf文档就不是问题了。Nutch 对富文本的分析是插件的形式,所以只需要在配置文件中添加这个选项。关键问题是如何提取解析后的文本?由于segment下的所有文件都是二进制文件,我们不知道如何将它们转换为可见的文本字符。Nutch 提供了导出捕获数据以供查看的命令。比如为了获取linkdb中的内容,我们可以
  使用bin/nutch readlinkdb crawl/linkdb/ -dump linkdb(导出地址),然后会在linkdb文件夹中看到part-00000,然后就可以用文本方式打开了。关键是我们要的是parse_data和parse_text,把segment数据整体导出,bin/nutchreadseg -dump crawl/segments/201segdb导出segment,其中crawl/segments/201是segment文件夹,segdb是转换后存储 文件夹的内容,这样查看时,收录了segments文件夹下的所有文件信息。在网上找了半天,没有找到可以直接操作解析文件的命令。有知道的请告诉我!或者如何使用它来解析文件信息。如果您之前使用过,请留言咨询!
  在readseg命令之后,添加一个可选参数命令,-nocontent,这样就不会导出内容,-noparsedata,这样就不会导出parse_data。这样的命令后只能导出parse_text,即解析后的文本,比如网页内容,里面收录label元素,parse_text,去除网页格式的文本信息
  参考资料:
  1.
  2.
  3.
  4. 查看全部

  htmlunit 抓取网页(搜索索引可以作为数据挖掘的输入信息,后面才发现错了)
  由于一开始的理解错误,本以为搜索索引可以作为数据挖掘的输入信息,后来发现不对。solr/nutch/lucene形成的搜索索引只是一个搜索索引。只要用户提供查询关键字,就可以找到关键字。单词来自哪个文档并不是文档的文本列表信息,而是挖掘需要整个文档的文本列表(文件中所有单词的集合)才能挖掘出相关信息。
  详细看下Nutch抓取数据后的文件:
  Nutch的输出文件可以分为crawldb、index、index、linkdb和segments。
  Crawldb是所有需要爬取的超链接信息
  (另外:存储下载地址,以及下载日期,用于查看页面更新时间)
  Linkdb 中存储的是所有超链接以及每个链接的链接地址和锚文本。
  Segments:存放抓取到的页面的页面,与上面链接的深度有关。如果深度设置为2,则在segments下会生成两个以时间命名的子文件夹,例如“201”。每轮爬取时,根据 crawldb 生成 Segments。存储的信息包括6种内容,crawl_fetch、crawl_generate、crawl_parse、parse_data和parse_text。内容为抓取到的网页内容;crawl_generate 最初生成(要下载的 URL 集合);crawl_fetch(每个下载地址的状态),爬取时生成的内容;crawl_parse(包括用于更新crawldb的外部链接)、parse_data、Parse_text是在解析捕获的数据文件时生成的。其中crawl_generate、crawl_fetch和crawl_parse是crawldb的url数据的一部分。
  indexs:存储每次下载的独立索引目录。这个可以通过Crawldb、Linkdb和segments合成:bin/nutch index crawl/indexscrawl/crawldb crawl/linkdb crawl/segments/*
  index:索引合并,存储索引信息。(Nutch的索引中没有存储内容,内容是存储在segment中的,所以直接用Lucene读取Nutch生成的索引会出现问题。Lucene中的segment与Nutch中的segment不同。 Lucene中的segments是索引的一部分,而Nutch中的segment只是WebDB中网页各个部分的内容和索引,它生成的索引与这些segment无关。)
  因为挖掘的不是索引文件,而是文档的解析词列表,所以我们关心的是nutch是如何解析网页的。通常,网络爬虫在抓取网页时会解析网页的内容,并将内容下载到本地存储。如果网页可以解析,自然解析pdf文档就不是问题了。Nutch 对富文本的分析是插件的形式,所以只需要在配置文件中添加这个选项。关键问题是如何提取解析后的文本?由于segment下的所有文件都是二进制文件,我们不知道如何将它们转换为可见的文本字符。Nutch 提供了导出捕获数据以供查看的命令。比如为了获取linkdb中的内容,我们可以
  使用bin/nutch readlinkdb crawl/linkdb/ -dump linkdb(导出地址),然后会在linkdb文件夹中看到part-00000,然后就可以用文本方式打开了。关键是我们要的是parse_data和parse_text,把segment数据整体导出,bin/nutchreadseg -dump crawl/segments/201segdb导出segment,其中crawl/segments/201是segment文件夹,segdb是转换后存储 文件夹的内容,这样查看时,收录了segments文件夹下的所有文件信息。在网上找了半天,没有找到可以直接操作解析文件的命令。有知道的请告诉我!或者如何使用它来解析文件信息。如果您之前使用过,请留言咨询!
  在readseg命令之后,添加一个可选参数命令,-nocontent,这样就不会导出内容,-noparsedata,这样就不会导出parse_data。这样的命令后只能导出parse_text,即解析后的文本,比如网页内容,里面收录label元素,parse_text,去除网页格式的文本信息
  参考资料:
  1.
  2.
  3.
  4.

htmlunit 抓取网页(网站服务器防火墙直接拒绝访问网站防火墙模拟下浏览器)

网站优化优采云 发表了文章 • 0 个评论 • 66 次浏览 • 2021-11-07 20:16 • 来自相关话题

  htmlunit 抓取网页(网站服务器防火墙直接拒绝访问网站防火墙模拟下浏览器)
  我们上面的测试代码是直接请求的,部分网站服务器防火墙会直接拒绝访问。
  我们现在使用 htmlunit 来模拟浏览器请求;主要是添加一些header消息;
  
  这是我们用谷歌调试工具看到的请求头中的属性,当然也有返回的头信息;
  我们可以使用htmlunit来模拟浏览器执行,内置可以模拟IE、Firefox、Google;
  WebClient构造方法中有一个重载方法,可以添加指定的版本属性;
  
  完整代码:
  package com.hbk.htmlunit;
import java.io.IOException;
import java.net.MalformedURLException;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
/**
*
* @author 黄宝康
*获取http://www.3dns.com.cn的源代码
*/
public class HtmlUnitTest
{
public static void main( String[] args )
{
WebClient webClient = new WebClient(BrowserVersion.FIREFOX_45); // 实例化Web客户端
try {
HtmlPage page = webClient.getPage("http://www.3dns.com.cn/");
System.out.println("网页html:"+page.asXml());// 获取html
System.out.println("======================");
System.out.println("网页文本:"+page.asText());// 获取文本
} catch (FailingHttpStatusCodeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
webClient.close(); // 关闭客户端,释放内存
}
}
}
  效果是一样的。 查看全部

  htmlunit 抓取网页(网站服务器防火墙直接拒绝访问网站防火墙模拟下浏览器)
  我们上面的测试代码是直接请求的,部分网站服务器防火墙会直接拒绝访问。
  我们现在使用 htmlunit 来模拟浏览器请求;主要是添加一些header消息;
  
  这是我们用谷歌调试工具看到的请求头中的属性,当然也有返回的头信息;
  我们可以使用htmlunit来模拟浏览器执行,内置可以模拟IE、Firefox、Google;
  WebClient构造方法中有一个重载方法,可以添加指定的版本属性;
  
  完整代码:
  package com.hbk.htmlunit;
import java.io.IOException;
import java.net.MalformedURLException;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
/**
*
* @author 黄宝康
*获取http://www.3dns.com.cn的源代码
*/
public class HtmlUnitTest
{
public static void main( String[] args )
{
WebClient webClient = new WebClient(BrowserVersion.FIREFOX_45); // 实例化Web客户端
try {
HtmlPage page = webClient.getPage("http://www.3dns.com.cn/";);
System.out.println("网页html:"+page.asXml());// 获取html
System.out.println("======================");
System.out.println("网页文本:"+page.asText());// 获取文本
} catch (FailingHttpStatusCodeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
webClient.close(); // 关闭客户端,释放内存
}
}
}
  效果是一样的。

htmlunit 抓取网页(Larbin开发语言:Java简介:Apache的子项目之一)

网站优化优采云 发表了文章 • 0 个评论 • 56 次浏览 • 2021-11-06 19:39 • 来自相关话题

  htmlunit 抓取网页(Larbin开发语言:Java简介:Apache的子项目之一)
  拉宾
  开发语言:C++
  Larbin 是一个基于 C++ 的网络爬虫工具,界面易于操作,但只能在 LINUX 下运行。Larbin在普通PC下每天可以抓取500万个页面(当然,你需要有良好的网络)
  介绍
  Larbin 是一个开源的网络爬虫/网络蜘蛛,由法国年轻人 Sébastien Ailleret 独立开发。larbin 的目的是能够跟踪页面的 URL 进行扩展抓取,最终为搜索引擎提供广泛的数据源。
  larbin只是一个爬虫,也就是说larbin只爬网页,如何解析是用户自己做的。此外,larbin 没有提供有关如何将其存储在数据库中和构建索引的信息。
  Latbin 最初的设计也是基于简单设计但高度可配置的原则。因此,我们可以看到一个简单的larbin爬虫每天可以获取500万个网页,非常高效。
  功能
  1. larbin 获取一个,确认网站的所有链接,甚至镜像一个网站。
  2. larbin建立一个url列表组,比如url检索所有网页后,得到xml的链接。或者mp3。
  3. larbin 定制后可以作为搜索引擎信息的来源(比如每2000组爬取的网页可以存储在一系列的目录结构中)。
  问题
  Labin的主要问题是:
  只提供保存网页的功能,不做进一步的网页分析;
  不支持分布式系统;
  功能比较简单,提供的配置项不够;
  不支持网页自动重访和更新功能;
  从2003年底开始,Labin就放弃了更新,目前处于荒草丛生的状态。
  **********
  纳奇
  开发语言:Java
  介绍:
  Apache的子项目之一是Lucene项目下的子项目。
  Nutch 是一个完整的网络搜索引擎解决方案,基于 Lucene,类似于 Google。基于Hadoop的分布式处理模型保证了系统的性能。类似Eclipse的插件机制保证了系统可以定制,并且很容易集成到自己的应用程序中。之中。
  一般来说,Nutch 可以分为两个部分:爬行部分和搜索部分。爬行程序对页面进行爬行,将检索到的数据制成倒排索引,搜索程序响应用户的倒排索引搜索请求。爬虫和搜索器的接口是索引,都使用索引中的字段。抓取程序和搜索程序可以位于不同的机器上。下面是爬取部分的详细介绍。
  爬行部分:
  履带由Nutch的履带驱动。这是一组用于创建和维护几种不同数据结构的工具:Web 数据库、一组段和索引。下面对这三种不同的数据结构进行一一说明:
  1、Web 数据库或 WebDB。这是一种特殊的存储数据结构,用于映射捕获的网站数据的结构和属性集合。WebDB用于存储从爬行开始(包括重新爬行)开始的所有网站结构数据和属性。WebDB 仅供爬虫程序使用,搜索程序不使用。WebDB 存储两种实体:页面和链接。该页面代表 Internet 上的一个网页。将这个网页的URL作为一个标记编入索引,同时创建了该网页内容的MD5哈希签名。与网页相关的其他内容也被存储,包括:页面中的链接数(外部链接)、页面爬取信息(在页面被重复爬取的情况下)、以及表示页面级别的分数。链接代表从一个网页到其他网页的链接。因此,WebDB 可以说是一个网络图,以节点为页面,以链接为边。
  2、段。这是网页的集合,并已编入索引。Segment 的 Fetchlist 是爬虫使用的 URL 列表,由 WebDB 生成。Fetcher 的输出数据是从 fetchlist 中取出的网页。Fetcher的输出数据先进行反向索引,然后将索引结果存入segment中。一个segment的生命周期是有限的,下一轮爬行开始的时候就没用了。默认重新爬网间隔为 30 天。因此,可以删除超过此时间限制的段。并且可以节省大量磁盘空间。Segment 以日期和时间命名,因此可以非常直观地查看其生命周期。
  3、索引。索引库是系统中所有爬取到的页面的反向索引。它不是直接从页面反向索引生成的,而是由许多小段索引合并生成的。Nutch 使用 Lucene 来构建索引,因此所有与 Lucene 相关的工具 API 都用于构建索引库。需要说明的是,Lucene的segment概念与Nutch的segment概念完全不同,不要混淆。简单来说,Lucene的segment是Lucene索引库的一部分,而Nutch的segment是被爬取索引的WebDB的一部分。
  爬取过程的详细说明:
  爬取是一个循环过程:爬取工具从WebDB生成一个fetchlist集合;提取工具根据fetchlist从互联网上下载网页内容;工具程序根据提取工具找到的新链接更新WebDB;然后生成一个新的fetchlist;反复。这个 fetch 循环通常在 nutch 中提到:生成/获取/更新循环。
  一般来说,同一个域名下的url链接会被合成到同一个fetchlist中。这样做的考虑是当同时使用多个工具进行抓取时,不会出现重复抓取。Nutch 遵循Robots Exclusion Protocol,可以使用robots.txt 来定义和保护私人网页数据不被捕获。
  以上抓取工具的组合是Nutch的最外层。也可以直接使用底层工具,结合这些底层工具的执行顺序,也可以达到同样的效果。这就是纳奇的魅力所在。下面详细描述上述过程。基础工具的名称在括号中:
  1、创建一个新的 WebDB (admin db -create)。
  2、将开始爬取和Url放入WebDb(注入)。
  3、 从 WebDb 的新段生成 fetchlist(生成)。
  4、 根据fetchlist列表(fetch)获取网页的内容。
  5、根据检索到的网页链接的URL更新WebDB(updatedb)。
  6、重复以上3-5步,直到达到指定的爬行层数。
  7、 使用计算出的 web url 权重分数更新段 (updatesegs)。
  8、 将抓取的网页编入索引。
  9、 消除索引中的重复内容和重复 URL (dedup)。
  10、将多个索引合并为一个大索引,并提供索引库(merge)进行搜索。
  *****************
  赫里特克斯
  开发语言:Java
  Heritrix 是一个开源、可扩展的网络爬虫项目。Heritrix 的设计严​​格遵循 robots.txt 文件和 META 机器人标签的排除说明。
  介绍
  Heritrix 和 Nutch 的比较
  还有纳奇。两者都是 Java 开源框架。Heritrix 是 SourceForge 上的开源产品。Nutch 是 Apache 的一个子项目。他们都被称为网络爬虫。它们的实现原理基本一致:深度遍历网站在本地捕获这些资源,使用的方法是分析每个有效的URI网站,并提交一个Http请求得到相应的结果,生成本地文件和相应的日志信息等。
  Heritrix 是一个“档案爬虫”——用于获取网站内容的完整、准确、深层副本。包括获取图片等非文字内容。抓取并存储相关内容。不拒绝任何内容,不对页面进行任何内容修改。重新抓取不会替换同一 URL 的前一次抓取。通过Web用户界面启动、监控和调整爬虫,可以灵活定义获取URL。
  Nutch和Heritrix的区别:
  Nutch 只获取和保存可索引的内容。Heritrix 接受这一切。力求保留页面的原创外观
  Nutch 可以修剪内容,或转换内容格式。
  Nutch 以数据库优化的格式保存内容以备将来索引;刷新并替换旧内容。而 Heritrix 正在添加(追加)新的内容。
  Nutch 是从命令行运行和控制的。Heritrix 有一个网页控制管理界面。
  Nutch 的定制能力还不够强大,但现在已经改进了。Heritrix 可以控制更多的参数。
  Heritrix 提供的功能没有 nutch 多,感觉就像从整个站点下载一样。既没有索引也没有解析,即使是重复爬取网址也不是很好。
  Heritrix 功能强大但配置起来有点麻烦。
  ************************
  三者的比较
  一、 在功能上,Heritrix 和 Larbin 的功能类似。两者都是纯网络爬虫,提供网站的镜像下载。Nutch 是一个网络搜索引擎框架,抓取网页只是它的一部分功能。
  二、 在分布式处理方面,Nutch 支持分布式处理,而另外两个好像还没有支持。
  三、 从抓取的网页存储方式来看,Heritrix和Larbin都将抓取的内容保存为原创内容类型。并且 Nutch 将内容保存到其特定的格式段。
  第四,对于爬取内容的处理,Heritrix和Larbin都将爬取的内容直接保存为原创内容,不做任何处理。Nutch 处理文本包括链接分析、文本提取和索引(Lucene 索引)。
  第五,在爬取效率方面,Larbin的效率更高,因为它是用C++实现的,功能单一。
  爬虫
  发展
  语
  功能
  单身的
  支持分布式
  爬行
  高效的
  镜像
  节省
  纳奇
  爪哇
  X
  √
  低的
  X
  拉宾
  C++
  √
  X
  高的
  √
  赫里特克斯
  爪哇
  √
  X
  中间
  √
  -------------------------------------------------- ---------
  其他一些开源爬虫的总结:
  网络SPHINX
  WebSPHINX 是 Java 类包和网络爬虫的交互式开发环境。网络爬虫(也称为机器人或蜘蛛)是可以自动浏览和处理网页的程序。WebSPHINX由两部分组成:爬虫工作平台和WebSPHINX包。
  ~rcm/websphinx/
  网络学习
  WebLech 是一个强大的网站下载和镜像工具。支持根据功能需求下载网站,并尽可能模仿标准网页浏览器的行为。WebLech 有功能控制台,使用多线程操作。
  阿拉蕾
  Arale 主要是为个人使用而设计的,不像其他爬虫那样专注于页面索引。Arale 可以下载整个网站或网站上的部分资源。Arale 还可以将动态页面映射到静态页面。
  J-蜘蛛
  J-Spider:是一个完全可配置和可定制的 Web Spider 引擎。可以用它来检查网站错误(内部服务器错误等),网站内外链接检查,分析网站的结构(可以创建一个网站@ &gt; map),下载整个网站,也可以写一个JSpider插件扩展你需要的功能。
  主轴
  Spindle 是一个建立在 Lucene 工具包上的 Web 索引/搜索工具。它包括一个用于创建索引的 HTTP 蜘蛛和一个用于搜索这些索引的搜索类。主轴项目提供了一组JSP标签库,让那些基于JSP的站点无需开发任何Java类就可以添加搜索功能。
  蛛形纲动物
  Arachnid:是一个基于 Java 的网络蜘蛛框架。它收录一个简单的 HTML 解析器,可以分析收录 HTML 内容的输入流。通过实现Arachnid子类,可以开发一个简单的网络蜘蛛,可以在每一个网站中使用 解析一个页面后,添加几行代码调用。Arachnid 下载包中收录两个蜘蛛应用程序示例,用于演示如何使用该框架。
  警报器
  LARM 可以为 Jakarta Lucene 搜索引擎框架的用户提供纯 Java 搜索解决方案。它收录索引文件、数据库表和用于索引网站的爬虫的方法。
  乔博
  JoBo 是一个用于下载整个网站的简单工具。它本质上是一个网络蜘蛛。与其他下载工具相比,它的主要优点是能够自动填写表单(如自动登录)和使用cookies来处理会话。JoBo 还具有灵活的下载规则(如:URL、大小、MIME 类型等)来限制下载。
  snoics-爬行动物
  snoics -reptile 是用纯 Java 开发的。它是用于捕获 网站 图像的工具。您可以使用配置文件中提供的 URL 条目来传输所有可以通过浏览器 GET 的 网站。这种方式获取的所有资源都是本地抓取的,包括网页和各类文件,如图片、flash、mp3、zip、rar、exe等文件。整个网站可以完全转移到硬盘上,保持原有的网站结构准确不变。只需将捕获到的网站放入Web服务器(如Apache)即可实现完整的网站镜像。
  网络收获
  Web-Harvest 是一个 Java 开源 Web 数据提取工具。它可以采集指定的网页并从这些网页中提取有用的数据。Web-Harvest主要使用XSLT、XQuery、正则表达式等技术来实现text/xml的操作。
  蜘蛛
  Spiderpy 是一个基于 Python 编码的开源网络爬虫工具,允许用户采集文件和搜索网站,并具有可配置的界面。
  蜘蛛网网络 Xoops Mod 团队
  pider Web Network Xoops Mod 是 Xoops 下的一个模块,完全由 PHP 语言实现。 查看全部

  htmlunit 抓取网页(Larbin开发语言:Java简介:Apache的子项目之一)
  拉宾
  开发语言:C++
  Larbin 是一个基于 C++ 的网络爬虫工具,界面易于操作,但只能在 LINUX 下运行。Larbin在普通PC下每天可以抓取500万个页面(当然,你需要有良好的网络)
  介绍
  Larbin 是一个开源的网络爬虫/网络蜘蛛,由法国年轻人 Sébastien Ailleret 独立开发。larbin 的目的是能够跟踪页面的 URL 进行扩展抓取,最终为搜索引擎提供广泛的数据源。
  larbin只是一个爬虫,也就是说larbin只爬网页,如何解析是用户自己做的。此外,larbin 没有提供有关如何将其存储在数据库中和构建索引的信息。
  Latbin 最初的设计也是基于简单设计但高度可配置的原则。因此,我们可以看到一个简单的larbin爬虫每天可以获取500万个网页,非常高效。
  功能
  1. larbin 获取一个,确认网站的所有链接,甚至镜像一个网站。
  2. larbin建立一个url列表组,比如url检索所有网页后,得到xml的链接。或者mp3。
  3. larbin 定制后可以作为搜索引擎信息的来源(比如每2000组爬取的网页可以存储在一系列的目录结构中)。
  问题
  Labin的主要问题是:
  只提供保存网页的功能,不做进一步的网页分析;
  不支持分布式系统;
  功能比较简单,提供的配置项不够;
  不支持网页自动重访和更新功能;
  从2003年底开始,Labin就放弃了更新,目前处于荒草丛生的状态。
  **********
  纳奇
  开发语言:Java
  介绍:
  Apache的子项目之一是Lucene项目下的子项目。
  Nutch 是一个完整的网络搜索引擎解决方案,基于 Lucene,类似于 Google。基于Hadoop的分布式处理模型保证了系统的性能。类似Eclipse的插件机制保证了系统可以定制,并且很容易集成到自己的应用程序中。之中。
  一般来说,Nutch 可以分为两个部分:爬行部分和搜索部分。爬行程序对页面进行爬行,将检索到的数据制成倒排索引,搜索程序响应用户的倒排索引搜索请求。爬虫和搜索器的接口是索引,都使用索引中的字段。抓取程序和搜索程序可以位于不同的机器上。下面是爬取部分的详细介绍。
  爬行部分:
  履带由Nutch的履带驱动。这是一组用于创建和维护几种不同数据结构的工具:Web 数据库、一组段和索引。下面对这三种不同的数据结构进行一一说明:
  1、Web 数据库或 WebDB。这是一种特殊的存储数据结构,用于映射捕获的网站数据的结构和属性集合。WebDB用于存储从爬行开始(包括重新爬行)开始的所有网站结构数据和属性。WebDB 仅供爬虫程序使用,搜索程序不使用。WebDB 存储两种实体:页面和链接。该页面代表 Internet 上的一个网页。将这个网页的URL作为一个标记编入索引,同时创建了该网页内容的MD5哈希签名。与网页相关的其他内容也被存储,包括:页面中的链接数(外部链接)、页面爬取信息(在页面被重复爬取的情况下)、以及表示页面级别的分数。链接代表从一个网页到其他网页的链接。因此,WebDB 可以说是一个网络图,以节点为页面,以链接为边。
  2、段。这是网页的集合,并已编入索引。Segment 的 Fetchlist 是爬虫使用的 URL 列表,由 WebDB 生成。Fetcher 的输出数据是从 fetchlist 中取出的网页。Fetcher的输出数据先进行反向索引,然后将索引结果存入segment中。一个segment的生命周期是有限的,下一轮爬行开始的时候就没用了。默认重新爬网间隔为 30 天。因此,可以删除超过此时间限制的段。并且可以节省大量磁盘空间。Segment 以日期和时间命名,因此可以非常直观地查看其生命周期。
  3、索引。索引库是系统中所有爬取到的页面的反向索引。它不是直接从页面反向索引生成的,而是由许多小段索引合并生成的。Nutch 使用 Lucene 来构建索引,因此所有与 Lucene 相关的工具 API 都用于构建索引库。需要说明的是,Lucene的segment概念与Nutch的segment概念完全不同,不要混淆。简单来说,Lucene的segment是Lucene索引库的一部分,而Nutch的segment是被爬取索引的WebDB的一部分。
  爬取过程的详细说明:
  爬取是一个循环过程:爬取工具从WebDB生成一个fetchlist集合;提取工具根据fetchlist从互联网上下载网页内容;工具程序根据提取工具找到的新链接更新WebDB;然后生成一个新的fetchlist;反复。这个 fetch 循环通常在 nutch 中提到:生成/获取/更新循环。
  一般来说,同一个域名下的url链接会被合成到同一个fetchlist中。这样做的考虑是当同时使用多个工具进行抓取时,不会出现重复抓取。Nutch 遵循Robots Exclusion Protocol,可以使用robots.txt 来定义和保护私人网页数据不被捕获。
  以上抓取工具的组合是Nutch的最外层。也可以直接使用底层工具,结合这些底层工具的执行顺序,也可以达到同样的效果。这就是纳奇的魅力所在。下面详细描述上述过程。基础工具的名称在括号中:
  1、创建一个新的 WebDB (admin db -create)。
  2、将开始爬取和Url放入WebDb(注入)。
  3、 从 WebDb 的新段生成 fetchlist(生成)。
  4、 根据fetchlist列表(fetch)获取网页的内容。
  5、根据检索到的网页链接的URL更新WebDB(updatedb)。
  6、重复以上3-5步,直到达到指定的爬行层数。
  7、 使用计算出的 web url 权重分数更新段 (updatesegs)。
  8、 将抓取的网页编入索引。
  9、 消除索引中的重复内容和重复 URL (dedup)。
  10、将多个索引合并为一个大索引,并提供索引库(merge)进行搜索。
  *****************
  赫里特克斯
  开发语言:Java
  Heritrix 是一个开源、可扩展的网络爬虫项目。Heritrix 的设计严​​格遵循 robots.txt 文件和 META 机器人标签的排除说明。
  介绍
  Heritrix 和 Nutch 的比较
  还有纳奇。两者都是 Java 开源框架。Heritrix 是 SourceForge 上的开源产品。Nutch 是 Apache 的一个子项目。他们都被称为网络爬虫。它们的实现原理基本一致:深度遍历网站在本地捕获这些资源,使用的方法是分析每个有效的URI网站,并提交一个Http请求得到相应的结果,生成本地文件和相应的日志信息等。
  Heritrix 是一个“档案爬虫”——用于获取网站内容的完整、准确、深层副本。包括获取图片等非文字内容。抓取并存储相关内容。不拒绝任何内容,不对页面进行任何内容修改。重新抓取不会替换同一 URL 的前一次抓取。通过Web用户界面启动、监控和调整爬虫,可以灵活定义获取URL。
  Nutch和Heritrix的区别:
  Nutch 只获取和保存可索引的内容。Heritrix 接受这一切。力求保留页面的原创外观
  Nutch 可以修剪内容,或转换内容格式。
  Nutch 以数据库优化的格式保存内容以备将来索引;刷新并替换旧内容。而 Heritrix 正在添加(追加)新的内容。
  Nutch 是从命令行运行和控制的。Heritrix 有一个网页控制管理界面。
  Nutch 的定制能力还不够强大,但现在已经改进了。Heritrix 可以控制更多的参数。
  Heritrix 提供的功能没有 nutch 多,感觉就像从整个站点下载一样。既没有索引也没有解析,即使是重复爬取网址也不是很好。
  Heritrix 功能强大但配置起来有点麻烦。
  ************************
  三者的比较
  一、 在功能上,Heritrix 和 Larbin 的功能类似。两者都是纯网络爬虫,提供网站的镜像下载。Nutch 是一个网络搜索引擎框架,抓取网页只是它的一部分功能。
  二、 在分布式处理方面,Nutch 支持分布式处理,而另外两个好像还没有支持。
  三、 从抓取的网页存储方式来看,Heritrix和Larbin都将抓取的内容保存为原创内容类型。并且 Nutch 将内容保存到其特定的格式段。
  第四,对于爬取内容的处理,Heritrix和Larbin都将爬取的内容直接保存为原创内容,不做任何处理。Nutch 处理文本包括链接分析、文本提取和索引(Lucene 索引)。
  第五,在爬取效率方面,Larbin的效率更高,因为它是用C++实现的,功能单一。
  爬虫
  发展
  语
  功能
  单身的
  支持分布式
  爬行
  高效的
  镜像
  节省
  纳奇
  爪哇
  X
  √
  低的
  X
  拉宾
  C++
  √
  X
  高的
  √
  赫里特克斯
  爪哇
  √
  X
  中间
  √
  -------------------------------------------------- ---------
  其他一些开源爬虫的总结:
  网络SPHINX
  WebSPHINX 是 Java 类包和网络爬虫的交互式开发环境。网络爬虫(也称为机器人或蜘蛛)是可以自动浏览和处理网页的程序。WebSPHINX由两部分组成:爬虫工作平台和WebSPHINX包。
  ~rcm/websphinx/
  网络学习
  WebLech 是一个强大的网站下载和镜像工具。支持根据功能需求下载网站,并尽可能模仿标准网页浏览器的行为。WebLech 有功能控制台,使用多线程操作。
  阿拉蕾
  Arale 主要是为个人使用而设计的,不像其他爬虫那样专注于页面索引。Arale 可以下载整个网站或网站上的部分资源。Arale 还可以将动态页面映射到静态页面。
  J-蜘蛛
  J-Spider:是一个完全可配置和可定制的 Web Spider 引擎。可以用它来检查网站错误(内部服务器错误等),网站内外链接检查,分析网站的结构(可以创建一个网站@ &gt; map),下载整个网站,也可以写一个JSpider插件扩展你需要的功能。
  主轴
  Spindle 是一个建立在 Lucene 工具包上的 Web 索引/搜索工具。它包括一个用于创建索引的 HTTP 蜘蛛和一个用于搜索这些索引的搜索类。主轴项目提供了一组JSP标签库,让那些基于JSP的站点无需开发任何Java类就可以添加搜索功能。
  蛛形纲动物
  Arachnid:是一个基于 Java 的网络蜘蛛框架。它收录一个简单的 HTML 解析器,可以分析收录 HTML 内容的输入流。通过实现Arachnid子类,可以开发一个简单的网络蜘蛛,可以在每一个网站中使用 解析一个页面后,添加几行代码调用。Arachnid 下载包中收录两个蜘蛛应用程序示例,用于演示如何使用该框架。
  警报器
  LARM 可以为 Jakarta Lucene 搜索引擎框架的用户提供纯 Java 搜索解决方案。它收录索引文件、数据库表和用于索引网站的爬虫的方法。
  乔博
  JoBo 是一个用于下载整个网站的简单工具。它本质上是一个网络蜘蛛。与其他下载工具相比,它的主要优点是能够自动填写表单(如自动登录)和使用cookies来处理会话。JoBo 还具有灵活的下载规则(如:URL、大小、MIME 类型等)来限制下载。
  snoics-爬行动物
  snoics -reptile 是用纯 Java 开发的。它是用于捕获 网站 图像的工具。您可以使用配置文件中提供的 URL 条目来传输所有可以通过浏览器 GET 的 网站。这种方式获取的所有资源都是本地抓取的,包括网页和各类文件,如图片、flash、mp3、zip、rar、exe等文件。整个网站可以完全转移到硬盘上,保持原有的网站结构准确不变。只需将捕获到的网站放入Web服务器(如Apache)即可实现完整的网站镜像。
  网络收获
  Web-Harvest 是一个 Java 开源 Web 数据提取工具。它可以采集指定的网页并从这些网页中提取有用的数据。Web-Harvest主要使用XSLT、XQuery、正则表达式等技术来实现text/xml的操作。
  蜘蛛
  Spiderpy 是一个基于 Python 编码的开源网络爬虫工具,允许用户采集文件和搜索网站,并具有可配置的界面。
  蜘蛛网网络 Xoops Mod 团队
  pider Web Network Xoops Mod 是 Xoops 下的一个模块,完全由 PHP 语言实现。

htmlunit 抓取网页(java页面分析工具是什么?是怎么做的? )

网站优化优采云 发表了文章 • 0 个评论 • 99 次浏览 • 2021-11-05 14:02 • 来自相关话题

  htmlunit 抓取网页(java页面分析工具是什么?是怎么做的?
)
  一、什么是 HtmlUnit?
  1、htmlunit 是一个开源的java页面分析工具。阅读完页面后,您可以有效地使用 htmlunit 来分析页面上的内容。该项目可以模拟浏览器操作,被称为java浏览器的开源实现。它是一个没有界面的浏览器,运行速度很快。
  2、 使用 Rhinojs 引擎。模拟js运行
  3、常规意义上,这个项目可以用来测试页面,实现网页的自动化测试,(包括JS)
  4、 但是一般来说,在小型爬虫项目中,这种框架非常常用,可以有效的分析dom标签,有效的运行页面上的js,得到一些需要的js执行。价值。
  二、应用:获取百度API返回的详细url,从详细url中抓取图片url
  maven 依赖:
  
net.sourceforge.htmlunit
htmlunit-core-js
2.23
net.sourceforge.htmlunit
htmlunit
2.23
xml-apis
xml-apis
1.4.01
  服务器代码:
  /**
* 从百度POI详情页获取图片url
* @param poiUid
* @return
*/
public static List grabImgUrl(String poiUid) {
if (StringUtils.isBlank(poiUid)) {
return null;
}
final String IMG_LIST_URL = "http://map.baidu.com/detail%3F ... 3B%3B
String detailUrl = IMG_LIST_URL + poiUid;
log.info("grabImgUrl. detailUrl=" + detailUrl);
final String DIV_ID = "photoContainer";
final String TAG_IMG = "img";
final String IMG_SRC = "src";
try (final WebClient webClient = new WebClient()) {
final HtmlPage page = webClient.getPage(detailUrl);
if (page != null && page.isHtmlPage()) {
Thread.sleep(40000); // 等待页面加载完成。
final HtmlDivision div = page.getHtmlElementById(DIV_ID);
DomNodeList eleList = div.getElementsByTagName(TAG_IMG);
List imgUrlList = new ArrayList();
for (HtmlElement hele : eleList) {
String imgUrl = hele.getAttribute(IMG_SRC);
if (StringUtils.isNotBlank(imgUrl)) {
log.info("imgUrl=" + imgUrl);
imgUrlList.add(imgUrl);
}
}
return imgUrlList;
}
} catch (Exception e) {
log.error("grabImgUrl error.", e);
}
return null;
}
  页面显示:
  
${im.picUrl }
设为封面
× 查看全部

  htmlunit 抓取网页(java页面分析工具是什么?是怎么做的?
)
  一、什么是 HtmlUnit?
  1、htmlunit 是一个开源的java页面分析工具。阅读完页面后,您可以有效地使用 htmlunit 来分析页面上的内容。该项目可以模拟浏览器操作,被称为java浏览器的开源实现。它是一个没有界面的浏览器,运行速度很快。
  2、 使用 Rhinojs 引擎。模拟js运行
  3、常规意义上,这个项目可以用来测试页面,实现网页的自动化测试,(包括JS)
  4、 但是一般来说,在小型爬虫项目中,这种框架非常常用,可以有效的分析dom标签,有效的运行页面上的js,得到一些需要的js执行。价值。
  二、应用:获取百度API返回的详细url,从详细url中抓取图片url
  maven 依赖:
  
net.sourceforge.htmlunit
htmlunit-core-js
2.23
net.sourceforge.htmlunit
htmlunit
2.23
xml-apis
xml-apis
1.4.01
  服务器代码:
  /**
* 从百度POI详情页获取图片url
* @param poiUid
* @return
*/
public static List grabImgUrl(String poiUid) {
if (StringUtils.isBlank(poiUid)) {
return null;
}
final String IMG_LIST_URL = "http://map.baidu.com/detail%3F ... 3B%3B
String detailUrl = IMG_LIST_URL + poiUid;
log.info("grabImgUrl. detailUrl=" + detailUrl);
final String DIV_ID = "photoContainer";
final String TAG_IMG = "img";
final String IMG_SRC = "src";
try (final WebClient webClient = new WebClient()) {
final HtmlPage page = webClient.getPage(detailUrl);
if (page != null && page.isHtmlPage()) {
Thread.sleep(40000); // 等待页面加载完成。
final HtmlDivision div = page.getHtmlElementById(DIV_ID);
DomNodeList eleList = div.getElementsByTagName(TAG_IMG);
List imgUrlList = new ArrayList();
for (HtmlElement hele : eleList) {
String imgUrl = hele.getAttribute(IMG_SRC);
if (StringUtils.isNotBlank(imgUrl)) {
log.info("imgUrl=" + imgUrl);
imgUrlList.add(imgUrl);
}
}
return imgUrlList;
}
} catch (Exception e) {
log.error("grabImgUrl error.", e);
}
return null;
}
  页面显示:
  
${im.picUrl }
设为封面
×

htmlunit 抓取网页(使用本文中推荐的开源工具——HtmlUnit,一款能够模拟浏览器的抓包神器!)

网站优化优采云 发表了文章 • 0 个评论 • 62 次浏览 • 2021-10-31 22:23 • 来自相关话题

  htmlunit 抓取网页(使用本文中推荐的开源工具——HtmlUnit,一款能够模拟浏览器的抓包神器!)
  之前一峰写过一篇关于使用Jsoup爬取网页内容的文章文章:
  [Jsoup] HTML 解析器,轻松访问网页内容
  Jsoup提供的api非常方便,完全类似于JQuery操作,轻松抓取网页数据。但是像Jsoup这样的普通爬虫工具的缺点是无法处理js生成的内容。
  做过Html开发的都知道,现在很多网站都大量使用ajax和JavaScript来获取和处理数据,普通的爬虫工具已经无法处理js中的内容了。
  比如我们在本地新建一个测试web文件text.html,源码如下:
   main.html a { line-height: 30px; margin: 20px; } var datas = [ { href : "http://www.jianshu.com/p/8d8edf25850d", title : "推荐一款编程字体,让代码看着更美"}, { href : "http://www.jianshu.com/p/153d9f31288d", title : "Android 利用Camera实现中轴3D卡牌翻转效果"}, { href : "http://www.jianshu.com/p/d6fb0c9c9c26", title : "【Eclipse】挖掘专属最有用的快捷键组合"}, { href : "http://www.jianshu.com/p/72d69b49d135", title : "【IIS】Windows下利用IIS建立网站并实现局域网共享"} ];window.onload = function() { var infos = document.getElementById("infos"); for( var i = 0 ; i < datas.length ; i++) { var a = document.createElement("a"); a.href = datas[i].href ; a.innerText = datas[i].title; infos.appendChild(a); infos.appendChild(document.createElement("br")) }} HtmlUnit 测试网页内容!

  通过IIS发布本地网站(参考易峰之前写的文章:【IIS】Windows下使用IIS建立网站,实现局域网共享),浏览器显示网页将如下:
  网页展示效果.jpg
  虽然通过网页评论元素可以看到body收录了网页显示中的文本内容:
  网络评论元素.jpg
  但是,它根本无法通过 Jsoup 工具使用!从网页源码中可以看出,我们需要抓取的内容是在页面显示后通过ajax和JavaScript加载的。
  那么该怎么办?使用本文推荐的开源工具——HtmlUnit,一款可以模拟浏览器的抓包神器!
  在官网下载对应的jar包,添加到工程项目的lib中。简单的测试代码如下:
  import java.io.IOException;import java.net.MalformedURLException;import java.text.ParseException;import com.gargoylesoftware.htmlunit.BrowserVersion;import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;import com.gargoylesoftware.htmlunit.WebClient;import com.gargoylesoftware.htmlunit.html.DomElement;import com.gargoylesoftware.htmlunit.html.DomNodeList;import com.gargoylesoftware.htmlunit.html.HtmlPage;/** * @author 亦枫 * @created_time 2016年1月12日 * @file_user_todo Java测试类 * @blog http://www.jianshu.com/users/1 ... icles */public class JavaTest { /** * 入口函数 * @param args * @throws ParseException */ public static void main(String[] args) throws ParseException { try { WebClient webClient = new WebClient(BrowserVersion.CHROME); HtmlPage htmlPage = (HtmlPage) webClient.getPage("http://localhost/test.html"); DomNodeList domNodeList = htmlPage.getElementsByTagName("a"); for (int i = 0; i < domNodeList.size(); i++) { DomElement domElement = (DomElement) domNodeList.get(i); System.out.println(domElement.asText()); } webClient.close(); } catch (FailingHttpStatusCodeException e) { e.printStackTrace(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }}
  运行后,控制台打印结果:
  HtmlUnit 测试结果.jpg
  可见HtmlUnit可以抓取AJAX和JavaScript加载的内容。
  HtmlUnit的介绍在官网上很详细。以下内容为易峰翻译的部分内容,供大家参考:
  HtmlUnit 是一个基于 Java 的浏览器程序,没有图形界面。它可以调用HTML文档并提供API,让开发者可以像在普通浏览器上操作一样访问网页内容、填写表格、点击超链接等。
  它可以很好地支持 JavaScript,并且仍在改进中。同时,它可以解析非常复杂的AJAX库,模拟不同配置下的Chrome、Firefox和IE浏览器。
  HtmlUnit 通常用于测试目的和检索 网站 信息。
  HtmlUnit 提供了很多用于测试网络请求和抓取网页内容的功能。可以到官网或者其他网站学习使用。 查看全部

  htmlunit 抓取网页(使用本文中推荐的开源工具——HtmlUnit,一款能够模拟浏览器的抓包神器!)
  之前一峰写过一篇关于使用Jsoup爬取网页内容的文章文章:
  [Jsoup] HTML 解析器,轻松访问网页内容
  Jsoup提供的api非常方便,完全类似于JQuery操作,轻松抓取网页数据。但是像Jsoup这样的普通爬虫工具的缺点是无法处理js生成的内容。
  做过Html开发的都知道,现在很多网站都大量使用ajax和JavaScript来获取和处理数据,普通的爬虫工具已经无法处理js中的内容了。
  比如我们在本地新建一个测试web文件text.html,源码如下:
   main.html a { line-height: 30px; margin: 20px; } var datas = [ { href : "http://www.jianshu.com/p/8d8edf25850d", title : "推荐一款编程字体,让代码看着更美"}, { href : "http://www.jianshu.com/p/153d9f31288d", title : "Android 利用Camera实现中轴3D卡牌翻转效果"}, { href : "http://www.jianshu.com/p/d6fb0c9c9c26", title : "【Eclipse】挖掘专属最有用的快捷键组合"}, { href : "http://www.jianshu.com/p/72d69b49d135", title : "【IIS】Windows下利用IIS建立网站并实现局域网共享"} ];window.onload = function() { var infos = document.getElementById("infos"); for( var i = 0 ; i < datas.length ; i++) { var a = document.createElement("a"); a.href = datas[i].href ; a.innerText = datas[i].title; infos.appendChild(a); infos.appendChild(document.createElement("br")) }} HtmlUnit 测试网页内容!

  通过IIS发布本地网站(参考易峰之前写的文章:【IIS】Windows下使用IIS建立网站,实现局域网共享),浏览器显示网页将如下:
  网页展示效果.jpg
  虽然通过网页评论元素可以看到body收录了网页显示中的文本内容:
  网络评论元素.jpg
  但是,它根本无法通过 Jsoup 工具使用!从网页源码中可以看出,我们需要抓取的内容是在页面显示后通过ajax和JavaScript加载的。
  那么该怎么办?使用本文推荐的开源工具——HtmlUnit,一款可以模拟浏览器的抓包神器!
  在官网下载对应的jar包,添加到工程项目的lib中。简单的测试代码如下:
  import java.io.IOException;import java.net.MalformedURLException;import java.text.ParseException;import com.gargoylesoftware.htmlunit.BrowserVersion;import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;import com.gargoylesoftware.htmlunit.WebClient;import com.gargoylesoftware.htmlunit.html.DomElement;import com.gargoylesoftware.htmlunit.html.DomNodeList;import com.gargoylesoftware.htmlunit.html.HtmlPage;/** * @author 亦枫 * @created_time 2016年1月12日 * @file_user_todo Java测试类 * @blog http://www.jianshu.com/users/1 ... icles */public class JavaTest { /** * 入口函数 * @param args * @throws ParseException */ public static void main(String[] args) throws ParseException { try { WebClient webClient = new WebClient(BrowserVersion.CHROME); HtmlPage htmlPage = (HtmlPage) webClient.getPage("http://localhost/test.html";); DomNodeList domNodeList = htmlPage.getElementsByTagName("a"); for (int i = 0; i < domNodeList.size(); i++) { DomElement domElement = (DomElement) domNodeList.get(i); System.out.println(domElement.asText()); } webClient.close(); } catch (FailingHttpStatusCodeException e) { e.printStackTrace(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }}
  运行后,控制台打印结果:
  HtmlUnit 测试结果.jpg
  可见HtmlUnit可以抓取AJAX和JavaScript加载的内容。
  HtmlUnit的介绍在官网上很详细。以下内容为易峰翻译的部分内容,供大家参考:
  HtmlUnit 是一个基于 Java 的浏览器程序,没有图形界面。它可以调用HTML文档并提供API,让开发者可以像在普通浏览器上操作一样访问网页内容、填写表格、点击超链接等。
  它可以很好地支持 JavaScript,并且仍在改进中。同时,它可以解析非常复杂的AJAX库,模拟不同配置下的Chrome、Firefox和IE浏览器。
  HtmlUnit 通常用于测试目的和检索 网站 信息。
  HtmlUnit 提供了很多用于测试网络请求和抓取网页内容的功能。可以到官网或者其他网站学习使用。

htmlunit 抓取网页(百度是全球大的中文搜索引擎,百度收录网站的原则)

网站优化优采云 发表了文章 • 0 个评论 • 97 次浏览 • 2021-10-30 17:15 • 来自相关话题

  htmlunit 抓取网页(百度是全球大的中文搜索引擎,百度收录网站的原则)
  百度是全球最大的中文搜索引擎。百度收录网站的原则基本上是原创为王,复制内容的网站基本不会收录或更少收录。百度已经在中国占据了绝大部分。一定要支持百度做网站,坚持原创。一旦百度把你的网站带入观察期,你就得小心了。它可能会在一个月内清除给您。百度对网站关键词的修改和修改很敏感,所以修改修改的时候一定要小心,一点一点的修改,不要一下子全改。百度收录网站从某种意义上说,人为因素太多,有时看起来不公平,搜索结果也不是那么理想。
  网站操作好不好,关键因素之一是网站收录的内容如何。获得的内容越多,网站的排名和权重就越高。网站的操作会更成功!如果你想让更多的网站页面成为收录,想要更多的网站页面成为收录,你必须想办法吸引搜索引擎蜘蛛. 挑选。——分析认为,影响搜索引擎蜘蛛爬行的主要因素有:
  1.网站 和页面权重:
  优质、资深的网站被认为权重较高,这类网站上的页面爬取深度也会更高,会出现很多收录。
  2.网站 更新频率:
  每次蜘蛛爬行时,都会存储页面数据。如果第二次爬取发现页面和第一次收录完全一样,说明页面没有更新,不需要蜘蛛频繁爬取。页面内容更新频繁,蜘蛛会更频繁地访问页面,页面上出现的新链接自然会被蜘蛛更快地跟踪和抓取。
  3.网站的原创内容:
  站长需要注意的是,原创的内容对百度蜘蛛的吸引力很大。原创的内容似乎是蜘蛛每天需要的主食。
  4. 网站 的整体结构:
  网站的基本结构包括:是否在标题中嵌入关键词、网站标题、meta中的关键字、描述标签、导航栏等。
  5.构建网站地图;
  网站 地图就像一个指针。只有明确的指针才能指引蜘蛛的行踪。对于站长来说,一条方便快捷的道路会吸引更多的蜘蛛。
  6.内链优化:
  蜘蛛来到你的网站之后,自然会通过你的网站结构遍历你的网站,并且能够跑遍你网站上的几乎所有链接,这些链接一旦出现死链接,很容易导致蜘蛛爬不出来。如果次数增加,百度自然不会对你有好感网站。
  7.网站 外部链接:
  为了让站长网站被蜘蛛抓取,必须有导入链接才能进入页面,否则蜘蛛没有机会知道页面的存在。
  8.监控蜘蛛爬行:
  关于如何监控蜘蛛的爬行,可以通过网站日志了解蜘蛛爬行的页面。也可以使用站长工具查看蜘蛛的爬行速度,合理分配资源,实现更高的爬行速度,勾引。更多的蜘蛛。 查看全部

  htmlunit 抓取网页(百度是全球大的中文搜索引擎,百度收录网站的原则)
  百度是全球最大的中文搜索引擎。百度收录网站的原则基本上是原创为王,复制内容的网站基本不会收录或更少收录。百度已经在中国占据了绝大部分。一定要支持百度做网站,坚持原创。一旦百度把你的网站带入观察期,你就得小心了。它可能会在一个月内清除给您。百度对网站关键词的修改和修改很敏感,所以修改修改的时候一定要小心,一点一点的修改,不要一下子全改。百度收录网站从某种意义上说,人为因素太多,有时看起来不公平,搜索结果也不是那么理想。
  网站操作好不好,关键因素之一是网站收录的内容如何。获得的内容越多,网站的排名和权重就越高。网站的操作会更成功!如果你想让更多的网站页面成为收录,想要更多的网站页面成为收录,你必须想办法吸引搜索引擎蜘蛛. 挑选。——分析认为,影响搜索引擎蜘蛛爬行的主要因素有:
  1.网站 和页面权重:
  优质、资深的网站被认为权重较高,这类网站上的页面爬取深度也会更高,会出现很多收录。
  2.网站 更新频率:
  每次蜘蛛爬行时,都会存储页面数据。如果第二次爬取发现页面和第一次收录完全一样,说明页面没有更新,不需要蜘蛛频繁爬取。页面内容更新频繁,蜘蛛会更频繁地访问页面,页面上出现的新链接自然会被蜘蛛更快地跟踪和抓取。
  3.网站的原创内容:
  站长需要注意的是,原创的内容对百度蜘蛛的吸引力很大。原创的内容似乎是蜘蛛每天需要的主食。
  4. 网站 的整体结构:
  网站的基本结构包括:是否在标题中嵌入关键词、网站标题、meta中的关键字、描述标签、导航栏等。
  5.构建网站地图;
  网站 地图就像一个指针。只有明确的指针才能指引蜘蛛的行踪。对于站长来说,一条方便快捷的道路会吸引更多的蜘蛛。
  6.内链优化:
  蜘蛛来到你的网站之后,自然会通过你的网站结构遍历你的网站,并且能够跑遍你网站上的几乎所有链接,这些链接一旦出现死链接,很容易导致蜘蛛爬不出来。如果次数增加,百度自然不会对你有好感网站。
  7.网站 外部链接:
  为了让站长网站被蜘蛛抓取,必须有导入链接才能进入页面,否则蜘蛛没有机会知道页面的存在。
  8.监控蜘蛛爬行:
  关于如何监控蜘蛛的爬行,可以通过网站日志了解蜘蛛爬行的页面。也可以使用站长工具查看蜘蛛的爬行速度,合理分配资源,实现更高的爬行速度,勾引。更多的蜘蛛。

htmlunit 抓取网页(htmlunit网络工具一个没有没有 )

网站优化优采云 发表了文章 • 0 个评论 • 61 次浏览 • 2021-10-24 22:14 • 来自相关话题

  htmlunit 抓取网页(htmlunit网络工具一个没有没有
)
  1:背景
  我想用jsoup抓取一个页面,但是我抓取的数据总是不完整的,然后发现页面执行了js后有一些数据渲染在页面上,也就是说只在执行js后的数据页。数据会显示出来,但是jsoup无法实现执行页面的js。
  2:解决
  搜索后发现htmlunit网络工具可以执行js,相当于没有页面的浏览器。解决办法是先用htmlUnit发送网络请求,执行js获取页面,然后用jsoup转换成Document页面对象。然后用jsoup分析页面读取数据。
  3: htmlUnit 发送请求
   1 public static Document getDocument() throws IOException, InterruptedException{
2 /*String url="https://www.marklines.com/cn/v ... 3B%3B
3 Connection connect = Jsoup.connect(url).userAgent("")
4 .header("Cookie", "PLAY_LANG=cn; _plh=b9289d0a863a8fc9c79fb938f15372f7731d13fb; PLATFORM_SESSION=39034d07000717c664134556ad39869771aabc04-_ldi=520275&_lsh=8cf91cdbcbbb255adff5cba6061f561b642f5157&csrfToken=209f20c8473bc0518413c226f898ff79cd69c3ff-1539926671235-b853a6a63c77dd8fcc364a58&_lpt=%2Fcn%2Fvehicle_sales%2Fsearch&_lsi=1646321; _ga=GA1.2.2146952143.1539926675; _gid=GA1.2.1032787565.1539926675; _plh_notime=8cf91cdbcbbb255adff5cba6061f561b642f5157")
5 .timeout(360000000);
6 Document document = connect.get();*/
7 WebClient wc = new WebClient(BrowserVersion.CHROME);
8 //是否使用不安全的SSL
9 wc.getOptions().setUseInsecureSSL(true);
10 //启用JS解释器,默认为true
11 wc.getOptions().setJavaScriptEnabled(true);
12 //禁用CSS
13 wc.getOptions().setCssEnabled(false);
14 //js运行错误时,是否抛出异常
15 wc.getOptions().setThrowExceptionOnScriptError(false);
16 //状态码错误时,是否抛出异常
17 wc.getOptions().setThrowExceptionOnFailingStatusCode(false);
18 //是否允许使用ActiveX
19 wc.getOptions().setActiveXNative(false);
20 //等待js时间
21 wc.waitForBackgroundJavaScript(600*1000);
22 //设置Ajax异步处理控制器即启用Ajax支持
23 wc.setAjaxController(new NicelyResynchronizingAjaxController());
24 //设置超时时间
25 wc.getOptions().setTimeout(1000000);
26 //不跟踪抓取
27 wc.getOptions().setDoNotTrackEnabled(false);
28 WebRequest request=new WebRequest(new URL("https://www.marklines.com/cn/v ... 6quot;));
29 request.setAdditionalHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0");
30 request.setAdditionalHeader("Cookie","PLAY_LANG=cn; _plh=b9289d0a863a8fc9c79fb938f15372f7731d13fb; PLATFORM_SESSION=39034d07000717c664134556ad39869771aabc04-_ldi=520275&_lsh=8cf91cdbcbbb255adff5cba6061f561b642f5157&csrfToken=209f20c8473bc0518413c226f898ff79cd69c3ff-1539926671235-b853a6a63c77dd8fcc364a58&_lpt=%2Fcn%2Fvehicle_sales%2Fsearch&_lsi=1646321; _ga=GA1.2.2146952143.1539926675; _gid=GA1.2.1032787565.1539926675; _plh_notime=8cf91cdbcbbb255adff5cba6061f561b642f5157");
31 try {
32 //模拟浏览器打开一个目标网址
33 HtmlPage htmlPage = wc.getPage(request);
34 //为了获取js执行的数据 线程开始沉睡等待
35 Thread.sleep(1000);//这个线程的等待 因为js加载需要时间的
36 //以xml形式获取响应文本
37 String xml = htmlPage.asXml();
38 //并转为Document对象return
39 return Jsoup.parse(xml);
40 //System.out.println(xml.contains("结果.xls"));//false
41 } catch (FailingHttpStatusCodeException e) {
42 e.printStackTrace();
43 } catch (MalformedURLException e) {
44 e.printStackTrace();
45 } catch (IOException e) {
46 e.printStackTrace();
47 }
48 return null;
49 }
  4:返回的Document对象交给jsoup处理
  我这里只做了一个简单的输出,我检查了数据是否全部渲染完毕。
   1 Document doc=getDocument();
2 Element table=doc.select("table.table.table-bordered.aggregate_table").get(0);//获取到表格
3 Element tableContext=table.getElementsByTag("tbody").get(0);
4 Elements contextTrs=tableContext.getElementsByTag("tr");
5 System.out.println(contextTrs.size());
6
7
8 String context=doc.toString();
9 OutputStreamWriter pw = null;
10 pw = new OutputStreamWriter(new FileOutputStream("D:/test.txt"),"GBK");
11 pw.write(context);
12 pw.close(); 查看全部

  htmlunit 抓取网页(htmlunit网络工具一个没有没有
)
  1:背景
  我想用jsoup抓取一个页面,但是我抓取的数据总是不完整的,然后发现页面执行了js后有一些数据渲染在页面上,也就是说只在执行js后的数据页。数据会显示出来,但是jsoup无法实现执行页面的js。
  2:解决
  搜索后发现htmlunit网络工具可以执行js,相当于没有页面的浏览器。解决办法是先用htmlUnit发送网络请求,执行js获取页面,然后用jsoup转换成Document页面对象。然后用jsoup分析页面读取数据。
  3: htmlUnit 发送请求
   1 public static Document getDocument() throws IOException, InterruptedException{
2 /*String url="https://www.marklines.com/cn/v ... 3B%3B
3 Connection connect = Jsoup.connect(url).userAgent("")
4 .header("Cookie", "PLAY_LANG=cn; _plh=b9289d0a863a8fc9c79fb938f15372f7731d13fb; PLATFORM_SESSION=39034d07000717c664134556ad39869771aabc04-_ldi=520275&_lsh=8cf91cdbcbbb255adff5cba6061f561b642f5157&csrfToken=209f20c8473bc0518413c226f898ff79cd69c3ff-1539926671235-b853a6a63c77dd8fcc364a58&_lpt=%2Fcn%2Fvehicle_sales%2Fsearch&_lsi=1646321; _ga=GA1.2.2146952143.1539926675; _gid=GA1.2.1032787565.1539926675; _plh_notime=8cf91cdbcbbb255adff5cba6061f561b642f5157")
5 .timeout(360000000);
6 Document document = connect.get();*/
7 WebClient wc = new WebClient(BrowserVersion.CHROME);
8 //是否使用不安全的SSL
9 wc.getOptions().setUseInsecureSSL(true);
10 //启用JS解释器,默认为true
11 wc.getOptions().setJavaScriptEnabled(true);
12 //禁用CSS
13 wc.getOptions().setCssEnabled(false);
14 //js运行错误时,是否抛出异常
15 wc.getOptions().setThrowExceptionOnScriptError(false);
16 //状态码错误时,是否抛出异常
17 wc.getOptions().setThrowExceptionOnFailingStatusCode(false);
18 //是否允许使用ActiveX
19 wc.getOptions().setActiveXNative(false);
20 //等待js时间
21 wc.waitForBackgroundJavaScript(600*1000);
22 //设置Ajax异步处理控制器即启用Ajax支持
23 wc.setAjaxController(new NicelyResynchronizingAjaxController());
24 //设置超时时间
25 wc.getOptions().setTimeout(1000000);
26 //不跟踪抓取
27 wc.getOptions().setDoNotTrackEnabled(false);
28 WebRequest request=new WebRequest(new URL("https://www.marklines.com/cn/v ... 6quot;));
29 request.setAdditionalHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0");
30 request.setAdditionalHeader("Cookie","PLAY_LANG=cn; _plh=b9289d0a863a8fc9c79fb938f15372f7731d13fb; PLATFORM_SESSION=39034d07000717c664134556ad39869771aabc04-_ldi=520275&_lsh=8cf91cdbcbbb255adff5cba6061f561b642f5157&csrfToken=209f20c8473bc0518413c226f898ff79cd69c3ff-1539926671235-b853a6a63c77dd8fcc364a58&_lpt=%2Fcn%2Fvehicle_sales%2Fsearch&_lsi=1646321; _ga=GA1.2.2146952143.1539926675; _gid=GA1.2.1032787565.1539926675; _plh_notime=8cf91cdbcbbb255adff5cba6061f561b642f5157");
31 try {
32 //模拟浏览器打开一个目标网址
33 HtmlPage htmlPage = wc.getPage(request);
34 //为了获取js执行的数据 线程开始沉睡等待
35 Thread.sleep(1000);//这个线程的等待 因为js加载需要时间的
36 //以xml形式获取响应文本
37 String xml = htmlPage.asXml();
38 //并转为Document对象return
39 return Jsoup.parse(xml);
40 //System.out.println(xml.contains("结果.xls"));//false
41 } catch (FailingHttpStatusCodeException e) {
42 e.printStackTrace();
43 } catch (MalformedURLException e) {
44 e.printStackTrace();
45 } catch (IOException e) {
46 e.printStackTrace();
47 }
48 return null;
49 }
  4:返回的Document对象交给jsoup处理
  我这里只做了一个简单的输出,我检查了数据是否全部渲染完毕。
   1 Document doc=getDocument();
2 Element table=doc.select("table.table.table-bordered.aggregate_table").get(0);//获取到表格
3 Element tableContext=table.getElementsByTag("tbody").get(0);
4 Elements contextTrs=tableContext.getElementsByTag("tr");
5 System.out.println(contextTrs.size());
6
7
8 String context=doc.toString();
9 OutputStreamWriter pw = null;
10 pw = new OutputStreamWriter(new FileOutputStream("D:/test.txt"),"GBK");
11 pw.write(context);
12 pw.close();

htmlunit 抓取网页(使用本文中推荐的开源工具——HtmlUnit,一款能够模拟浏览器的抓包神器!)

网站优化优采云 发表了文章 • 0 个评论 • 74 次浏览 • 2021-10-21 02:20 • 来自相关话题

  htmlunit 抓取网页(使用本文中推荐的开源工具——HtmlUnit,一款能够模拟浏览器的抓包神器!)
  之前一峰写过一篇关于使用Jsoup抓取网页内容的文章文章:
  [Jsoup] HTML解析器,轻松访问网页内容
  Jsoup提供的api非常方便,完全类似于JQuery操作,轻松抓取网页数据。但是Jsoup等普通爬虫工具的缺点是无法处理js生成的内容。
  做过Html开发的都知道,现在很多网站都大量使用ajax和JavaScript来获取和处理数据,普通的爬虫工具已经无法处理js中的内容了。
  比如我们在本地新建一个测试web文件text.html,源码如下:
  

main.html




a {
line-height: 30px;
margin: 20px;
}




var datas = [ {
href : "http://www.jianshu.com/p/8d8edf25850d",
title : "推荐一款编程字体,让代码看着更美"
}, {
href : "http://www.jianshu.com/p/153d9f31288d",
title : "Android 利用Camera实现中轴3D卡牌翻转效果"
}, {
href : "http://www.jianshu.com/p/d6fb0c9c9c26",
title : "【Eclipse】挖掘专属最有用的快捷键组合"
}, {
href : "http://www.jianshu.com/p/72d69b49d135",
title : "【IIS】Windows下利用IIS建立网站并实现局域网共享"
} ];
window.onload = function() {
var infos = document.getElementById("infos");
for( var i = 0 ; i < datas.length ; i++)
{
var a = document.createElement("a");
a.href = datas[i].href ;
a.innerText = datas[i].title;
infos.appendChild(a);
infos.appendChild(document.createElement("br"))
}
}


HtmlUnit 测试网页内容!




  通过IIS发布本地网站(参考易峰之前写的文章:
  【IIS】Windows下,使用IIS建立网站,实现局域网共享),
  网页在浏览器中显示的效果如下:
  
  网页展示效果.jpg
  虽然通过网页评论元素可以看到body收录了网页显示中的文本内容:
  
  网络评论元素.jpg
  但是,通过Jsoup工具根本无法使用!在网页的源码中可以看到,我们需要抓取的内容是在页面显示后通过ajax和JavaScript加载的。
  那么该怎么办?使用本文推荐的开源工具——HtmlUnit,一款可以模拟浏览器的抓包神器!
  在官网下载对应的jar包,添加到工程项目的lib中。简单的测试代码如下:
  import java.io.IOException;
import java.net.MalformedURLException;
import java.text.ParseException;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomElement;
import com.gargoylesoftware.htmlunit.html.DomNodeList;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
/**
* @author 亦枫
* @created_time 2016年1月12日
* @file_user_todo Java测试类
* @blog http://www.jianshu.com/users/1 ... icles
*/
public class JavaTest {
/**
* 入口函数
* @param args
* @throws ParseException
*/
public static void main(String[] args) throws ParseException {

try {
WebClient webClient = new WebClient(BrowserVersion.CHROME);
HtmlPage htmlPage = (HtmlPage) webClient.getPage("http://localhost/test.html");
DomNodeList domNodeList = htmlPage.getElementsByTagName("a");
for (int i = 0; i < domNodeList.size(); i++) {
DomElement domElement = (DomElement) domNodeList.get(i);
System.out.println(domElement.asText());
}
webClient.close();
} catch (FailingHttpStatusCodeException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}


}

}
  运行后,控制台打印结果:
  
  HtmlUnit 测试结果.jpg
  可见HtmlUnit可以抓取AJAX和JavaScript加载的内容。
  HtmlUnit的介绍在官网上很详细。以下内容为易峰翻译的部分内容,供大家参考:
  HtmlUnit 是一个基于 Java 的浏览器程序,没有图形界面。它可以调用HTML文档并提供API,让开发者可以像在普通浏览器上操作一样访问网页内容、填写表单、点击超链接等。
  它可以很好地支持 JavaScript,并且仍在改进中。同时,它可以解析非常复杂的AJAX库,模拟不同配置下的Chrome、Firefox和IE浏览器。
  HtmlUnit 通常用于测试目的和检索 网站 信息。
  HtmlUnit 提供了很多用于测试网络请求和抓取网页内容的功能。可以到官网或者其他网站学习使用。 查看全部

  htmlunit 抓取网页(使用本文中推荐的开源工具——HtmlUnit,一款能够模拟浏览器的抓包神器!)
  之前一峰写过一篇关于使用Jsoup抓取网页内容的文章文章:
  [Jsoup] HTML解析器,轻松访问网页内容
  Jsoup提供的api非常方便,完全类似于JQuery操作,轻松抓取网页数据。但是Jsoup等普通爬虫工具的缺点是无法处理js生成的内容。
  做过Html开发的都知道,现在很多网站都大量使用ajax和JavaScript来获取和处理数据,普通的爬虫工具已经无法处理js中的内容了。
  比如我们在本地新建一个测试web文件text.html,源码如下:
  

main.html




a {
line-height: 30px;
margin: 20px;
}




var datas = [ {
href : "http://www.jianshu.com/p/8d8edf25850d",
title : "推荐一款编程字体,让代码看着更美"
}, {
href : "http://www.jianshu.com/p/153d9f31288d",
title : "Android 利用Camera实现中轴3D卡牌翻转效果"
}, {
href : "http://www.jianshu.com/p/d6fb0c9c9c26",
title : "【Eclipse】挖掘专属最有用的快捷键组合"
}, {
href : "http://www.jianshu.com/p/72d69b49d135",
title : "【IIS】Windows下利用IIS建立网站并实现局域网共享"
} ];
window.onload = function() {
var infos = document.getElementById("infos");
for( var i = 0 ; i < datas.length ; i++)
{
var a = document.createElement("a");
a.href = datas[i].href ;
a.innerText = datas[i].title;
infos.appendChild(a);
infos.appendChild(document.createElement("br"))
}
}


HtmlUnit 测试网页内容!




  通过IIS发布本地网站(参考易峰之前写的文章:
  【IIS】Windows下,使用IIS建立网站,实现局域网共享),
  网页在浏览器中显示的效果如下:
  
  网页展示效果.jpg
  虽然通过网页评论元素可以看到body收录了网页显示中的文本内容:
  
  网络评论元素.jpg
  但是,通过Jsoup工具根本无法使用!在网页的源码中可以看到,我们需要抓取的内容是在页面显示后通过ajax和JavaScript加载的。
  那么该怎么办?使用本文推荐的开源工具——HtmlUnit,一款可以模拟浏览器的抓包神器!
  在官网下载对应的jar包,添加到工程项目的lib中。简单的测试代码如下:
  import java.io.IOException;
import java.net.MalformedURLException;
import java.text.ParseException;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomElement;
import com.gargoylesoftware.htmlunit.html.DomNodeList;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
/**
* @author 亦枫
* @created_time 2016年1月12日
* @file_user_todo Java测试类
* @blog http://www.jianshu.com/users/1 ... icles
*/
public class JavaTest {
/**
* 入口函数
* @param args
* @throws ParseException
*/
public static void main(String[] args) throws ParseException {

try {
WebClient webClient = new WebClient(BrowserVersion.CHROME);
HtmlPage htmlPage = (HtmlPage) webClient.getPage("http://localhost/test.html";);
DomNodeList domNodeList = htmlPage.getElementsByTagName("a");
for (int i = 0; i < domNodeList.size(); i++) {
DomElement domElement = (DomElement) domNodeList.get(i);
System.out.println(domElement.asText());
}
webClient.close();
} catch (FailingHttpStatusCodeException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}


}

}
  运行后,控制台打印结果:
  
  HtmlUnit 测试结果.jpg
  可见HtmlUnit可以抓取AJAX和JavaScript加载的内容。
  HtmlUnit的介绍在官网上很详细。以下内容为易峰翻译的部分内容,供大家参考:
  HtmlUnit 是一个基于 Java 的浏览器程序,没有图形界面。它可以调用HTML文档并提供API,让开发者可以像在普通浏览器上操作一样访问网页内容、填写表单、点击超链接等。
  它可以很好地支持 JavaScript,并且仍在改进中。同时,它可以解析非常复杂的AJAX库,模拟不同配置下的Chrome、Firefox和IE浏览器。
  HtmlUnit 通常用于测试目的和检索 网站 信息。
  HtmlUnit 提供了很多用于测试网络请求和抓取网页内容的功能。可以到官网或者其他网站学习使用。

htmlunit 抓取网页(一下Gecco中的htmlunit中中 )

网站优化优采云 发表了文章 • 0 个评论 • 67 次浏览 • 2021-12-13 18:04 • 来自相关话题

  htmlunit 抓取网页(一下Gecco中的htmlunit中中
)
  2021SC@SDUSC
  简要解释GECCO中的htmlunit
  Htmlunit是一个开源Java页面分析工具。阅读页面后,您可以有效地使用htmlunit分析页面上的内容。该项目可以模拟浏览器的操作,称为Java浏览器的开源实现。这个没有界面的浏览器运行得很快。HTML单元使用rhino作为JavaScript的解析引擎
  下载
  
com.geccocrawler
gecco-htmlunit
x.x.x

  京东产品详细信息中的价格信息是通过Ajax异步请求获取的,该请求以前是通过@Ajax annotation实现的。这里,htmlunit用于自动化Ajax请求
  @Gecco(matchUrl="http://item.jd.com/{code}.html", pipelines="consolePipeline", downloader="htmlUnitDownloder")
public class JDDetail implements HtmlBean {
private static final long serialVersionUID = -377053120283382723L;
@RequestParameter
private String code;

@Text
@HtmlField(cssPath=".p-price")
private String price;

@Text
@HtmlField(cssPath="#name > h1")
private String title;

@Text
@HtmlField(cssPath="#p-ad")
private String jdAd;

@HtmlField(cssPath="#product-detail-2")
private String detail;
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getJdAd() {
return jdAd;
}
public void setJdAd(String jdAd) {
this.jdAd = jdAd;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDetail() {
return detail;
}
public void setDetail(String detail) {
this.detail = detail;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public static void main(String[] args) throws Exception {
HttpRequest request = new HttpGetRequest("http://item.jd.com/1455427.html");
request.setCharset("GBK");
GeccoEngine.create()
.classpath("com.geccocrawler.gecco.htmlunit")
//开始抓取的页面地址
.start(request)
//开启几个爬虫线程
.thread(1)
.timeout(1000)
.run();
}
}
  使用htmlunit的优点和缺点确实可以节省大量工作,但htmlunit也有许多缺点:
  1、效率低下。在使用htmlunit之后,下载程序应该一起下载所有JS并执行所有JS代码。有时下载一个页面需要5~10秒
  2、rhino引擎与JS的兼容性。Rhino兼容性仍然存在许多问题。如果爬网时不想看到这些错误日志输出,可以配置log4j:
  log4j.logger.com.gargoylesoftware.htmlunit=OFF 查看全部

  htmlunit 抓取网页(一下Gecco中的htmlunit中中
)
  2021SC@SDUSC
  简要解释GECCO中的htmlunit
  Htmlunit是一个开源Java页面分析工具。阅读页面后,您可以有效地使用htmlunit分析页面上的内容。该项目可以模拟浏览器的操作,称为Java浏览器的开源实现。这个没有界面的浏览器运行得很快。HTML单元使用rhino作为JavaScript的解析引擎
  下载
  
com.geccocrawler
gecco-htmlunit
x.x.x

  京东产品详细信息中的价格信息是通过Ajax异步请求获取的,该请求以前是通过@Ajax annotation实现的。这里,htmlunit用于自动化Ajax请求
  @Gecco(matchUrl="http://item.jd.com/{code}.html", pipelines="consolePipeline", downloader="htmlUnitDownloder")
public class JDDetail implements HtmlBean {
private static final long serialVersionUID = -377053120283382723L;
@RequestParameter
private String code;

@Text
@HtmlField(cssPath=".p-price")
private String price;

@Text
@HtmlField(cssPath="#name > h1")
private String title;

@Text
@HtmlField(cssPath="#p-ad")
private String jdAd;

@HtmlField(cssPath="#product-detail-2")
private String detail;
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getJdAd() {
return jdAd;
}
public void setJdAd(String jdAd) {
this.jdAd = jdAd;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDetail() {
return detail;
}
public void setDetail(String detail) {
this.detail = detail;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public static void main(String[] args) throws Exception {
HttpRequest request = new HttpGetRequest("http://item.jd.com/1455427.html";);
request.setCharset("GBK");
GeccoEngine.create()
.classpath("com.geccocrawler.gecco.htmlunit")
//开始抓取的页面地址
.start(request)
//开启几个爬虫线程
.thread(1)
.timeout(1000)
.run();
}
}
  使用htmlunit的优点和缺点确实可以节省大量工作,但htmlunit也有许多缺点:
  1、效率低下。在使用htmlunit之后,下载程序应该一起下载所有JS并执行所有JS代码。有时下载一个页面需要5~10秒
  2、rhino引擎与JS的兼容性。Rhino兼容性仍然存在许多问题。如果爬网时不想看到这些错误日志输出,可以配置log4j:
  log4j.logger.com.gargoylesoftware.htmlunit=OFF

htmlunit 抓取网页(使用本文中推荐的开源工具——HtmlUnit,一款能够模拟浏览器的抓包神器!)

网站优化优采云 发表了文章 • 0 个评论 • 56 次浏览 • 2021-12-06 11:06 • 来自相关话题

  htmlunit 抓取网页(使用本文中推荐的开源工具——HtmlUnit,一款能够模拟浏览器的抓包神器!)
  之前一峰写过一篇关于使用Jsoup爬取网页内容的文章文章:
  [Jsoup] HTML 解析器,轻松访问网页内容
  Jsoup提供的api非常方便,完全类似于JQuery操作,轻松抓取网页数据。但是Jsoup等普通爬虫工具的缺点是无法处理js生成的内容。
  做过Html开发的都知道,现在很多网站都大量使用ajax和JavaScript来获取和处理数据,普通的爬虫工具已经无法处理js中的内容了。
  比如我们在本地新建一个测试web文件text.html,源码如下:
  

main.html




a {
line-height: 30px;
margin: 20px;
}




var datas = [ {
href : "http://www.jianshu.com/p/8d8edf25850d",
title : "推荐一款编程字体,让代码看着更美"
}, {
href : "http://www.jianshu.com/p/153d9f31288d",
title : "Android 利用Camera实现中轴3D卡牌翻转效果"
}, {
href : "http://www.jianshu.com/p/d6fb0c9c9c26",
title : "【Eclipse】挖掘专属最有用的快捷键组合"
}, {
href : "http://www.jianshu.com/p/72d69b49d135",
title : "【IIS】Windows下利用IIS建立网站并实现局域网共享"
} ];
window.onload = function() {
var infos = document.getElementById("infos");
for( var i = 0 ; i < datas.length ; i++)
{
var a = document.createElement("a");
a.href = datas[i].href ;
a.innerText = datas[i].title;
infos.appendChild(a);
infos.appendChild(document.createElement("br"))
}
}


HtmlUnit 测试网页内容!




  通过IIS发布本地网站(参考易峰之前写的文章:
  【IIS】Windows下,使用IIS建立网站,实现局域网共享),
  网页在浏览器中显示的效果如下:
  网页展示效果.jpg
  虽然通过网页评论元素可以看到body收录了网页显示中的文本内容:
  网络评论元素.jpg
  但是,它根本无法通过 Jsoup 工具使用!从网页源码中可以看出,我们需要抓取的内容是在页面显示后通过ajax和JavaScript加载的。
  那么该怎么办?使用本文推荐的开源工具——HtmlUnit,一款可以模拟浏览器的抓包神器!
  在官网下载对应的jar包,添加到工程项目的lib中。简单的测试代码如下:
  import java.io.IOException;
import java.net.MalformedURLException;
import java.text.ParseException;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomElement;
import com.gargoylesoftware.htmlunit.html.DomNodeList;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
/**
* @author 亦枫
* @created_time 2016年1月12日
* @file_user_todo Java测试类
* @blog http://www.jianshu.com/users/1 ... icles
*/
public class JavaTest {
/**
* 入口函数
* @param args
* @throws ParseException
*/
public static void main(String[] args) throws ParseException {

try {
WebClient webClient = new WebClient(BrowserVersion.CHROME);
HtmlPage htmlPage = (HtmlPage) webClient.getPage("http://localhost/test.html");
DomNodeList domNodeList = htmlPage.getElementsByTagName("a");
for (int i = 0; i < domNodeList.size(); i++) {
DomElement domElement = (DomElement) domNodeList.get(i);
System.out.println(domElement.asText());
}
webClient.close();
} catch (FailingHttpStatusCodeException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}


}

}
  运行后,控制台打印结果:
  HtmlUnit 测试结果.jpg
  可见HtmlUnit可以抓取AJAX和JavaScript加载的内容。
  HtmlUnit的介绍在官网上很详细。以下内容为易峰翻译的部分内容,供大家参考:
  HtmlUnit 是一个基于 Java 的浏览器程序,没有图形界面。它可以调用 HTML 文档并提供 API,让开发者可以像在普通浏览器上操作一样访问 Web 内容、填写表单、单击超链接等。
  它可以很好地支持 JavaScript,并且仍在改进中。同时,它可以解析非常复杂的AJAX库,模拟不同配置下的Chrome、Firefox和IE浏览器。
  HtmlUnit 通常用于测试目的和检索 网站 信息。
  HtmlUnit 提供了很多用于测试网络请求和抓取网页内容的功能。可以到官网或者其他网站学习使用。 查看全部

  htmlunit 抓取网页(使用本文中推荐的开源工具——HtmlUnit,一款能够模拟浏览器的抓包神器!)
  之前一峰写过一篇关于使用Jsoup爬取网页内容的文章文章:
  [Jsoup] HTML 解析器,轻松访问网页内容
  Jsoup提供的api非常方便,完全类似于JQuery操作,轻松抓取网页数据。但是Jsoup等普通爬虫工具的缺点是无法处理js生成的内容。
  做过Html开发的都知道,现在很多网站都大量使用ajax和JavaScript来获取和处理数据,普通的爬虫工具已经无法处理js中的内容了。
  比如我们在本地新建一个测试web文件text.html,源码如下:
  

main.html




a {
line-height: 30px;
margin: 20px;
}




var datas = [ {
href : "http://www.jianshu.com/p/8d8edf25850d",
title : "推荐一款编程字体,让代码看着更美"
}, {
href : "http://www.jianshu.com/p/153d9f31288d",
title : "Android 利用Camera实现中轴3D卡牌翻转效果"
}, {
href : "http://www.jianshu.com/p/d6fb0c9c9c26",
title : "【Eclipse】挖掘专属最有用的快捷键组合"
}, {
href : "http://www.jianshu.com/p/72d69b49d135",
title : "【IIS】Windows下利用IIS建立网站并实现局域网共享"
} ];
window.onload = function() {
var infos = document.getElementById("infos");
for( var i = 0 ; i < datas.length ; i++)
{
var a = document.createElement("a");
a.href = datas[i].href ;
a.innerText = datas[i].title;
infos.appendChild(a);
infos.appendChild(document.createElement("br"))
}
}


HtmlUnit 测试网页内容!




  通过IIS发布本地网站(参考易峰之前写的文章:
  【IIS】Windows下,使用IIS建立网站,实现局域网共享),
  网页在浏览器中显示的效果如下:
  网页展示效果.jpg
  虽然通过网页评论元素可以看到body收录了网页显示中的文本内容:
  网络评论元素.jpg
  但是,它根本无法通过 Jsoup 工具使用!从网页源码中可以看出,我们需要抓取的内容是在页面显示后通过ajax和JavaScript加载的。
  那么该怎么办?使用本文推荐的开源工具——HtmlUnit,一款可以模拟浏览器的抓包神器!
  在官网下载对应的jar包,添加到工程项目的lib中。简单的测试代码如下:
  import java.io.IOException;
import java.net.MalformedURLException;
import java.text.ParseException;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomElement;
import com.gargoylesoftware.htmlunit.html.DomNodeList;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
/**
* @author 亦枫
* @created_time 2016年1月12日
* @file_user_todo Java测试类
* @blog http://www.jianshu.com/users/1 ... icles
*/
public class JavaTest {
/**
* 入口函数
* @param args
* @throws ParseException
*/
public static void main(String[] args) throws ParseException {

try {
WebClient webClient = new WebClient(BrowserVersion.CHROME);
HtmlPage htmlPage = (HtmlPage) webClient.getPage("http://localhost/test.html";);
DomNodeList domNodeList = htmlPage.getElementsByTagName("a");
for (int i = 0; i < domNodeList.size(); i++) {
DomElement domElement = (DomElement) domNodeList.get(i);
System.out.println(domElement.asText());
}
webClient.close();
} catch (FailingHttpStatusCodeException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}


}

}
  运行后,控制台打印结果:
  HtmlUnit 测试结果.jpg
  可见HtmlUnit可以抓取AJAX和JavaScript加载的内容。
  HtmlUnit的介绍在官网上很详细。以下内容为易峰翻译的部分内容,供大家参考:
  HtmlUnit 是一个基于 Java 的浏览器程序,没有图形界面。它可以调用 HTML 文档并提供 API,让开发者可以像在普通浏览器上操作一样访问 Web 内容、填写表单、单击超链接等。
  它可以很好地支持 JavaScript,并且仍在改进中。同时,它可以解析非常复杂的AJAX库,模拟不同配置下的Chrome、Firefox和IE浏览器。
  HtmlUnit 通常用于测试目的和检索 网站 信息。
  HtmlUnit 提供了很多用于测试网络请求和抓取网页内容的功能。可以到官网或者其他网站学习使用。

htmlunit 抓取网页(htmlunit网络工具一个没有没有 )

网站优化优采云 发表了文章 • 0 个评论 • 38 次浏览 • 2021-12-06 11:02 • 来自相关话题

  htmlunit 抓取网页(htmlunit网络工具一个没有没有
)
  1:背景
  我想用jsoup抓取一个页面,但是我抓取的数据总是不完整。然后我发现有些数据是在页面用js执行后渲染在页面上的,也就是说只有在执行js后才在数据页面上。会显示数据,但是jsoup无法实现执行页面的js。
  2:解决
  搜索后发现htmlunit网络工具可以执行js,相当于没有页面的浏览器。解决办法是先用htmlUnit发送网络请求,执行js获取页面,然后用jsoup转换成Document页面对象。然后用jsoup分析页面读取数据。
  3: htmlUnit 发送请求
   1 public static Document getDocument() throws IOException, InterruptedException{
2 /*String url="https://www.marklines.com/cn/v ... 3B%3B
3 Connection connect = Jsoup.connect(url).userAgent("")
4 .header("Cookie", "PLAY_LANG=cn; _plh=b9289d0a863a8fc9c79fb938f15372f7731d13fb; PLATFORM_SESSION=39034d07000717c664134556ad39869771aabc04-_ldi=520275&_lsh=8cf91cdbcbbb255adff5cba6061f561b642f5157&csrfToken=209f20c8473bc0518413c226f898ff79cd69c3ff-1539926671235-b853a6a63c77dd8fcc364a58&_lpt=%2Fcn%2Fvehicle_sales%2Fsearch&_lsi=1646321; _ga=GA1.2.2146952143.1539926675; _gid=GA1.2.1032787565.1539926675; _plh_notime=8cf91cdbcbbb255adff5cba6061f561b642f5157")
5 .timeout(360000000);
6 Document document = connect.get();*/
7 WebClient wc = new WebClient(BrowserVersion.CHROME);
8 //是否使用不安全的SSL
9 wc.getOptions().setUseInsecureSSL(true);
10 //启用JS解释器,默认为true
11 wc.getOptions().setJavaScriptEnabled(true);
12 //禁用CSS
13 wc.getOptions().setCssEnabled(false);
14 //js运行错误时,是否抛出异常
15 wc.getOptions().setThrowExceptionOnScriptError(false);
16 //状态码错误时,是否抛出异常
17 wc.getOptions().setThrowExceptionOnFailingStatusCode(false);
18 //是否允许使用ActiveX
19 wc.getOptions().setActiveXNative(false);
20 //等待js时间
21 wc.waitForBackgroundJavaScript(600*1000);
22 //设置Ajax异步处理控制器即启用Ajax支持
23 wc.setAjaxController(new NicelyResynchronizingAjaxController());
24 //设置超时时间
25 wc.getOptions().setTimeout(1000000);
26 //不跟踪抓取
27 wc.getOptions().setDoNotTrackEnabled(false);
28 WebRequest request=new WebRequest(new URL("https://www.marklines.com/cn/v ... 6quot;));
29 request.setAdditionalHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0");
30 request.setAdditionalHeader("Cookie","PLAY_LANG=cn; _plh=b9289d0a863a8fc9c79fb938f15372f7731d13fb; PLATFORM_SESSION=39034d07000717c664134556ad39869771aabc04-_ldi=520275&_lsh=8cf91cdbcbbb255adff5cba6061f561b642f5157&csrfToken=209f20c8473bc0518413c226f898ff79cd69c3ff-1539926671235-b853a6a63c77dd8fcc364a58&_lpt=%2Fcn%2Fvehicle_sales%2Fsearch&_lsi=1646321; _ga=GA1.2.2146952143.1539926675; _gid=GA1.2.1032787565.1539926675; _plh_notime=8cf91cdbcbbb255adff5cba6061f561b642f5157");
31 try {
32 //模拟浏览器打开一个目标网址
33 HtmlPage htmlPage = wc.getPage(request);
34 //为了获取js执行的数据 线程开始沉睡等待
35 Thread.sleep(1000);//这个线程的等待 因为js加载需要时间的
36 //以xml形式获取响应文本
37 String xml = htmlPage.asXml();
38 //并转为Document对象return
39 return Jsoup.parse(xml);
40 //System.out.println(xml.contains("结果.xls"));//false
41 } catch (FailingHttpStatusCodeException e) {
42 e.printStackTrace();
43 } catch (MalformedURLException e) {
44 e.printStackTrace();
45 } catch (IOException e) {
46 e.printStackTrace();
47 }
48 return null;
49 }
  4:返回的Document对象交给jsoup处理
  我这里只做了一个简单的输出,我检查了数据是否全部渲染完毕。
   1 Document doc=getDocument();
2 Element table=doc.select("table.table.table-bordered.aggregate_table").get(0);//获取到表格
3 Element tableContext=table.getElementsByTag("tbody").get(0);
4 Elements contextTrs=tableContext.getElementsByTag("tr");
5 System.out.println(contextTrs.size());
6
7
8 String context=doc.toString();
9 OutputStreamWriter pw = null;
10 pw = new OutputStreamWriter(new FileOutputStream("D:/test.txt"),"GBK");
11 pw.write(context);
12 pw.close(); 查看全部

  htmlunit 抓取网页(htmlunit网络工具一个没有没有
)
  1:背景
  我想用jsoup抓取一个页面,但是我抓取的数据总是不完整。然后我发现有些数据是在页面用js执行后渲染在页面上的,也就是说只有在执行js后才在数据页面上。会显示数据,但是jsoup无法实现执行页面的js。
  2:解决
  搜索后发现htmlunit网络工具可以执行js,相当于没有页面的浏览器。解决办法是先用htmlUnit发送网络请求,执行js获取页面,然后用jsoup转换成Document页面对象。然后用jsoup分析页面读取数据。
  3: htmlUnit 发送请求
   1 public static Document getDocument() throws IOException, InterruptedException{
2 /*String url="https://www.marklines.com/cn/v ... 3B%3B
3 Connection connect = Jsoup.connect(url).userAgent("")
4 .header("Cookie", "PLAY_LANG=cn; _plh=b9289d0a863a8fc9c79fb938f15372f7731d13fb; PLATFORM_SESSION=39034d07000717c664134556ad39869771aabc04-_ldi=520275&_lsh=8cf91cdbcbbb255adff5cba6061f561b642f5157&csrfToken=209f20c8473bc0518413c226f898ff79cd69c3ff-1539926671235-b853a6a63c77dd8fcc364a58&_lpt=%2Fcn%2Fvehicle_sales%2Fsearch&_lsi=1646321; _ga=GA1.2.2146952143.1539926675; _gid=GA1.2.1032787565.1539926675; _plh_notime=8cf91cdbcbbb255adff5cba6061f561b642f5157")
5 .timeout(360000000);
6 Document document = connect.get();*/
7 WebClient wc = new WebClient(BrowserVersion.CHROME);
8 //是否使用不安全的SSL
9 wc.getOptions().setUseInsecureSSL(true);
10 //启用JS解释器,默认为true
11 wc.getOptions().setJavaScriptEnabled(true);
12 //禁用CSS
13 wc.getOptions().setCssEnabled(false);
14 //js运行错误时,是否抛出异常
15 wc.getOptions().setThrowExceptionOnScriptError(false);
16 //状态码错误时,是否抛出异常
17 wc.getOptions().setThrowExceptionOnFailingStatusCode(false);
18 //是否允许使用ActiveX
19 wc.getOptions().setActiveXNative(false);
20 //等待js时间
21 wc.waitForBackgroundJavaScript(600*1000);
22 //设置Ajax异步处理控制器即启用Ajax支持
23 wc.setAjaxController(new NicelyResynchronizingAjaxController());
24 //设置超时时间
25 wc.getOptions().setTimeout(1000000);
26 //不跟踪抓取
27 wc.getOptions().setDoNotTrackEnabled(false);
28 WebRequest request=new WebRequest(new URL("https://www.marklines.com/cn/v ... 6quot;));
29 request.setAdditionalHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0");
30 request.setAdditionalHeader("Cookie","PLAY_LANG=cn; _plh=b9289d0a863a8fc9c79fb938f15372f7731d13fb; PLATFORM_SESSION=39034d07000717c664134556ad39869771aabc04-_ldi=520275&_lsh=8cf91cdbcbbb255adff5cba6061f561b642f5157&csrfToken=209f20c8473bc0518413c226f898ff79cd69c3ff-1539926671235-b853a6a63c77dd8fcc364a58&_lpt=%2Fcn%2Fvehicle_sales%2Fsearch&_lsi=1646321; _ga=GA1.2.2146952143.1539926675; _gid=GA1.2.1032787565.1539926675; _plh_notime=8cf91cdbcbbb255adff5cba6061f561b642f5157");
31 try {
32 //模拟浏览器打开一个目标网址
33 HtmlPage htmlPage = wc.getPage(request);
34 //为了获取js执行的数据 线程开始沉睡等待
35 Thread.sleep(1000);//这个线程的等待 因为js加载需要时间的
36 //以xml形式获取响应文本
37 String xml = htmlPage.asXml();
38 //并转为Document对象return
39 return Jsoup.parse(xml);
40 //System.out.println(xml.contains("结果.xls"));//false
41 } catch (FailingHttpStatusCodeException e) {
42 e.printStackTrace();
43 } catch (MalformedURLException e) {
44 e.printStackTrace();
45 } catch (IOException e) {
46 e.printStackTrace();
47 }
48 return null;
49 }
  4:返回的Document对象交给jsoup处理
  我这里只做了一个简单的输出,我检查了数据是否全部渲染完毕。
   1 Document doc=getDocument();
2 Element table=doc.select("table.table.table-bordered.aggregate_table").get(0);//获取到表格
3 Element tableContext=table.getElementsByTag("tbody").get(0);
4 Elements contextTrs=tableContext.getElementsByTag("tr");
5 System.out.println(contextTrs.size());
6
7
8 String context=doc.toString();
9 OutputStreamWriter pw = null;
10 pw = new OutputStreamWriter(new FileOutputStream("D:/test.txt"),"GBK");
11 pw.write(context);
12 pw.close();

htmlunit 抓取网页(的java程序是什么?答案是有哪些??)

网站优化优采云 发表了文章 • 0 个评论 • 56 次浏览 • 2021-12-02 09:02 • 来自相关话题

  htmlunit 抓取网页(的java程序是什么?答案是有哪些??)
  1.HtmlUnit1.1 简介
  HtmlUnit是一个用java编写的无界面浏览器,建模html文档,通过API调用页面,填写表单,点击链接等,像普通浏览器一样操作。通常用于测试和从网页中获取信息。
  官方简介翻译
HtmlUnit是一个无界面浏览器Java程序。它为HTML文档建模,提供了调用页面、填写表单、单击链接等操作的API。就跟你在浏览器里做的操作一样。
HtmlUnit不错的JavaScript支持(不断改进),甚至可以使用相当复杂的AJAX库,根据配置的不同模拟Chrome、Firefox或Internet Explorer等浏览器。
HtmlUnit通常用于测试或从web站点检索信息。
  1.2使用场景
  对于使用java实现的网络爬虫程序,我们一般可以使用apache的HttpClient组件来获取HTML页面信息。HttpClient实现的http请求返回的响应一般是纯文本文档页面,也就是最原创的html页面。
  对于静态的html页面,使用httpClient就足以爬取我们需要的信息。但是对于越来越多的动态网页,更多的数据是通过异步JS代码获取和渲染的。原来的html页面不收录这部分数据。
  
  在上图我们看到的网页中,初始文件加载完成后,红框中的数据列表是看不到的。浏览器通过执行异步JS请求,将获取到的动态数据渲染到原创文档页面,最终成为我们看到的网页。对于这部分需要JS代码执行的数据,httpClient显得力不从心。虽然我们可以拿到JS执行的请求路径,然后用java代码拿到我们需要的那部分数据,更别说从JS脚本里能不能分析出请求路径和请求参数,就分析这部分源码代码价格已经很高了。
  通过上面的介绍,我们了解到目前的动态网页很大一部分是通过异步JS请求获取,然后通过JS渲染页面的。那么我们可以做这样的假设吗,假设我们的爬虫程序模拟了一个浏览器,在获取到html页面后,像浏览器一样执行异步JS代码,在JS渲染完html页面后,就可以愉快的获取到页面上的节点信息了页面不见了。那么有没有这样的java程序呢?
  答案是肯定的。
  HtmlUnit就是这样一个库,用来让界面意外地显示所有异步工作。由于没有需要显示的耗时工作,HtmlUnit 加载一个完整的网页比实际的浏览器块更多。并且根据不同的配置,HtmlUnit可以模拟市面上常用的浏览器,如Chrome、Firefox、IE浏览器等。
  通过HtmlUnit库,加载一个完整的Html页面(图片和视频除外),然后就可以将其转换为我们常用的字符串格式,并使用Jsoup等其他工具获取元素。当然,你也可以直接从HtmlUnit提供的对象中获取网页元素,甚至可以操作按钮、表单等控件。除了不能像可见浏览器那样使用鼠标和键盘来浏览网页,我们可以使用HtmlUnit来模拟和操作所有其他操作,比如登录网站、写博客等都可以完全的。当然,网页内容抓取是最简单的应用。
  2.J4L2.1官方简介
  J4L OCR 工具是一组可用于在 Java 应用程序中收录 OCR 功能的组件。这意味着您可以接收传真、PDF 文件或扫描文档并从图像中提取业务信息。主要的3个组件是:
  j4l工具的详细使用步骤请参考这篇文章文章:Java使用J4L识别验证码
  本文文章主要介绍使用HtmlUnit模拟登录
  3.实际案例3.1.场景
  一个登录页面,包括一个表单,需要填写用户名、登录密码和验证码才能实现用户登录。
  3.2 操作步骤
  使用htmlunit模拟登录是一个获取登录页面-&gt;找到输入框-&gt;填写用户名和密码-&gt;填写验证码-&gt;模拟点击登录的过程。
  4.实现代码4.1maven引入HtmlUnit依赖
  
  net.sourceforge.htmlunit
  htmlunit
  2.18
  4.2 主要方法
  登录.java
   public static void main(String[] args) throws Exception {
login();
}
public static void login() throws Exception {
WebClient webClient = new WebClient(BrowserVersion.CHROME);//设置浏览器内核
webClient.getOptions().setJavaScriptEnabled(true);// js是否可用
webClient.getOptions().setCssEnabled(true);//css 一般设置false因为影响运行速度
webClient.getOptions().setThrowExceptionOnScriptError(false);//设置js抛出异常:false
webClient.getOptions().setActiveXNative(false);
//ajax
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
webClient.getOptions().setUseInsecureSSL(false);
//允许重定向
webClient.getOptions().setRedirectEnabled(true);
//连接超时
webClient.getOptions().setTimeout(5000);
//js执行超时
webClient.setJavaScriptTimeout(10000 * 3);
//允许cookie
webClient.getCookieManager().setCookiesEnabled(true);
String url = "http://hrportalneu.cs/HRPortal ... 3B%3B
HtmlPage page = webClient.getPage(url);
webClient.waitForBackgroundJavaScript(5000);
HtmlPage newPage;
newPage = readyPage(page, webClient, "btnCheckIn1");
System.out.println("url----------------" + newPage.getUrl());
System.out.println("Login执行后页面:" + newPage.asXml());
IOUtils.write(newPage.asXml().getBytes(), new FileWriter(new File("D:/checkIn.txt")));
if (!newPage.asXml().contains("登录成功")) {
login();
}
webClient.close();
}
public static HtmlPage readyPage(HtmlPage page, WebClient webClient, String type) throws Exception {
//封装页面元素
HtmlForm form = page.getHtmlElementById("form1");
HtmlTextInput tbxUsername = form.getInputByName("tbxUsername");
tbxUsername.setValueAttribute("用户名*******");
HtmlPasswordInput tbxPassword = form.getInputByName("tbxPassword");
tbxPassword.setValueAttribute("密码*******");
//获取验证码图片
HtmlImage verify_img = (HtmlImage) page.getElementById("AuthCode1$codeText$img");
File file = new File("D:\\" + "check" + ".png");
//保存验证码图片
verify_img.saveAs(file);
System.out.println("验证码图片已保存!");
//保存路径
String filePath = file.getPath();
//裁剪验证码 这里使用原始的图片文件识别成功率不高 可以先进行裁剪
ImageUtil.cutImage(filePath, 1, 1, 96, 34);
//自动识别验证码
OCRFacade facade = new OCRFacade();
//识别验证码
String code = facade.recognizeFile(filePath, "eng");
//处理字符串
code = code.replaceAll(" ", "");
code = code.replaceAll("\\n", "");
System.out.println("验证码:" + code);
//定位验证码输入框
HtmlTextInput verify_code = form.getInputByName("AuthCode1$codeText");
//填入自动识别出来的验证码
verify_code.setValueAttribute(code);
System.out.println("原始页面:" + page.asXml());
HtmlPage newPage = null;
//操作按钮
if (type.equals("btnCheckIn1")) {
DomElement btnCheckIn1 = page.getElementById("btnCheckIn1");
System.out.println("doCheckIn");
newPage = btnCheckIn1.click();
}
//等待js加载
webClient.waitForBackgroundJavaScript(5000);
return newPage;
} 
  图像实用程序
  public class ImageUtil {
public static void cutImage(String filePath, int x, int y, int w, int h)
throws Exception {
// 首先通过ImageIo中的方法,创建一个Image + InputStream到内存
ImageInputStream iis = ImageIO
.createImageInputStream(new FileInputStream(filePath));
// 再按照指定格式构造一个Reader(Reader不能new的)
Iterator it = ImageIO.getImageReadersByFormatName("gif");
ImageReader imagereader = (ImageReader) it.next();
// 再通过ImageReader绑定 InputStream
imagereader.setInput(iis);
// 设置感兴趣的源区域。
ImageReadParam par = imagereader.getDefaultReadParam();
par.setSourceRegion(new Rectangle(x, y, w, h));
// 从 reader得到BufferImage
BufferedImage bi = imagereader.read(0, par);
// 将BuffeerImage写出通过ImageIO
ImageIO.write(bi, "png", new File(filePath));
}
}
  在控制台中,查看执行Login后的页面,查看是否登录成功。 查看全部

  htmlunit 抓取网页(的java程序是什么?答案是有哪些??)
  1.HtmlUnit1.1 简介
  HtmlUnit是一个用java编写的无界面浏览器,建模html文档,通过API调用页面,填写表单,点击链接等,像普通浏览器一样操作。通常用于测试和从网页中获取信息。
  官方简介翻译
HtmlUnit是一个无界面浏览器Java程序。它为HTML文档建模,提供了调用页面、填写表单、单击链接等操作的API。就跟你在浏览器里做的操作一样。
HtmlUnit不错的JavaScript支持(不断改进),甚至可以使用相当复杂的AJAX库,根据配置的不同模拟Chrome、Firefox或Internet Explorer等浏览器。
HtmlUnit通常用于测试或从web站点检索信息。
  1.2使用场景
  对于使用java实现的网络爬虫程序,我们一般可以使用apache的HttpClient组件来获取HTML页面信息。HttpClient实现的http请求返回的响应一般是纯文本文档页面,也就是最原创的html页面。
  对于静态的html页面,使用httpClient就足以爬取我们需要的信息。但是对于越来越多的动态网页,更多的数据是通过异步JS代码获取和渲染的。原来的html页面不收录这部分数据。
  
  在上图我们看到的网页中,初始文件加载完成后,红框中的数据列表是看不到的。浏览器通过执行异步JS请求,将获取到的动态数据渲染到原创文档页面,最终成为我们看到的网页。对于这部分需要JS代码执行的数据,httpClient显得力不从心。虽然我们可以拿到JS执行的请求路径,然后用java代码拿到我们需要的那部分数据,更别说从JS脚本里能不能分析出请求路径和请求参数,就分析这部分源码代码价格已经很高了。
  通过上面的介绍,我们了解到目前的动态网页很大一部分是通过异步JS请求获取,然后通过JS渲染页面的。那么我们可以做这样的假设吗,假设我们的爬虫程序模拟了一个浏览器,在获取到html页面后,像浏览器一样执行异步JS代码,在JS渲染完html页面后,就可以愉快的获取到页面上的节点信息了页面不见了。那么有没有这样的java程序呢?
  答案是肯定的。
  HtmlUnit就是这样一个库,用来让界面意外地显示所有异步工作。由于没有需要显示的耗时工作,HtmlUnit 加载一个完整的网页比实际的浏览器块更多。并且根据不同的配置,HtmlUnit可以模拟市面上常用的浏览器,如Chrome、Firefox、IE浏览器等。
  通过HtmlUnit库,加载一个完整的Html页面(图片和视频除外),然后就可以将其转换为我们常用的字符串格式,并使用Jsoup等其他工具获取元素。当然,你也可以直接从HtmlUnit提供的对象中获取网页元素,甚至可以操作按钮、表单等控件。除了不能像可见浏览器那样使用鼠标和键盘来浏览网页,我们可以使用HtmlUnit来模拟和操作所有其他操作,比如登录网站、写博客等都可以完全的。当然,网页内容抓取是最简单的应用。
  2.J4L2.1官方简介
  J4L OCR 工具是一组可用于在 Java 应用程序中收录 OCR 功能的组件。这意味着您可以接收传真、PDF 文件或扫描文档并从图像中提取业务信息。主要的3个组件是:
  j4l工具的详细使用步骤请参考这篇文章文章:Java使用J4L识别验证码
  本文文章主要介绍使用HtmlUnit模拟登录
  3.实际案例3.1.场景
  一个登录页面,包括一个表单,需要填写用户名、登录密码和验证码才能实现用户登录。
  3.2 操作步骤
  使用htmlunit模拟登录是一个获取登录页面-&gt;找到输入框-&gt;填写用户名和密码-&gt;填写验证码-&gt;模拟点击登录的过程。
  4.实现代码4.1maven引入HtmlUnit依赖
  
  net.sourceforge.htmlunit
  htmlunit
  2.18
  4.2 主要方法
  登录.java
   public static void main(String[] args) throws Exception {
login();
}
public static void login() throws Exception {
WebClient webClient = new WebClient(BrowserVersion.CHROME);//设置浏览器内核
webClient.getOptions().setJavaScriptEnabled(true);// js是否可用
webClient.getOptions().setCssEnabled(true);//css 一般设置false因为影响运行速度
webClient.getOptions().setThrowExceptionOnScriptError(false);//设置js抛出异常:false
webClient.getOptions().setActiveXNative(false);
//ajax
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
webClient.getOptions().setUseInsecureSSL(false);
//允许重定向
webClient.getOptions().setRedirectEnabled(true);
//连接超时
webClient.getOptions().setTimeout(5000);
//js执行超时
webClient.setJavaScriptTimeout(10000 * 3);
//允许cookie
webClient.getCookieManager().setCookiesEnabled(true);
String url = "http://hrportalneu.cs/HRPortal ... 3B%3B
HtmlPage page = webClient.getPage(url);
webClient.waitForBackgroundJavaScript(5000);
HtmlPage newPage;
newPage = readyPage(page, webClient, "btnCheckIn1");
System.out.println("url----------------" + newPage.getUrl());
System.out.println("Login执行后页面:" + newPage.asXml());
IOUtils.write(newPage.asXml().getBytes(), new FileWriter(new File("D:/checkIn.txt")));
if (!newPage.asXml().contains("登录成功")) {
login();
}
webClient.close();
}
public static HtmlPage readyPage(HtmlPage page, WebClient webClient, String type) throws Exception {
//封装页面元素
HtmlForm form = page.getHtmlElementById("form1");
HtmlTextInput tbxUsername = form.getInputByName("tbxUsername");
tbxUsername.setValueAttribute("用户名*******");
HtmlPasswordInput tbxPassword = form.getInputByName("tbxPassword");
tbxPassword.setValueAttribute("密码*******");
//获取验证码图片
HtmlImage verify_img = (HtmlImage) page.getElementById("AuthCode1$codeText$img");
File file = new File("D:\\" + "check" + ".png");
//保存验证码图片
verify_img.saveAs(file);
System.out.println("验证码图片已保存!");
//保存路径
String filePath = file.getPath();
//裁剪验证码 这里使用原始的图片文件识别成功率不高 可以先进行裁剪
ImageUtil.cutImage(filePath, 1, 1, 96, 34);
//自动识别验证码
OCRFacade facade = new OCRFacade();
//识别验证码
String code = facade.recognizeFile(filePath, "eng");
//处理字符串
code = code.replaceAll(" ", "");
code = code.replaceAll("\\n", "");
System.out.println("验证码:" + code);
//定位验证码输入框
HtmlTextInput verify_code = form.getInputByName("AuthCode1$codeText");
//填入自动识别出来的验证码
verify_code.setValueAttribute(code);
System.out.println("原始页面:" + page.asXml());
HtmlPage newPage = null;
//操作按钮
if (type.equals("btnCheckIn1")) {
DomElement btnCheckIn1 = page.getElementById("btnCheckIn1");
System.out.println("doCheckIn");
newPage = btnCheckIn1.click();
}
//等待js加载
webClient.waitForBackgroundJavaScript(5000);
return newPage;
} 
  图像实用程序
  public class ImageUtil {
public static void cutImage(String filePath, int x, int y, int w, int h)
throws Exception {
// 首先通过ImageIo中的方法,创建一个Image + InputStream到内存
ImageInputStream iis = ImageIO
.createImageInputStream(new FileInputStream(filePath));
// 再按照指定格式构造一个Reader(Reader不能new的)
Iterator it = ImageIO.getImageReadersByFormatName("gif");
ImageReader imagereader = (ImageReader) it.next();
// 再通过ImageReader绑定 InputStream
imagereader.setInput(iis);
// 设置感兴趣的源区域。
ImageReadParam par = imagereader.getDefaultReadParam();
par.setSourceRegion(new Rectangle(x, y, w, h));
// 从 reader得到BufferImage
BufferedImage bi = imagereader.read(0, par);
// 将BuffeerImage写出通过ImageIO
ImageIO.write(bi, "png", new File(filePath));
}
}
  在控制台中,查看执行Login后的页面,查看是否登录成功。

htmlunit 抓取网页(网页获取和解析速度和性能的应用场景详解! )

网站优化优采云 发表了文章 • 0 个评论 • 50 次浏览 • 2021-11-29 03:14 • 来自相关话题

  htmlunit 抓取网页(网页获取和解析速度和性能的应用场景详解!
)
  (4)支持代理服务器
  (5) 支持自动cookies管理等。
  Java爬虫开发中应用最广泛的网页获取技术之一。它具有一流的速度和性能。它在功能支持方面相对较低。不支持JS脚本执行、CSS解析、渲染等准浏览器功能。推荐给需要快速获取网页的用户。无需解析脚本和 CSS 场景。
  示例代码如下:
  package cn.ysh.studio.crawler.httpclient;import org.apache.http.client.HttpClient;import org.apache.http.client.ResponseHandler;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.BasicResponseHandler;import org.apache.http.impl.client.DefaultHttpClient;/**
* 基于HtmlClient抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHttpClientTest{publicstaticvoid main(String[] args)throwsException{//目标页面String url ="http://www.yshjava.cn";//创建一个默认的HttpClientHttpClient httpclient =newDefaultHttpClient();try{//以get方式请求网页http://www.yshjava.cnHttpGet httpget =newHttpGet(url);//打印请求地址System.out.println("executing request "+ httpget.getURI());//创建响应处理器处理服务器响应内容ResponseHandlerresponseHandler=newBasicResponseHandler();//执行请求并获取结果String responseBody = httpclient.execute(httpget, responseHandler);System.out.println("----------------------------------------");System.out.println(responseBody);System.out.println("----------------------------------------");}finally{//关闭连接管理器
httpclient.getConnectionManager().shutdown();}}}
  汤
  jsoup 是一个 Java HTML 解析器,可以直接解析 URL 地址和 HTML 文本内容。它提供了一个非常省力的API,可以通过DOM、CSS和类似jQuery的操作方法来检索和操作数据。
  网页获取和分析的速度非常快,推荐使用。
  主要功能如下:
  1. 从 URL、文件或字符串解析 HTML;
  2. 使用 DOM 或 CSS 选择器来查找和检索数据;
  3. 可操作的 HTML 元素、属性和文本;
  示例代码如下:
  package cn.ysh.studio.crawler.jsoup;import java.io.IOException;import org.jsoup.Jsoup;/**
* 基于Jsoup抓取网页内容
* @author www.yshjava.cn
*/publicclassJsoupTest{publicstaticvoid main(String[] args)throwsIOException{//目标页面String url ="http://www.yshjava.cn";//使用Jsoup连接目标页面,并执行请求,获取服务器响应内容String html =Jsoup.connect(url).execute().body();//打印页面内容System.out.println(html);}}
  单位
  htmlunit 是一个开源的java 页面分析工具。阅读完页面后,您可以有效地使用htmlunit 来分析页面上的内容。该项目可以模拟浏览器操作,被称为java浏览器的开源实现。这个没有界面的浏览器也非常快。使用 Rhinojs 引擎。模拟js操作。
  网页获取和解析速度更快,性能更好。推荐用于需要解析网页脚本的应用场景。
  示例代码如下:
  package cn.ysh.studio.crawler.htmlunit;import com.gargoylesoftware.htmlunit.BrowserVersion;import com.gargoylesoftware.htmlunit.Page;import com.gargoylesoftware.htmlunit.WebClient;/**
* 基于HtmlUnit抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHtmlUnitSpider{publicstaticvoid main(String[] s)throwsException{//目标网页String url ="http://www.yshjava.cn";//模拟特定浏览器FIREFOX_3WebClient spider =newWebClient(BrowserVersion.FIREFOX_3);//获取目标网页Page page = spider.getPage(url);//打印网页内容System.out.println(page.getWebResponse().getContentAsString());//关闭所有窗口
spider.closeAllWindows();}}
  瓦蒂
  Watij(读作 wattage)是一种使用 Java 开发的 Web 应用程序测试工具。鉴于 Watij 的简单性和 Java 语言的强大功能,Watij 可以让您在真实浏览器中完成 Web 应用程序的自动化测试。因为调用了本地浏览器,所以支持CSS渲染和JS执行。
  网页抓取速度一般,IE版本过低(6/7)可能导致内存泄漏。
  示例代码如下:
  package cn.ysh.studio.crawler.ie;import watij.runtime.ie.IE;/**
* 基于Watij抓取网页内容,仅限Windows平台
*
* @author www.yshjava.cn
*/publicclassWatijTest{publicstaticvoid main(String[] s){//目标页面String url ="http://www.yshjava.cn";//实例化IE浏览器对象
IE ie =new IE();try{//启动浏览器
ie.start();//转到目标网页
ie.goTo(url);//等待网页加载就绪
ie.waitUntilReady();//打印页面内容System.out.println(ie.html());}catch(Exception e){
e.printStackTrace();}finally{try{//关闭IE浏览器
ie.close();}catch(Exception e){}}}}
  硒
  Selenium 也是一种用于 Web 应用程序测试的工具。Selenium 测试直接在浏览器中运行,就像真正的用户在操作一样。支持的浏览器包括 IE、Mozilla Firefox、Mozilla Suite 等。该工具的主要功能包括: 测试浏览器兼容性——测试您的应用程序是否可以在不同浏览器和操作系统上正常运行。测试系统功能——创建回归测试以验证软件功能和用户需求。支持自动录制动作和自动生成。测试Net、Java、Perl等不同语言的脚本。Selenium是ThoughtWorks专门为web应用编写的验收测试工具。
  网页抓取速度较慢,对于爬虫来说不是一个好的选择。
  示例代码如下:
  package cn.ysh.studio.crawler.selenium;import org.openqa.selenium.htmlunit.HtmlUnitDriver;/**
* 基于HtmlDriver抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHtmlDriverTest{publicstaticvoid main(String[] s){//目标网页String url ="http://www.yshjava.cn";HtmlUnitDriver driver =newHtmlUnitDriver();try{//禁用JS脚本功能
driver.setJavascriptEnabled(false);//打开目标网页
driver.get(url);//获取当前网页源码String html = driver.getPageSource();//打印网页源码System.out.println(html);}catch(Exception e){//打印堆栈信息
e.printStackTrace();}finally{try{//关闭并退出
driver.close();
driver.quit();}catch(Exception e){}}}}
  网络规范
  具有支持脚本执行和 CSS 渲染的接口的开源 Java 浏览器。速度是平均的。
  示例代码如下:
  package cn.ysh.studio.crawler.webspec;import org.watij.webspec.dsl.WebSpec;/**
* 基于WebSpec抓取网页内容
*
* @author www.yshjava.cn
*/publicclassWebspecTest{publicstaticvoid main(String[] s){//目标网页String url ="http://www.yshjava.cn";//实例化浏览器对象WebSpec spec =newWebSpec().mozilla();//隐藏浏览器窗体
spec.hide();//打开目标页面
spec.open(url);//打印网页源码System.out.println(spec.source());//关闭所有窗口
spec.closeAll();}} 查看全部

  htmlunit 抓取网页(网页获取和解析速度和性能的应用场景详解!
)
  (4)支持代理服务器
  (5) 支持自动cookies管理等。
  Java爬虫开发中应用最广泛的网页获取技术之一。它具有一流的速度和性能。它在功能支持方面相对较低。不支持JS脚本执行、CSS解析、渲染等准浏览器功能。推荐给需要快速获取网页的用户。无需解析脚本和 CSS 场景。
  示例代码如下:
  package cn.ysh.studio.crawler.httpclient;import org.apache.http.client.HttpClient;import org.apache.http.client.ResponseHandler;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.BasicResponseHandler;import org.apache.http.impl.client.DefaultHttpClient;/**
* 基于HtmlClient抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHttpClientTest{publicstaticvoid main(String[] args)throwsException{//目标页面String url ="http://www.yshjava.cn";//创建一个默认的HttpClientHttpClient httpclient =newDefaultHttpClient();try{//以get方式请求网页http://www.yshjava.cnHttpGet httpget =newHttpGet(url);//打印请求地址System.out.println("executing request "+ httpget.getURI());//创建响应处理器处理服务器响应内容ResponseHandlerresponseHandler=newBasicResponseHandler();//执行请求并获取结果String responseBody = httpclient.execute(httpget, responseHandler);System.out.println("----------------------------------------");System.out.println(responseBody);System.out.println("----------------------------------------");}finally{//关闭连接管理器
httpclient.getConnectionManager().shutdown();}}}
  汤
  jsoup 是一个 Java HTML 解析器,可以直接解析 URL 地址和 HTML 文本内容。它提供了一个非常省力的API,可以通过DOM、CSS和类似jQuery的操作方法来检索和操作数据。
  网页获取和分析的速度非常快,推荐使用。
  主要功能如下:
  1. 从 URL、文件或字符串解析 HTML;
  2. 使用 DOM 或 CSS 选择器来查找和检索数据;
  3. 可操作的 HTML 元素、属性和文本;
  示例代码如下:
  package cn.ysh.studio.crawler.jsoup;import java.io.IOException;import org.jsoup.Jsoup;/**
* 基于Jsoup抓取网页内容
* @author www.yshjava.cn
*/publicclassJsoupTest{publicstaticvoid main(String[] args)throwsIOException{//目标页面String url ="http://www.yshjava.cn";//使用Jsoup连接目标页面,并执行请求,获取服务器响应内容String html =Jsoup.connect(url).execute().body();//打印页面内容System.out.println(html);}}
  单位
  htmlunit 是一个开源的java 页面分析工具。阅读完页面后,您可以有效地使用htmlunit 来分析页面上的内容。该项目可以模拟浏览器操作,被称为java浏览器的开源实现。这个没有界面的浏览器也非常快。使用 Rhinojs 引擎。模拟js操作。
  网页获取和解析速度更快,性能更好。推荐用于需要解析网页脚本的应用场景。
  示例代码如下:
  package cn.ysh.studio.crawler.htmlunit;import com.gargoylesoftware.htmlunit.BrowserVersion;import com.gargoylesoftware.htmlunit.Page;import com.gargoylesoftware.htmlunit.WebClient;/**
* 基于HtmlUnit抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHtmlUnitSpider{publicstaticvoid main(String[] s)throwsException{//目标网页String url ="http://www.yshjava.cn";//模拟特定浏览器FIREFOX_3WebClient spider =newWebClient(BrowserVersion.FIREFOX_3);//获取目标网页Page page = spider.getPage(url);//打印网页内容System.out.println(page.getWebResponse().getContentAsString());//关闭所有窗口
spider.closeAllWindows();}}
  瓦蒂
  Watij(读作 wattage)是一种使用 Java 开发的 Web 应用程序测试工具。鉴于 Watij 的简单性和 Java 语言的强大功能,Watij 可以让您在真实浏览器中完成 Web 应用程序的自动化测试。因为调用了本地浏览器,所以支持CSS渲染和JS执行。
  网页抓取速度一般,IE版本过低(6/7)可能导致内存泄漏。
  示例代码如下:
  package cn.ysh.studio.crawler.ie;import watij.runtime.ie.IE;/**
* 基于Watij抓取网页内容,仅限Windows平台
*
* @author www.yshjava.cn
*/publicclassWatijTest{publicstaticvoid main(String[] s){//目标页面String url ="http://www.yshjava.cn";//实例化IE浏览器对象
IE ie =new IE();try{//启动浏览器
ie.start();//转到目标网页
ie.goTo(url);//等待网页加载就绪
ie.waitUntilReady();//打印页面内容System.out.println(ie.html());}catch(Exception e){
e.printStackTrace();}finally{try{//关闭IE浏览器
ie.close();}catch(Exception e){}}}}
  硒
  Selenium 也是一种用于 Web 应用程序测试的工具。Selenium 测试直接在浏览器中运行,就像真正的用户在操作一样。支持的浏览器包括 IE、Mozilla Firefox、Mozilla Suite 等。该工具的主要功能包括: 测试浏览器兼容性——测试您的应用程序是否可以在不同浏览器和操作系统上正常运行。测试系统功能——创建回归测试以验证软件功能和用户需求。支持自动录制动作和自动生成。测试Net、Java、Perl等不同语言的脚本。Selenium是ThoughtWorks专门为web应用编写的验收测试工具。
  网页抓取速度较慢,对于爬虫来说不是一个好的选择。
  示例代码如下:
  package cn.ysh.studio.crawler.selenium;import org.openqa.selenium.htmlunit.HtmlUnitDriver;/**
* 基于HtmlDriver抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHtmlDriverTest{publicstaticvoid main(String[] s){//目标网页String url ="http://www.yshjava.cn";HtmlUnitDriver driver =newHtmlUnitDriver();try{//禁用JS脚本功能
driver.setJavascriptEnabled(false);//打开目标网页
driver.get(url);//获取当前网页源码String html = driver.getPageSource();//打印网页源码System.out.println(html);}catch(Exception e){//打印堆栈信息
e.printStackTrace();}finally{try{//关闭并退出
driver.close();
driver.quit();}catch(Exception e){}}}}
  网络规范
  具有支持脚本执行和 CSS 渲染的接口的开源 Java 浏览器。速度是平均的。
  示例代码如下:
  package cn.ysh.studio.crawler.webspec;import org.watij.webspec.dsl.WebSpec;/**
* 基于WebSpec抓取网页内容
*
* @author www.yshjava.cn
*/publicclassWebspecTest{publicstaticvoid main(String[] s){//目标网页String url ="http://www.yshjava.cn";//实例化浏览器对象WebSpec spec =newWebSpec().mozilla();//隐藏浏览器窗体
spec.hide();//打开目标页面
spec.open(url);//打印网页源码System.out.println(spec.source());//关闭所有窗口
spec.closeAll();}}

htmlunit 抓取网页(Chrome浏览器如何模拟浏览器的登录,HtmlUnitPost的自我解剖)

网站优化优采云 发表了文章 • 0 个评论 • 45 次浏览 • 2021-11-25 18:16 • 来自相关话题

  htmlunit 抓取网页(Chrome浏览器如何模拟浏览器的登录,HtmlUnitPost的自我解剖)
  设计步骤:
  1、模拟浏览器登录,HtmlUnit是如何模拟浏览器登录的,请参考这篇文章爬虫自解剖(抓取网页HtmlUnit),因为HtmlUnit本身不支持JavaScript 好的,没有需要加载网页的CSS文件,所以在使用HtmlUnit之前,进行相关配置,禁用CSS和JavaScript,代码如下:
  
final WebClient webClient=new WebClient(BrowserVersion.CHROME);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setActiveXNative(false);
webClient.getOptions().setAppletEnabled(false);
webClient.getOptions().setPopupBlockerEnabled(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setPrintContentOnFailingStatusCode(false);
  2、 以上设置后,CSS/JS 和其他一些相关插件被禁用。我们来分析一下Post请求中的相关参数,打开Chrome浏览器,点击网页登录按钮旁边的review元素。 , 可以查看附近的相关html代码,相关html代码如下(只列出比较关注的部分)
  
登录
  从上面的代码可以看出,Post请求中需要用到的相关参数是email和password,所以这两项在Post请求中是必不可少的。模拟登录过程的代码如下图所示:
  
final HtmlPage page=webClient.getPage("http://www.****.com/#signin");
List forms=page.getForms();
HtmlForm login=forms.get(0);
HtmlTextInput email=login.getInputByName("email");
HtmlPasswordInput pwd=login.getInputByName("password");
DomNodeList btn=login.getElementsByTagName("button");
HtmlButton submit=(HtmlButton)btn.get(0);
email.setText(key.trim());
pwd.setText(map.get(key));
submit.click();
  这里登录成功,是不是很简单,我们不需要操作cookies,这次模拟的是Chrome浏览器登录
  备注和评论
  Listforms=page.getForms();表示获取页面上的所有Form表单
  HtmlForm login=forms.get(0); 由于整个页面只有一个表单,直接取第一个
  HtmlTextInput email=login.getInputByName("email");获取页面表单上的email输入框
  HtmlPasswordInput pwd=login.getInputByName("password");获取页面上的密码输入框
  下面两句用于获取页面的登录按钮
  DomNodeListbtn=login.getElementsByTagName("button");
  HtmlButton submit=(HtmlButton)btn.get(0);
  下面两句用于设置邮箱和密码 查看全部

  htmlunit 抓取网页(Chrome浏览器如何模拟浏览器的登录,HtmlUnitPost的自我解剖)
  设计步骤:
  1、模拟浏览器登录,HtmlUnit是如何模拟浏览器登录的,请参考这篇文章爬虫自解剖(抓取网页HtmlUnit),因为HtmlUnit本身不支持JavaScript 好的,没有需要加载网页的CSS文件,所以在使用HtmlUnit之前,进行相关配置,禁用CSS和JavaScript,代码如下:
  
final WebClient webClient=new WebClient(BrowserVersion.CHROME);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setActiveXNative(false);
webClient.getOptions().setAppletEnabled(false);
webClient.getOptions().setPopupBlockerEnabled(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setPrintContentOnFailingStatusCode(false);
  2、 以上设置后,CSS/JS 和其他一些相关插件被禁用。我们来分析一下Post请求中的相关参数,打开Chrome浏览器,点击网页登录按钮旁边的review元素。 , 可以查看附近的相关html代码,相关html代码如下(只列出比较关注的部分)
  
登录
  从上面的代码可以看出,Post请求中需要用到的相关参数是email和password,所以这两项在Post请求中是必不可少的。模拟登录过程的代码如下图所示:
  
final HtmlPage page=webClient.getPage("http://www.****.com/#signin");
List forms=page.getForms();
HtmlForm login=forms.get(0);
HtmlTextInput email=login.getInputByName("email");
HtmlPasswordInput pwd=login.getInputByName("password");
DomNodeList btn=login.getElementsByTagName("button");
HtmlButton submit=(HtmlButton)btn.get(0);
email.setText(key.trim());
pwd.setText(map.get(key));
submit.click();
  这里登录成功,是不是很简单,我们不需要操作cookies,这次模拟的是Chrome浏览器登录
  备注和评论
  Listforms=page.getForms();表示获取页面上的所有Form表单
  HtmlForm login=forms.get(0); 由于整个页面只有一个表单,直接取第一个
  HtmlTextInput email=login.getInputByName("email");获取页面表单上的email输入框
  HtmlPasswordInput pwd=login.getInputByName("password");获取页面上的密码输入框
  下面两句用于获取页面的登录按钮
  DomNodeListbtn=login.getElementsByTagName("button");
  HtmlButton submit=(HtmlButton)btn.get(0);
  下面两句用于设置邮箱和密码

htmlunit 抓取网页(htmlunit网络工具一个没有没有 )

网站优化优采云 发表了文章 • 0 个评论 • 42 次浏览 • 2021-11-24 08:10 • 来自相关话题

  htmlunit 抓取网页(htmlunit网络工具一个没有没有
)
  1:背景
  本来想用jsoup来抓取一个页面,但是我抓取的数据总是不完整,然后发现用js执行了页面后,在页面上渲染了一些数据,也就是说,只在执行js后的数据页上。会显示数据,但是jsoup无法实现执行页面的js。
  2:解决
  搜索后发现htmlunit网络工具可以执行js,相当于没有页面的浏览器。解决办法是先用htmlUnit发送网络请求,执行js获取页面,然后用jsoup转换成Document页面对象。然后用jsoup分析页面读取数据。
  3: htmlUnit 发送请求
   1 public static Document getDocument() throws IOException, InterruptedException{
2 /*String url="https://www.marklines.com/cn/v ... 3B%3B
3 Connection connect = Jsoup.connect(url).userAgent("")
4 .header("Cookie", "PLAY_LANG=cn; _plh=b9289d0a863a8fc9c79fb938f15372f7731d13fb; PLATFORM_SESSION=39034d07000717c664134556ad39869771aabc04-_ldi=520275&_lsh=8cf91cdbcbbb255adff5cba6061f561b642f5157&csrfToken=209f20c8473bc0518413c226f898ff79cd69c3ff-1539926671235-b853a6a63c77dd8fcc364a58&_lpt=%2Fcn%2Fvehicle_sales%2Fsearch&_lsi=1646321; _ga=GA1.2.2146952143.1539926675; _gid=GA1.2.1032787565.1539926675; _plh_notime=8cf91cdbcbbb255adff5cba6061f561b642f5157")
5 .timeout(360000000);
6 Document document = connect.get();*/
7 WebClient wc = new WebClient(BrowserVersion.CHROME);
8 //是否使用不安全的SSL
9 wc.getOptions().setUseInsecureSSL(true);
10 //启用JS解释器,默认为true
11 wc.getOptions().setJavaScriptEnabled(true);
12 //禁用CSS
13 wc.getOptions().setCssEnabled(false);
14 //js运行错误时,是否抛出异常
15 wc.getOptions().setThrowExceptionOnScriptError(false);
16 //状态码错误时,是否抛出异常
17 wc.getOptions().setThrowExceptionOnFailingStatusCode(false);
18 //是否允许使用ActiveX
19 wc.getOptions().setActiveXNative(false);
20 //等待js时间
21 wc.waitForBackgroundJavaScript(600*1000);
22 //设置Ajax异步处理控制器即启用Ajax支持
23 wc.setAjaxController(new NicelyResynchronizingAjaxController());
24 //设置超时时间
25 wc.getOptions().setTimeout(1000000);
26 //不跟踪抓取
27 wc.getOptions().setDoNotTrackEnabled(false);
28 WebRequest request=new WebRequest(new URL("https://www.marklines.com/cn/v ... 6quot;));
29 request.setAdditionalHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0");
30 request.setAdditionalHeader("Cookie","PLAY_LANG=cn; _plh=b9289d0a863a8fc9c79fb938f15372f7731d13fb; PLATFORM_SESSION=39034d07000717c664134556ad39869771aabc04-_ldi=520275&_lsh=8cf91cdbcbbb255adff5cba6061f561b642f5157&csrfToken=209f20c8473bc0518413c226f898ff79cd69c3ff-1539926671235-b853a6a63c77dd8fcc364a58&_lpt=%2Fcn%2Fvehicle_sales%2Fsearch&_lsi=1646321; _ga=GA1.2.2146952143.1539926675; _gid=GA1.2.1032787565.1539926675; _plh_notime=8cf91cdbcbbb255adff5cba6061f561b642f5157");
31 try {
32 //模拟浏览器打开一个目标网址
33 HtmlPage htmlPage = wc.getPage(request);
34 //为了获取js执行的数据 线程开始沉睡等待
35 Thread.sleep(1000);//这个线程的等待 因为js加载需要时间的
36 //以xml形式获取响应文本
37 String xml = htmlPage.asXml();
38 //并转为Document对象return
39 return Jsoup.parse(xml);
40 //System.out.println(xml.contains("结果.xls"));//false
41 } catch (FailingHttpStatusCodeException e) {
42 e.printStackTrace();
43 } catch (MalformedURLException e) {
44 e.printStackTrace();
45 } catch (IOException e) {
46 e.printStackTrace();
47 }
48 return null;
49 }
  4:返回的Document对象交给jsoup处理
  我这里只做了一个简单的输出,我检查了数据是否全部渲染完毕。
   1 Document doc=getDocument();
2 Element table=doc.select("table.table.table-bordered.aggregate_table").get(0);//获取到表格
3 Element tableContext=table.getElementsByTag("tbody").get(0);
4 Elements contextTrs=tableContext.getElementsByTag("tr");
5 System.out.println(contextTrs.size());
6
7
8 String context=doc.toString();
9 OutputStreamWriter pw = null;
10 pw = new OutputStreamWriter(new FileOutputStream("D:/test.txt"),"GBK");
11 pw.write(context);
12 pw.close(); 查看全部

  htmlunit 抓取网页(htmlunit网络工具一个没有没有
)
  1:背景
  本来想用jsoup来抓取一个页面,但是我抓取的数据总是不完整,然后发现用js执行了页面后,在页面上渲染了一些数据,也就是说,只在执行js后的数据页上。会显示数据,但是jsoup无法实现执行页面的js。
  2:解决
  搜索后发现htmlunit网络工具可以执行js,相当于没有页面的浏览器。解决办法是先用htmlUnit发送网络请求,执行js获取页面,然后用jsoup转换成Document页面对象。然后用jsoup分析页面读取数据。
  3: htmlUnit 发送请求
   1 public static Document getDocument() throws IOException, InterruptedException{
2 /*String url="https://www.marklines.com/cn/v ... 3B%3B
3 Connection connect = Jsoup.connect(url).userAgent("")
4 .header("Cookie", "PLAY_LANG=cn; _plh=b9289d0a863a8fc9c79fb938f15372f7731d13fb; PLATFORM_SESSION=39034d07000717c664134556ad39869771aabc04-_ldi=520275&_lsh=8cf91cdbcbbb255adff5cba6061f561b642f5157&csrfToken=209f20c8473bc0518413c226f898ff79cd69c3ff-1539926671235-b853a6a63c77dd8fcc364a58&_lpt=%2Fcn%2Fvehicle_sales%2Fsearch&_lsi=1646321; _ga=GA1.2.2146952143.1539926675; _gid=GA1.2.1032787565.1539926675; _plh_notime=8cf91cdbcbbb255adff5cba6061f561b642f5157")
5 .timeout(360000000);
6 Document document = connect.get();*/
7 WebClient wc = new WebClient(BrowserVersion.CHROME);
8 //是否使用不安全的SSL
9 wc.getOptions().setUseInsecureSSL(true);
10 //启用JS解释器,默认为true
11 wc.getOptions().setJavaScriptEnabled(true);
12 //禁用CSS
13 wc.getOptions().setCssEnabled(false);
14 //js运行错误时,是否抛出异常
15 wc.getOptions().setThrowExceptionOnScriptError(false);
16 //状态码错误时,是否抛出异常
17 wc.getOptions().setThrowExceptionOnFailingStatusCode(false);
18 //是否允许使用ActiveX
19 wc.getOptions().setActiveXNative(false);
20 //等待js时间
21 wc.waitForBackgroundJavaScript(600*1000);
22 //设置Ajax异步处理控制器即启用Ajax支持
23 wc.setAjaxController(new NicelyResynchronizingAjaxController());
24 //设置超时时间
25 wc.getOptions().setTimeout(1000000);
26 //不跟踪抓取
27 wc.getOptions().setDoNotTrackEnabled(false);
28 WebRequest request=new WebRequest(new URL("https://www.marklines.com/cn/v ... 6quot;));
29 request.setAdditionalHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0");
30 request.setAdditionalHeader("Cookie","PLAY_LANG=cn; _plh=b9289d0a863a8fc9c79fb938f15372f7731d13fb; PLATFORM_SESSION=39034d07000717c664134556ad39869771aabc04-_ldi=520275&_lsh=8cf91cdbcbbb255adff5cba6061f561b642f5157&csrfToken=209f20c8473bc0518413c226f898ff79cd69c3ff-1539926671235-b853a6a63c77dd8fcc364a58&_lpt=%2Fcn%2Fvehicle_sales%2Fsearch&_lsi=1646321; _ga=GA1.2.2146952143.1539926675; _gid=GA1.2.1032787565.1539926675; _plh_notime=8cf91cdbcbbb255adff5cba6061f561b642f5157");
31 try {
32 //模拟浏览器打开一个目标网址
33 HtmlPage htmlPage = wc.getPage(request);
34 //为了获取js执行的数据 线程开始沉睡等待
35 Thread.sleep(1000);//这个线程的等待 因为js加载需要时间的
36 //以xml形式获取响应文本
37 String xml = htmlPage.asXml();
38 //并转为Document对象return
39 return Jsoup.parse(xml);
40 //System.out.println(xml.contains("结果.xls"));//false
41 } catch (FailingHttpStatusCodeException e) {
42 e.printStackTrace();
43 } catch (MalformedURLException e) {
44 e.printStackTrace();
45 } catch (IOException e) {
46 e.printStackTrace();
47 }
48 return null;
49 }
  4:返回的Document对象交给jsoup处理
  我这里只做了一个简单的输出,我检查了数据是否全部渲染完毕。
   1 Document doc=getDocument();
2 Element table=doc.select("table.table.table-bordered.aggregate_table").get(0);//获取到表格
3 Element tableContext=table.getElementsByTag("tbody").get(0);
4 Elements contextTrs=tableContext.getElementsByTag("tr");
5 System.out.println(contextTrs.size());
6
7
8 String context=doc.toString();
9 OutputStreamWriter pw = null;
10 pw = new OutputStreamWriter(new FileOutputStream("D:/test.txt"),"GBK");
11 pw.write(context);
12 pw.close();

htmlunit 抓取网页(抓一个今日头条的首页内容解决方案-苏州安嘉)

网站优化优采云 发表了文章 • 0 个评论 • 71 次浏览 • 2021-11-16 09:06 • 来自相关话题

  htmlunit 抓取网页(抓一个今日头条的首页内容解决方案-苏州安嘉)
  不知道大家在使用jsoup的过程中是否遇到过爬取内容的情况,发现有些网页的内容是通过JavaScript异步加载的,导致我们的爬虫空手而归(只抓到了一个网页)。
  遇到这个问题首先想到的有两种解决方案:
  在等待网页异步加载后,使用类似于Python中延迟加载的方法抓取异步加载的网页。使用特殊的方法使被爬取的网页的外框模拟里面的JavaScript代码的执行,最终到达完整的网页。
  在搜索引擎的帮助下,我决定使用选项2来解决问题。选项 1 没有搜索更好的第三方库。在java中使用Option 1解决这个问题的朋友希望能和下一个一起讨论,太好了。
  案例很简单,抓取今日头条的首页内容。你可以看看今日头条的主页。里面的内容是异步加载的。
  添加jsoup和htmlunit的依赖
  
org.jsoup
jsoup
1.10.2
net.sourceforge.htmlunit
htmlunit
2.25




1

2

3

4

5

6

7

8

9

10


  首先我们单独使用jsoup解析今日头条首页
  String url = "https://www.toutiao.com/";
Connection connect = Jsoup.connect(url);
Document document = connect.get();
System.out.println(document);




1

2

3

4


  ↑ 这里只能获取网页的frame内容,不能获取首页的新闻内容
  接下来我们用htmlunit试试
  //构造一个webClient 模拟Chrome 浏览器
WebClient webClient = new WebClient(BrowserVersion.CHROME);
//屏蔽日志信息
LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log",
"org.apache.commons.logging.impl.NoOpLog");
java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(Level.OFF);
//支持JavaScript
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setActiveXNative(false);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getOptions().setTimeout(5000);
HtmlPage rootPage = webClient.getPage(url);
//设置一个运行JavaScript的时间
webClient.waitForBackgroundJavaScript(5000);
String html = rootPage.asXml();
Document document = Jsoup.parse(html);




1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19





<a target="_blank" rel="noopener"></a>


  这样我们就可以在运行后得到一个收录JavaScript的完整源码网页 查看全部

  htmlunit 抓取网页(抓一个今日头条的首页内容解决方案-苏州安嘉)
  不知道大家在使用jsoup的过程中是否遇到过爬取内容的情况,发现有些网页的内容是通过JavaScript异步加载的,导致我们的爬虫空手而归(只抓到了一个网页)。
  遇到这个问题首先想到的有两种解决方案:
  在等待网页异步加载后,使用类似于Python中延迟加载的方法抓取异步加载的网页。使用特殊的方法使被爬取的网页的外框模拟里面的JavaScript代码的执行,最终到达完整的网页。
  在搜索引擎的帮助下,我决定使用选项2来解决问题。选项 1 没有搜索更好的第三方库。在java中使用Option 1解决这个问题的朋友希望能和下一个一起讨论,太好了。
  案例很简单,抓取今日头条的首页内容。你可以看看今日头条的主页。里面的内容是异步加载的。
  添加jsoup和htmlunit的依赖
  
org.jsoup
jsoup
1.10.2
net.sourceforge.htmlunit
htmlunit
2.25




1

2

3

4

5

6

7

8

9

10


  首先我们单独使用jsoup解析今日头条首页
  String url = "https://www.toutiao.com/";
Connection connect = Jsoup.connect(url);
Document document = connect.get();
System.out.println(document);




1

2

3

4


  ↑ 这里只能获取网页的frame内容,不能获取首页的新闻内容
  接下来我们用htmlunit试试
  //构造一个webClient 模拟Chrome 浏览器
WebClient webClient = new WebClient(BrowserVersion.CHROME);
//屏蔽日志信息
LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log",
"org.apache.commons.logging.impl.NoOpLog");
java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(Level.OFF);
//支持JavaScript
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setActiveXNative(false);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getOptions().setTimeout(5000);
HtmlPage rootPage = webClient.getPage(url);
//设置一个运行JavaScript的时间
webClient.waitForBackgroundJavaScript(5000);
String html = rootPage.asXml();
Document document = Jsoup.parse(html);




1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19





<a target="_blank" rel="noopener"></a>


  这样我们就可以在运行后得到一个收录JavaScript的完整源码网页

htmlunit 抓取网页(编程之家为你收集整理的全部内容全部内容代码片段-编程之家小)

网站优化优采云 发表了文章 • 0 个评论 • 48 次浏览 • 2021-11-15 16:07 • 来自相关话题

  htmlunit 抓取网页(编程之家为你收集整理的全部内容全部内容代码片段-编程之家小)
  以下是编程之家通过互联网采集整理的一段代码片段。
  编程之家的编辑现在与您分享,也可以作为您的参考。
  最近在写爬虫的时候,在使用httpclient抓取一些网页的时候出现了一些问题,就是检索到的内容收录大量的密文(通过javascript脚本),无法获取到真实的内容(即呈现的内容)通过使用浏览器打开网页))。所以一般需要配合js引擎来解决这个问题。经过搜索,我发现htmlunit工具可以提供帮助。在了解和使用的过程中,我发现这是一个非常强大的开源工具。虽然名气不如httpclient,但实力不容小觑。少说八卦。可以从这里下载:/htmlunit/files/htmlunit/2.15/
  String url="http://outofmemory.cn/";//想采集的网址
String refer="http://open-open.com/";
URL link=new URL(url);
WebClient wc=new WebClient();
WebRequest request=new WebRequest(link);
request.setCharset("UTF-8");
request.setProxyHost("120.120.120.x");
request.setProxyPort(8080);
request.setAdditionalHeader("Referer",refer);//设置请求报文头里的refer字段
////设置请求报文头里的User-Agent字段
request.setAdditionalHeader("User-Agent","Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2");
//wc.addRequestHeader("User-Agent","Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2");
//wc.addRequestHeader和request.setAdditionalHeader功能应该是一样的。选择一个即可。
//其他报文头字段可以根据需要添加
wc.getCookieManager().setCookiesEnabled(true);//开启cookie管理
wc.getOptions().setJavaScriptEnabled(true);//开启js解析。对于变态网页,这个是必须的
wc.getOptions().setCssEnabled(true);//开启css解析。对于变态网页,这个是必须的。
wc.getOptions().setThrowExceptionOnFailingStatusCode(false);
wc.getOptions().setThrowExceptionOnScriptError(false);
wc.getOptions().setTimeout(10000);
//设置cookie。如果你有cookie,可以在这里设置
Set cookies=null;
Iterator i = cookies.iterator();
while (i.hasNext())
{
wc.getCookieManager().addCookie(i.next());
}
//准备工作已经做好了
HtmlPage page=null;
page = wc.getPage(request);
if(page==null)
{
System.out.println("采集 "+url+" 失败!!!");
return ;
}
String content=page.asText();//网页内容保存在content里
if(content==null)
{
System.out.println("采集 "+url+" 失败!!!");
return ;
}
//搞定了
CookieManager CM = wc.getCookieManager(); //WC = Your WebClient's name
Set cookies_ret = CM.getCookies();//返回的Cookie在这里,下次请求的时候可能可以用上啦。
  以上是编程之家()为大家采集整理的所有代码内容,希望文章可以帮助大家解决遇到的程序开发问题。
  如果你觉得编程之家网站的内容还不错,欢迎向程序员朋友推荐编程之家网站。
  总结
  以上就是使用HtmlUnit模拟浏览器抓取编程之家为您采集的网页数据的全部内容。希望文章可以帮助大家解决使用HtmlUnit模拟浏览器抓取网页数据时遇到的程序开发问题。
  如果你觉得编程之家网站的内容还不错,欢迎向程序员朋友推荐编程之家网站。 查看全部

  htmlunit 抓取网页(编程之家为你收集整理的全部内容全部内容代码片段-编程之家小)
  以下是编程之家通过互联网采集整理的一段代码片段。
  编程之家的编辑现在与您分享,也可以作为您的参考。
  最近在写爬虫的时候,在使用httpclient抓取一些网页的时候出现了一些问题,就是检索到的内容收录大量的密文(通过javascript脚本),无法获取到真实的内容(即呈现的内容)通过使用浏览器打开网页))。所以一般需要配合js引擎来解决这个问题。经过搜索,我发现htmlunit工具可以提供帮助。在了解和使用的过程中,我发现这是一个非常强大的开源工具。虽然名气不如httpclient,但实力不容小觑。少说八卦。可以从这里下载:/htmlunit/files/htmlunit/2.15/
  String url="http://outofmemory.cn/";//想采集的网址
String refer="http://open-open.com/";
URL link=new URL(url);
WebClient wc=new WebClient();
WebRequest request=new WebRequest(link);
request.setCharset("UTF-8");
request.setProxyHost("120.120.120.x");
request.setProxyPort(8080);
request.setAdditionalHeader("Referer",refer);//设置请求报文头里的refer字段
////设置请求报文头里的User-Agent字段
request.setAdditionalHeader("User-Agent","Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2");
//wc.addRequestHeader("User-Agent","Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2");
//wc.addRequestHeader和request.setAdditionalHeader功能应该是一样的。选择一个即可。
//其他报文头字段可以根据需要添加
wc.getCookieManager().setCookiesEnabled(true);//开启cookie管理
wc.getOptions().setJavaScriptEnabled(true);//开启js解析。对于变态网页,这个是必须的
wc.getOptions().setCssEnabled(true);//开启css解析。对于变态网页,这个是必须的。
wc.getOptions().setThrowExceptionOnFailingStatusCode(false);
wc.getOptions().setThrowExceptionOnScriptError(false);
wc.getOptions().setTimeout(10000);
//设置cookie。如果你有cookie,可以在这里设置
Set cookies=null;
Iterator i = cookies.iterator();
while (i.hasNext())
{
wc.getCookieManager().addCookie(i.next());
}
//准备工作已经做好了
HtmlPage page=null;
page = wc.getPage(request);
if(page==null)
{
System.out.println("采集 "+url+" 失败!!!");
return ;
}
String content=page.asText();//网页内容保存在content里
if(content==null)
{
System.out.println("采集 "+url+" 失败!!!");
return ;
}
//搞定了
CookieManager CM = wc.getCookieManager(); //WC = Your WebClient's name
Set cookies_ret = CM.getCookies();//返回的Cookie在这里,下次请求的时候可能可以用上啦。
  以上是编程之家()为大家采集整理的所有代码内容,希望文章可以帮助大家解决遇到的程序开发问题。
  如果你觉得编程之家网站的内容还不错,欢迎向程序员朋友推荐编程之家网站。
  总结
  以上就是使用HtmlUnit模拟浏览器抓取编程之家为您采集的网页数据的全部内容。希望文章可以帮助大家解决使用HtmlUnit模拟浏览器抓取网页数据时遇到的程序开发问题。
  如果你觉得编程之家网站的内容还不错,欢迎向程序员朋友推荐编程之家网站。

htmlunit 抓取网页(AngularJSjs渲染出的页面越来越多如何判断前端渲染页面)

网站优化优采云 发表了文章 • 0 个评论 • 53 次浏览 • 2021-11-13 13:21 • 来自相关话题

  htmlunit 抓取网页(AngularJSjs渲染出的页面越来越多如何判断前端渲染页面)
  随着AJAX技术的不断普及和AngularJS等单页应用框架的出现,越来越多的页面由js渲染。对于爬虫来说,这种页面比较烦人:只提取HTML内容往往得不到有效信息。那么如何处理这种页面呢?一般来说,有两种方法:
  在爬虫阶段,爬虫内置浏览器内核,执行js渲染页面后,进行爬虫。这方面对应的工具有Selenium、HtmlUnit或PhantomJs。但是,这些工具存在一定的效率问题,同时也不太稳定。优点是写入规则与静态页面相同。因为js渲染页面的数据也是从后端获取的,而且基本都是通过AJAX获取的,所以分析AJAX请求,找到对应数据的请求也是一种可行的方式。并且与页面样式相比,这个界面不太可能发生变化。缺点是找到这个请求并模拟它是一个比较困难的过程,需要比较多的分析经验。
  比较两种方法,我的观点是,对于一次性或小规模的需求,第一种方法省时省力。但对于长期、大规模的需求,第二种会更可靠。对于某些站点,甚至还有一些 js 混淆技术。这时候第一种方法基本上是万能的,第二种方法会很复杂。
  对于第一种方法,webmagic-selenium 就是这样一种尝试。它定义了一个Downloader,它在下载页面时使用浏览器内核进行渲染。selenium 的配置比较复杂,和平台和版本有关,所以没有稳定的解决方案。有兴趣可以看我的博客:使用Selenium爬取动态加载的页面
  这里我主要介绍第二种方法。希望最后你会发现:前端渲染页面的原创解析并没有那么复杂。这里我们以AngularJS中文社区为例。
  1 如何判断前端渲染
  判断页面是否被js渲染的方法比较简单。可以直接在浏览器中查看源码(Windows下Ctrl+U,Mac下command+alt+u)。如果找不到有效信息,基本可以为js渲染。
  
  
  在这个例子中,如果源代码中找不到页面上的标题“优府计算机网络-前端攻城引擎”,可以断定是js渲染,而这个数据是通过AJAX获取的。
  2 分析请求
  现在我们进入最难的部分:找到这个数据请求。这一步可以帮助我们的工具,主要是在浏览器中查看网络请求的开发者工具。
  以Chome为例,我们打开“开发者工具”(Windows下F12,Mac下command+alt+i),然后刷新页面(也可能是下拉页面,总之你所有的操作认为可能会触发新的数据),然后记得保持场景并一一分析请求!
  这一步需要一点耐心,但也不是不守规矩。首先可以帮助我们的是上面的分类过滤器(All、Document 等选项)。如果是普通的AJAX,会显示在XHR标签下,JSONP请求会在Scripts标签下。这是两种常见的数据类型。
  然后就可以根据数据的大小来判断了。一般来说,较大的结果更有可能是返回数据的接口。剩下的就基本靠经验了。比如这里的“latest?p=1&amp;s=20”一看就可疑……
  
  对于可疑地址,此时可以查看响应正文的内容。此处的开发人员工具中不清楚。我们把URL复制到地址栏,再次请求(如果Chrome建议安装jsonviewer,查看AJAX结果非常方便)。看看结果,似乎找到了我们想要的东西。
  
  同样的,我们到了帖子详情页,找到了具体内容的请求:。
  3 编写程序
  回顾之前的列表+目标页面的例子,我们会发现我们这次的需求和之前的差不多,只是换成了AJAX-AJAX风格的列表,AJAX风格的数据,返回的数据变成了JSON。那么,我们还是可以用最后一种方法,分成两页来写:
  数据表
  在这个列表页面上,我们需要找到有效的信息来帮助我们构建目标 AJAX URL。这里我们看到这个_id应该是我们想要的帖子的id,帖子详情请求是由一些固定的URL加上这个id组成的。所以在这一步,我们自己手动构造了URL,加入到要爬取的队列中。这里我们使用 JsonPath,一种选择语言来选择数据(webmagic-extension 包提供了 JsonPathSelector 来支持它)。
   
  如果 (page.getUrl().regex(LIST_URL).match()) {
  //这里我们使用JSONPATH作为选择语言来选择数据
  List ids = new JsonPathSelector("$.data[*]._id").selectList(page.getRawText());
  如果(采集Utils.isNotEmpty(ids)){
  for (String id: ids) {
  page.addTargetRequest(""+id);
  }
  }
  }
  目标数据
  有了URL,解析目标数据其实很简单。因为JSON数据是完全结构化的,省去了我们分析页面和编写XPath的过程。这里我们仍然使用 JsonPath 来获取标题和内容。
   
  page.putField("title", new JsonPathSelector("$.data.title").select(page.getRawText()));
  page.putField("content", new JsonPathSelector("$.data.content").select(page.getRawText()));
  本示例的完整代码请参见AngularJSProcessor.java
  4 总结
  在这个例子中,我们分析了一个比较经典的动态页面的爬取过程。其实动态页面爬取最大的区别就是增加了链接发现的难度。让我们比较一下两种开发模式:
  后台渲染页面
  下载辅助页面 =&gt; 发现链接 =&gt; 下载并分析目标 HTML
  前端渲染页面
  发现辅助数据 =&gt; 构建链接 =&gt; 下载并分析目标 AJAX
  对于不同的站点,这个辅助数据可能会提前在页面的HTML中输出,也可能是通过AJAX请求,甚至是多个数据请求的过程,但这种模式基本是固定的。
  但是这些数据请求的分析还是比页面分析复杂很多,所以这其实就是动态页面爬取的难点。
  本节的例子希望做的是提供一个可以遵循的模式,供此类爬虫在分析请求后的编写,即发现辅助数据=&gt; 构建链接=&gt; 下载并分析目标AJAX模型。
  PS:
  WebMagic 0.5.0 会给链 API 添加 Json 支持,你可以使用:
  page.getJson().jsonPath("$.name").get();
  这种方式来解析AJAX请求。
  还支持
  page.getJson().removePadding("callback").jsonPath("$.name").get();
  这种方式来解析 JSONP 请求。 查看全部

  htmlunit 抓取网页(AngularJSjs渲染出的页面越来越多如何判断前端渲染页面)
  随着AJAX技术的不断普及和AngularJS等单页应用框架的出现,越来越多的页面由js渲染。对于爬虫来说,这种页面比较烦人:只提取HTML内容往往得不到有效信息。那么如何处理这种页面呢?一般来说,有两种方法:
  在爬虫阶段,爬虫内置浏览器内核,执行js渲染页面后,进行爬虫。这方面对应的工具有Selenium、HtmlUnit或PhantomJs。但是,这些工具存在一定的效率问题,同时也不太稳定。优点是写入规则与静态页面相同。因为js渲染页面的数据也是从后端获取的,而且基本都是通过AJAX获取的,所以分析AJAX请求,找到对应数据的请求也是一种可行的方式。并且与页面样式相比,这个界面不太可能发生变化。缺点是找到这个请求并模拟它是一个比较困难的过程,需要比较多的分析经验。
  比较两种方法,我的观点是,对于一次性或小规模的需求,第一种方法省时省力。但对于长期、大规模的需求,第二种会更可靠。对于某些站点,甚至还有一些 js 混淆技术。这时候第一种方法基本上是万能的,第二种方法会很复杂。
  对于第一种方法,webmagic-selenium 就是这样一种尝试。它定义了一个Downloader,它在下载页面时使用浏览器内核进行渲染。selenium 的配置比较复杂,和平台和版本有关,所以没有稳定的解决方案。有兴趣可以看我的博客:使用Selenium爬取动态加载的页面
  这里我主要介绍第二种方法。希望最后你会发现:前端渲染页面的原创解析并没有那么复杂。这里我们以AngularJS中文社区为例。
  1 如何判断前端渲染
  判断页面是否被js渲染的方法比较简单。可以直接在浏览器中查看源码(Windows下Ctrl+U,Mac下command+alt+u)。如果找不到有效信息,基本可以为js渲染。
  
  
  在这个例子中,如果源代码中找不到页面上的标题“优府计算机网络-前端攻城引擎”,可以断定是js渲染,而这个数据是通过AJAX获取的。
  2 分析请求
  现在我们进入最难的部分:找到这个数据请求。这一步可以帮助我们的工具,主要是在浏览器中查看网络请求的开发者工具。
  以Chome为例,我们打开“开发者工具”(Windows下F12,Mac下command+alt+i),然后刷新页面(也可能是下拉页面,总之你所有的操作认为可能会触发新的数据),然后记得保持场景并一一分析请求!
  这一步需要一点耐心,但也不是不守规矩。首先可以帮助我们的是上面的分类过滤器(All、Document 等选项)。如果是普通的AJAX,会显示在XHR标签下,JSONP请求会在Scripts标签下。这是两种常见的数据类型。
  然后就可以根据数据的大小来判断了。一般来说,较大的结果更有可能是返回数据的接口。剩下的就基本靠经验了。比如这里的“latest?p=1&amp;s=20”一看就可疑……
  
  对于可疑地址,此时可以查看响应正文的内容。此处的开发人员工具中不清楚。我们把URL复制到地址栏,再次请求(如果Chrome建议安装jsonviewer,查看AJAX结果非常方便)。看看结果,似乎找到了我们想要的东西。
  
  同样的,我们到了帖子详情页,找到了具体内容的请求:。
  3 编写程序
  回顾之前的列表+目标页面的例子,我们会发现我们这次的需求和之前的差不多,只是换成了AJAX-AJAX风格的列表,AJAX风格的数据,返回的数据变成了JSON。那么,我们还是可以用最后一种方法,分成两页来写:
  数据表
  在这个列表页面上,我们需要找到有效的信息来帮助我们构建目标 AJAX URL。这里我们看到这个_id应该是我们想要的帖子的id,帖子详情请求是由一些固定的URL加上这个id组成的。所以在这一步,我们自己手动构造了URL,加入到要爬取的队列中。这里我们使用 JsonPath,一种选择语言来选择数据(webmagic-extension 包提供了 JsonPathSelector 来支持它)。
   
  如果 (page.getUrl().regex(LIST_URL).match()) {
  //这里我们使用JSONPATH作为选择语言来选择数据
  List ids = new JsonPathSelector("$.data[*]._id").selectList(page.getRawText());
  如果(采集Utils.isNotEmpty(ids)){
  for (String id: ids) {
  page.addTargetRequest(""+id);
  }
  }
  }
  目标数据
  有了URL,解析目标数据其实很简单。因为JSON数据是完全结构化的,省去了我们分析页面和编写XPath的过程。这里我们仍然使用 JsonPath 来获取标题和内容。
   
  page.putField("title", new JsonPathSelector("$.data.title").select(page.getRawText()));
  page.putField("content", new JsonPathSelector("$.data.content").select(page.getRawText()));
  本示例的完整代码请参见AngularJSProcessor.java
  4 总结
  在这个例子中,我们分析了一个比较经典的动态页面的爬取过程。其实动态页面爬取最大的区别就是增加了链接发现的难度。让我们比较一下两种开发模式:
  后台渲染页面
  下载辅助页面 =&gt; 发现链接 =&gt; 下载并分析目标 HTML
  前端渲染页面
  发现辅助数据 =&gt; 构建链接 =&gt; 下载并分析目标 AJAX
  对于不同的站点,这个辅助数据可能会提前在页面的HTML中输出,也可能是通过AJAX请求,甚至是多个数据请求的过程,但这种模式基本是固定的。
  但是这些数据请求的分析还是比页面分析复杂很多,所以这其实就是动态页面爬取的难点。
  本节的例子希望做的是提供一个可以遵循的模式,供此类爬虫在分析请求后的编写,即发现辅助数据=&gt; 构建链接=&gt; 下载并分析目标AJAX模型。
  PS:
  WebMagic 0.5.0 会给链 API 添加 Json 支持,你可以使用:
  page.getJson().jsonPath("$.name").get();
  这种方式来解析AJAX请求。
  还支持
  page.getJson().removePadding("callback").jsonPath("$.name").get();
  这种方式来解析 JSONP 请求。

htmlunit 抓取网页(网页获取和解析速度和性能的应用场景详解! )

网站优化优采云 发表了文章 • 0 个评论 • 64 次浏览 • 2021-11-12 00:03 • 来自相关话题

  htmlunit 抓取网页(网页获取和解析速度和性能的应用场景详解!
)
  (4)支持代理服务器
  (5) 支持自动cookies管理等。
  Java爬虫开发中应用最广泛的网页获取技术之一。它具有一流的速度和性能。它在功能支持方面相对较低。不支持JS脚本执行、CSS解析、渲染等准浏览器功能。推荐给需要快速获取网页的用户。无需解析脚本和 CSS 场景。
  示例代码如下:
  package cn.ysh.studio.crawler.httpclient;import org.apache.http.client.HttpClient;import org.apache.http.client.ResponseHandler;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.BasicResponseHandler;import org.apache.http.impl.client.DefaultHttpClient;/**
* 基于HtmlClient抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHttpClientTest{publicstaticvoid main(String[] args)throwsException{//目标页面String url ="http://www.yshjava.cn";//创建一个默认的HttpClientHttpClient httpclient =newDefaultHttpClient();try{//以get方式请求网页http://www.yshjava.cnHttpGet httpget =newHttpGet(url);//打印请求地址System.out.println("executing request "+ httpget.getURI());//创建响应处理器处理服务器响应内容ResponseHandlerresponseHandler=newBasicResponseHandler();//执行请求并获取结果String responseBody = httpclient.execute(httpget, responseHandler);System.out.println("----------------------------------------");System.out.println(responseBody);System.out.println("----------------------------------------");}finally{//关闭连接管理器
httpclient.getConnectionManager().shutdown();}}}
  汤
  jsoup 是一个 Java HTML 解析器,可以直接解析 URL 地址和 HTML 文本内容。它提供了一个非常省力的API,可以通过DOM、CSS和类似jQuery的操作方法来检索和操作数据。
  网页获取和分析速度非常快,推荐使用。
  主要功能如下:
  1. 从 URL、文件或字符串解析 HTML;
  2. 使用 DOM 或 CSS 选择器来查找和检索数据;
  3. 可操作的 HTML 元素、属性和文本;
  示例代码如下:
  package cn.ysh.studio.crawler.jsoup;import java.io.IOException;import org.jsoup.Jsoup;/**
* 基于Jsoup抓取网页内容
* @author www.yshjava.cn
*/publicclassJsoupTest{publicstaticvoid main(String[] args)throwsIOException{//目标页面String url ="http://www.yshjava.cn";//使用Jsoup连接目标页面,并执行请求,获取服务器响应内容String html =Jsoup.connect(url).execute().body();//打印页面内容System.out.println(html);}}
  单位
  htmlunit 是一个开源的java 页面分析工具。阅读完页面后,您可以有效地使用 htmlunit 来分析页面上的内容。该项目可以模拟浏览器操作,被称为java浏览器的开源实现。这个没有界面的浏览器也非常快。使用 Rhinojs 引擎。模拟js操作。
  网页获取和解析速度更快,性能更好。推荐用于需要解析网页脚本的应用场景。
  示例代码如下:
  package cn.ysh.studio.crawler.htmlunit;import com.gargoylesoftware.htmlunit.BrowserVersion;import com.gargoylesoftware.htmlunit.Page;import com.gargoylesoftware.htmlunit.WebClient;/**
* 基于HtmlUnit抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHtmlUnitSpider{publicstaticvoid main(String[] s)throwsException{//目标网页String url ="http://www.yshjava.cn";//模拟特定浏览器FIREFOX_3WebClient spider =newWebClient(BrowserVersion.FIREFOX_3);//获取目标网页Page page = spider.getPage(url);//打印网页内容System.out.println(page.getWebResponse().getContentAsString());//关闭所有窗口
spider.closeAllWindows();}}
  瓦蒂
  Watij(读作 wattage)是一种使用 Java 开发的 Web 应用程序测试工具。鉴于 Watij 的简单性和 Java 语言的强大功能,Watij 可以让您在真实浏览器中完成 Web 应用程序的自动化测试。因为调用了本地浏览器,所以支持CSS渲染和JS执行。
  网页抓取速度一般,IE版本过低(6/7)可能导致内存泄漏。
  示例代码如下:
  package cn.ysh.studio.crawler.ie;import watij.runtime.ie.IE;/**
* 基于Watij抓取网页内容,仅限Windows平台
*
* @author www.yshjava.cn
*/publicclassWatijTest{publicstaticvoid main(String[] s){//目标页面String url ="http://www.yshjava.cn";//实例化IE浏览器对象
IE ie =new IE();try{//启动浏览器
ie.start();//转到目标网页
ie.goTo(url);//等待网页加载就绪
ie.waitUntilReady();//打印页面内容System.out.println(ie.html());}catch(Exception e){
e.printStackTrace();}finally{try{//关闭IE浏览器
ie.close();}catch(Exception e){}}}}
  硒
  Selenium 也是 Web 应用程序测试的工具。Selenium 测试直接在浏览器中运行,就像真正的用户在操作一样。支持的浏览器包括 IE、Mozilla Firefox、Mozilla Suite 等。该工具的主要功能包括: 测试浏览器兼容性——测试您的应用程序,看看它是否能在不同的浏览器和操作系统上运行良好。测试系统功能——创建回归测试以验证软件功能和用户需求。支持自动录制动作和自动生成。测试Net、Java、Perl等不同语言的脚本。Selenium是ThoughtWorks专门为web应用编写的验收测试工具。
  网页抓取速度较慢,对于爬虫来说不是一个好的选择。
  示例代码如下:
  package cn.ysh.studio.crawler.selenium;import org.openqa.selenium.htmlunit.HtmlUnitDriver;/**
* 基于HtmlDriver抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHtmlDriverTest{publicstaticvoid main(String[] s){//目标网页String url ="http://www.yshjava.cn";HtmlUnitDriver driver =newHtmlUnitDriver();try{//禁用JS脚本功能
driver.setJavascriptEnabled(false);//打开目标网页
driver.get(url);//获取当前网页源码String html = driver.getPageSource();//打印网页源码System.out.println(html);}catch(Exception e){//打印堆栈信息
e.printStackTrace();}finally{try{//关闭并退出
driver.close();
driver.quit();}catch(Exception e){}}}}
  网络规范
  具有支持脚本执行和 CSS 渲染的接口的开源 Java 浏览器。速度是平均的。
  示例代码如下:
  package cn.ysh.studio.crawler.webspec;import org.watij.webspec.dsl.WebSpec;/**
* 基于WebSpec抓取网页内容
*
* @author www.yshjava.cn
*/publicclassWebspecTest{publicstaticvoid main(String[] s){//目标网页String url ="http://www.yshjava.cn";//实例化浏览器对象WebSpec spec =newWebSpec().mozilla();//隐藏浏览器窗体
spec.hide();//打开目标页面
spec.open(url);//打印网页源码System.out.println(spec.source());//关闭所有窗口
spec.closeAll();}} 查看全部

  htmlunit 抓取网页(网页获取和解析速度和性能的应用场景详解!
)
  (4)支持代理服务器
  (5) 支持自动cookies管理等。
  Java爬虫开发中应用最广泛的网页获取技术之一。它具有一流的速度和性能。它在功能支持方面相对较低。不支持JS脚本执行、CSS解析、渲染等准浏览器功能。推荐给需要快速获取网页的用户。无需解析脚本和 CSS 场景。
  示例代码如下:
  package cn.ysh.studio.crawler.httpclient;import org.apache.http.client.HttpClient;import org.apache.http.client.ResponseHandler;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.BasicResponseHandler;import org.apache.http.impl.client.DefaultHttpClient;/**
* 基于HtmlClient抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHttpClientTest{publicstaticvoid main(String[] args)throwsException{//目标页面String url ="http://www.yshjava.cn";//创建一个默认的HttpClientHttpClient httpclient =newDefaultHttpClient();try{//以get方式请求网页http://www.yshjava.cnHttpGet httpget =newHttpGet(url);//打印请求地址System.out.println("executing request "+ httpget.getURI());//创建响应处理器处理服务器响应内容ResponseHandlerresponseHandler=newBasicResponseHandler();//执行请求并获取结果String responseBody = httpclient.execute(httpget, responseHandler);System.out.println("----------------------------------------");System.out.println(responseBody);System.out.println("----------------------------------------");}finally{//关闭连接管理器
httpclient.getConnectionManager().shutdown();}}}
  汤
  jsoup 是一个 Java HTML 解析器,可以直接解析 URL 地址和 HTML 文本内容。它提供了一个非常省力的API,可以通过DOM、CSS和类似jQuery的操作方法来检索和操作数据。
  网页获取和分析速度非常快,推荐使用。
  主要功能如下:
  1. 从 URL、文件或字符串解析 HTML;
  2. 使用 DOM 或 CSS 选择器来查找和检索数据;
  3. 可操作的 HTML 元素、属性和文本;
  示例代码如下:
  package cn.ysh.studio.crawler.jsoup;import java.io.IOException;import org.jsoup.Jsoup;/**
* 基于Jsoup抓取网页内容
* @author www.yshjava.cn
*/publicclassJsoupTest{publicstaticvoid main(String[] args)throwsIOException{//目标页面String url ="http://www.yshjava.cn";//使用Jsoup连接目标页面,并执行请求,获取服务器响应内容String html =Jsoup.connect(url).execute().body();//打印页面内容System.out.println(html);}}
  单位
  htmlunit 是一个开源的java 页面分析工具。阅读完页面后,您可以有效地使用 htmlunit 来分析页面上的内容。该项目可以模拟浏览器操作,被称为java浏览器的开源实现。这个没有界面的浏览器也非常快。使用 Rhinojs 引擎。模拟js操作。
  网页获取和解析速度更快,性能更好。推荐用于需要解析网页脚本的应用场景。
  示例代码如下:
  package cn.ysh.studio.crawler.htmlunit;import com.gargoylesoftware.htmlunit.BrowserVersion;import com.gargoylesoftware.htmlunit.Page;import com.gargoylesoftware.htmlunit.WebClient;/**
* 基于HtmlUnit抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHtmlUnitSpider{publicstaticvoid main(String[] s)throwsException{//目标网页String url ="http://www.yshjava.cn";//模拟特定浏览器FIREFOX_3WebClient spider =newWebClient(BrowserVersion.FIREFOX_3);//获取目标网页Page page = spider.getPage(url);//打印网页内容System.out.println(page.getWebResponse().getContentAsString());//关闭所有窗口
spider.closeAllWindows();}}
  瓦蒂
  Watij(读作 wattage)是一种使用 Java 开发的 Web 应用程序测试工具。鉴于 Watij 的简单性和 Java 语言的强大功能,Watij 可以让您在真实浏览器中完成 Web 应用程序的自动化测试。因为调用了本地浏览器,所以支持CSS渲染和JS执行。
  网页抓取速度一般,IE版本过低(6/7)可能导致内存泄漏。
  示例代码如下:
  package cn.ysh.studio.crawler.ie;import watij.runtime.ie.IE;/**
* 基于Watij抓取网页内容,仅限Windows平台
*
* @author www.yshjava.cn
*/publicclassWatijTest{publicstaticvoid main(String[] s){//目标页面String url ="http://www.yshjava.cn";//实例化IE浏览器对象
IE ie =new IE();try{//启动浏览器
ie.start();//转到目标网页
ie.goTo(url);//等待网页加载就绪
ie.waitUntilReady();//打印页面内容System.out.println(ie.html());}catch(Exception e){
e.printStackTrace();}finally{try{//关闭IE浏览器
ie.close();}catch(Exception e){}}}}
  硒
  Selenium 也是 Web 应用程序测试的工具。Selenium 测试直接在浏览器中运行,就像真正的用户在操作一样。支持的浏览器包括 IE、Mozilla Firefox、Mozilla Suite 等。该工具的主要功能包括: 测试浏览器兼容性——测试您的应用程序,看看它是否能在不同的浏览器和操作系统上运行良好。测试系统功能——创建回归测试以验证软件功能和用户需求。支持自动录制动作和自动生成。测试Net、Java、Perl等不同语言的脚本。Selenium是ThoughtWorks专门为web应用编写的验收测试工具。
  网页抓取速度较慢,对于爬虫来说不是一个好的选择。
  示例代码如下:
  package cn.ysh.studio.crawler.selenium;import org.openqa.selenium.htmlunit.HtmlUnitDriver;/**
* 基于HtmlDriver抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHtmlDriverTest{publicstaticvoid main(String[] s){//目标网页String url ="http://www.yshjava.cn";HtmlUnitDriver driver =newHtmlUnitDriver();try{//禁用JS脚本功能
driver.setJavascriptEnabled(false);//打开目标网页
driver.get(url);//获取当前网页源码String html = driver.getPageSource();//打印网页源码System.out.println(html);}catch(Exception e){//打印堆栈信息
e.printStackTrace();}finally{try{//关闭并退出
driver.close();
driver.quit();}catch(Exception e){}}}}
  网络规范
  具有支持脚本执行和 CSS 渲染的接口的开源 Java 浏览器。速度是平均的。
  示例代码如下:
  package cn.ysh.studio.crawler.webspec;import org.watij.webspec.dsl.WebSpec;/**
* 基于WebSpec抓取网页内容
*
* @author www.yshjava.cn
*/publicclassWebspecTest{publicstaticvoid main(String[] s){//目标网页String url ="http://www.yshjava.cn";//实例化浏览器对象WebSpec spec =newWebSpec().mozilla();//隐藏浏览器窗体
spec.hide();//打开目标页面
spec.open(url);//打印网页源码System.out.println(spec.source());//关闭所有窗口
spec.closeAll();}}

htmlunit 抓取网页(htmlunit网络工具一个没有没有 )

网站优化优采云 发表了文章 • 0 个评论 • 69 次浏览 • 2021-11-10 22:05 • 来自相关话题

  htmlunit 抓取网页(htmlunit网络工具一个没有没有
)
  1:背景
  本来想用jsoup抓取一个页面,但是我抓取的数据总是不完整,然后发现页面用js执行后,有些数据渲染在页面上,也就是说,只在执行js后的数据页上。数据会显示出来,但是jsoup无法实现执行页面的js。
  2:解决
  搜索后发现htmlunit网络工具可以执行js,相当于没有页面的浏览器。解决办法是先用htmlUnit发送网络请求,执行js获取页面,然后用jsoup转换成Document页面对象。然后用jsoup分析页面读取数据。
  3: htmlUnit 发送请求
   1 public static Document getDocument() throws IOException, InterruptedException{
2 /*String url="https://www.marklines.com/cn/v ... 3B%3B
3 Connection connect = Jsoup.connect(url).userAgent("")
4 .header("Cookie", "PLAY_LANG=cn; _plh=b9289d0a863a8fc9c79fb938f15372f7731d13fb; PLATFORM_SESSION=39034d07000717c664134556ad39869771aabc04-_ldi=520275&_lsh=8cf91cdbcbbb255adff5cba6061f561b642f5157&csrfToken=209f20c8473bc0518413c226f898ff79cd69c3ff-1539926671235-b853a6a63c77dd8fcc364a58&_lpt=%2Fcn%2Fvehicle_sales%2Fsearch&_lsi=1646321; _ga=GA1.2.2146952143.1539926675; _gid=GA1.2.1032787565.1539926675; _plh_notime=8cf91cdbcbbb255adff5cba6061f561b642f5157")
5 .timeout(360000000);
6 Document document = connect.get();*/
7 WebClient wc = new WebClient(BrowserVersion.CHROME);
8 //是否使用不安全的SSL
9 wc.getOptions().setUseInsecureSSL(true);
10 //启用JS解释器,默认为true
11 wc.getOptions().setJavaScriptEnabled(true);
12 //禁用CSS
13 wc.getOptions().setCssEnabled(false);
14 //js运行错误时,是否抛出异常
15 wc.getOptions().setThrowExceptionOnScriptError(false);
16 //状态码错误时,是否抛出异常
17 wc.getOptions().setThrowExceptionOnFailingStatusCode(false);
18 //是否允许使用ActiveX
19 wc.getOptions().setActiveXNative(false);
20 //等待js时间
21 wc.waitForBackgroundJavaScript(600*1000);
22 //设置Ajax异步处理控制器即启用Ajax支持
23 wc.setAjaxController(new NicelyResynchronizingAjaxController());
24 //设置超时时间
25 wc.getOptions().setTimeout(1000000);
26 //不跟踪抓取
27 wc.getOptions().setDoNotTrackEnabled(false);
28 WebRequest request=new WebRequest(new URL("https://www.marklines.com/cn/v ... 6quot;));
29 request.setAdditionalHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0");
30 request.setAdditionalHeader("Cookie","PLAY_LANG=cn; _plh=b9289d0a863a8fc9c79fb938f15372f7731d13fb; PLATFORM_SESSION=39034d07000717c664134556ad39869771aabc04-_ldi=520275&_lsh=8cf91cdbcbbb255adff5cba6061f561b642f5157&csrfToken=209f20c8473bc0518413c226f898ff79cd69c3ff-1539926671235-b853a6a63c77dd8fcc364a58&_lpt=%2Fcn%2Fvehicle_sales%2Fsearch&_lsi=1646321; _ga=GA1.2.2146952143.1539926675; _gid=GA1.2.1032787565.1539926675; _plh_notime=8cf91cdbcbbb255adff5cba6061f561b642f5157");
31 try {
32 //模拟浏览器打开一个目标网址
33 HtmlPage htmlPage = wc.getPage(request);
34 //为了获取js执行的数据 线程开始沉睡等待
35 Thread.sleep(1000);//这个线程的等待 因为js加载需要时间的
36 //以xml形式获取响应文本
37 String xml = htmlPage.asXml();
38 //并转为Document对象return
39 return Jsoup.parse(xml);
40 //System.out.println(xml.contains("结果.xls"));//false
41 } catch (FailingHttpStatusCodeException e) {
42 e.printStackTrace();
43 } catch (MalformedURLException e) {
44 e.printStackTrace();
45 } catch (IOException e) {
46 e.printStackTrace();
47 }
48 return null;
49 }
  4:返回的Document对象交给jsoup处理
  我这里只做了一个简单的输出,我检查了数据是否全部渲染完毕。
   1 Document doc=getDocument();
2 Element table=doc.select("table.table.table-bordered.aggregate_table").get(0);//获取到表格
3 Element tableContext=table.getElementsByTag("tbody").get(0);
4 Elements contextTrs=tableContext.getElementsByTag("tr");
5 System.out.println(contextTrs.size());
6
7
8 String context=doc.toString();
9 OutputStreamWriter pw = null;
10 pw = new OutputStreamWriter(new FileOutputStream("D:/test.txt"),"GBK");
11 pw.write(context);
12 pw.close(); 查看全部

  htmlunit 抓取网页(htmlunit网络工具一个没有没有
)
  1:背景
  本来想用jsoup抓取一个页面,但是我抓取的数据总是不完整,然后发现页面用js执行后,有些数据渲染在页面上,也就是说,只在执行js后的数据页上。数据会显示出来,但是jsoup无法实现执行页面的js。
  2:解决
  搜索后发现htmlunit网络工具可以执行js,相当于没有页面的浏览器。解决办法是先用htmlUnit发送网络请求,执行js获取页面,然后用jsoup转换成Document页面对象。然后用jsoup分析页面读取数据。
  3: htmlUnit 发送请求
   1 public static Document getDocument() throws IOException, InterruptedException{
2 /*String url="https://www.marklines.com/cn/v ... 3B%3B
3 Connection connect = Jsoup.connect(url).userAgent("")
4 .header("Cookie", "PLAY_LANG=cn; _plh=b9289d0a863a8fc9c79fb938f15372f7731d13fb; PLATFORM_SESSION=39034d07000717c664134556ad39869771aabc04-_ldi=520275&_lsh=8cf91cdbcbbb255adff5cba6061f561b642f5157&csrfToken=209f20c8473bc0518413c226f898ff79cd69c3ff-1539926671235-b853a6a63c77dd8fcc364a58&_lpt=%2Fcn%2Fvehicle_sales%2Fsearch&_lsi=1646321; _ga=GA1.2.2146952143.1539926675; _gid=GA1.2.1032787565.1539926675; _plh_notime=8cf91cdbcbbb255adff5cba6061f561b642f5157")
5 .timeout(360000000);
6 Document document = connect.get();*/
7 WebClient wc = new WebClient(BrowserVersion.CHROME);
8 //是否使用不安全的SSL
9 wc.getOptions().setUseInsecureSSL(true);
10 //启用JS解释器,默认为true
11 wc.getOptions().setJavaScriptEnabled(true);
12 //禁用CSS
13 wc.getOptions().setCssEnabled(false);
14 //js运行错误时,是否抛出异常
15 wc.getOptions().setThrowExceptionOnScriptError(false);
16 //状态码错误时,是否抛出异常
17 wc.getOptions().setThrowExceptionOnFailingStatusCode(false);
18 //是否允许使用ActiveX
19 wc.getOptions().setActiveXNative(false);
20 //等待js时间
21 wc.waitForBackgroundJavaScript(600*1000);
22 //设置Ajax异步处理控制器即启用Ajax支持
23 wc.setAjaxController(new NicelyResynchronizingAjaxController());
24 //设置超时时间
25 wc.getOptions().setTimeout(1000000);
26 //不跟踪抓取
27 wc.getOptions().setDoNotTrackEnabled(false);
28 WebRequest request=new WebRequest(new URL("https://www.marklines.com/cn/v ... 6quot;));
29 request.setAdditionalHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0");
30 request.setAdditionalHeader("Cookie","PLAY_LANG=cn; _plh=b9289d0a863a8fc9c79fb938f15372f7731d13fb; PLATFORM_SESSION=39034d07000717c664134556ad39869771aabc04-_ldi=520275&_lsh=8cf91cdbcbbb255adff5cba6061f561b642f5157&csrfToken=209f20c8473bc0518413c226f898ff79cd69c3ff-1539926671235-b853a6a63c77dd8fcc364a58&_lpt=%2Fcn%2Fvehicle_sales%2Fsearch&_lsi=1646321; _ga=GA1.2.2146952143.1539926675; _gid=GA1.2.1032787565.1539926675; _plh_notime=8cf91cdbcbbb255adff5cba6061f561b642f5157");
31 try {
32 //模拟浏览器打开一个目标网址
33 HtmlPage htmlPage = wc.getPage(request);
34 //为了获取js执行的数据 线程开始沉睡等待
35 Thread.sleep(1000);//这个线程的等待 因为js加载需要时间的
36 //以xml形式获取响应文本
37 String xml = htmlPage.asXml();
38 //并转为Document对象return
39 return Jsoup.parse(xml);
40 //System.out.println(xml.contains("结果.xls"));//false
41 } catch (FailingHttpStatusCodeException e) {
42 e.printStackTrace();
43 } catch (MalformedURLException e) {
44 e.printStackTrace();
45 } catch (IOException e) {
46 e.printStackTrace();
47 }
48 return null;
49 }
  4:返回的Document对象交给jsoup处理
  我这里只做了一个简单的输出,我检查了数据是否全部渲染完毕。
   1 Document doc=getDocument();
2 Element table=doc.select("table.table.table-bordered.aggregate_table").get(0);//获取到表格
3 Element tableContext=table.getElementsByTag("tbody").get(0);
4 Elements contextTrs=tableContext.getElementsByTag("tr");
5 System.out.println(contextTrs.size());
6
7
8 String context=doc.toString();
9 OutputStreamWriter pw = null;
10 pw = new OutputStreamWriter(new FileOutputStream("D:/test.txt"),"GBK");
11 pw.write(context);
12 pw.close();

htmlunit 抓取网页(搜索索引可以作为数据挖掘的输入信息,后面才发现错了)

网站优化优采云 发表了文章 • 0 个评论 • 73 次浏览 • 2021-11-10 05:17 • 来自相关话题

  htmlunit 抓取网页(搜索索引可以作为数据挖掘的输入信息,后面才发现错了)
  由于一开始的理解错误,本以为搜索索引可以作为数据挖掘的输入信息,后来发现不对。solr/nutch/lucene形成的搜索索引只是一个搜索索引。只要用户提供查询关键字,就可以找到关键字。单词来自哪个文档并不是文档的文本列表信息,而是挖掘需要整个文档的文本列表(文件中所有单词的集合)才能挖掘出相关信息。
  详细看下Nutch抓取数据后的文件:
  Nutch的输出文件可以分为crawldb、index、index、linkdb和segments。
  Crawldb是所有需要爬取的超链接信息
  (另外:存储下载地址,以及下载日期,用于查看页面更新时间)
  Linkdb 中存储的是所有超链接以及每个链接的链接地址和锚文本。
  Segments:存放抓取到的页面的页面,与上面链接的深度有关。如果深度设置为2,则在segments下会生成两个以时间命名的子文件夹,例如“201”。每轮爬取时,根据 crawldb 生成 Segments。存储的信息包括6种内容,crawl_fetch、crawl_generate、crawl_parse、parse_data和parse_text。内容为抓取到的网页内容;crawl_generate 最初生成(要下载的 URL 集合);crawl_fetch(每个下载地址的状态),爬取时生成的内容;crawl_parse(包括用于更新crawldb的外部链接)、parse_data、Parse_text是在解析捕获的数据文件时生成的。其中crawl_generate、crawl_fetch和crawl_parse是crawldb的url数据的一部分。
  indexs:存储每次下载的独立索引目录。这个可以通过Crawldb、Linkdb和segments合成:bin/nutch index crawl/indexscrawl/crawldb crawl/linkdb crawl/segments/*
  index:索引合并,存储索引信息。(Nutch的索引中没有存储内容,内容是存储在segment中的,所以直接用Lucene读取Nutch生成的索引会出现问题。Lucene中的segment与Nutch中的segment不同。 Lucene中的segments是索引的一部分,而Nutch中的segment只是WebDB中网页各个部分的内容和索引,它生成的索引与这些segment无关。)
  因为挖掘的不是索引文件,而是文档的解析词列表,所以我们关心的是nutch是如何解析网页的。通常,网络爬虫在抓取网页时会解析网页的内容,并将内容下载到本地存储。如果网页可以解析,自然解析pdf文档就不是问题了。Nutch 对富文本的分析是插件的形式,所以只需要在配置文件中添加这个选项。关键问题是如何提取解析后的文本?由于segment下的所有文件都是二进制文件,我们不知道如何将它们转换为可见的文本字符。Nutch 提供了导出捕获数据以供查看的命令。比如为了获取linkdb中的内容,我们可以
  使用bin/nutch readlinkdb crawl/linkdb/ -dump linkdb(导出地址),然后会在linkdb文件夹中看到part-00000,然后就可以用文本方式打开了。关键是我们要的是parse_data和parse_text,把segment数据整体导出,bin/nutchreadseg -dump crawl/segments/201segdb导出segment,其中crawl/segments/201是segment文件夹,segdb是转换后存储 文件夹的内容,这样查看时,收录了segments文件夹下的所有文件信息。在网上找了半天,没有找到可以直接操作解析文件的命令。有知道的请告诉我!或者如何使用它来解析文件信息。如果您之前使用过,请留言咨询!
  在readseg命令之后,添加一个可选参数命令,-nocontent,这样就不会导出内容,-noparsedata,这样就不会导出parse_data。这样的命令后只能导出parse_text,即解析后的文本,比如网页内容,里面收录label元素,parse_text,去除网页格式的文本信息
  参考资料:
  1.
  2.
  3.
  4. 查看全部

  htmlunit 抓取网页(搜索索引可以作为数据挖掘的输入信息,后面才发现错了)
  由于一开始的理解错误,本以为搜索索引可以作为数据挖掘的输入信息,后来发现不对。solr/nutch/lucene形成的搜索索引只是一个搜索索引。只要用户提供查询关键字,就可以找到关键字。单词来自哪个文档并不是文档的文本列表信息,而是挖掘需要整个文档的文本列表(文件中所有单词的集合)才能挖掘出相关信息。
  详细看下Nutch抓取数据后的文件:
  Nutch的输出文件可以分为crawldb、index、index、linkdb和segments。
  Crawldb是所有需要爬取的超链接信息
  (另外:存储下载地址,以及下载日期,用于查看页面更新时间)
  Linkdb 中存储的是所有超链接以及每个链接的链接地址和锚文本。
  Segments:存放抓取到的页面的页面,与上面链接的深度有关。如果深度设置为2,则在segments下会生成两个以时间命名的子文件夹,例如“201”。每轮爬取时,根据 crawldb 生成 Segments。存储的信息包括6种内容,crawl_fetch、crawl_generate、crawl_parse、parse_data和parse_text。内容为抓取到的网页内容;crawl_generate 最初生成(要下载的 URL 集合);crawl_fetch(每个下载地址的状态),爬取时生成的内容;crawl_parse(包括用于更新crawldb的外部链接)、parse_data、Parse_text是在解析捕获的数据文件时生成的。其中crawl_generate、crawl_fetch和crawl_parse是crawldb的url数据的一部分。
  indexs:存储每次下载的独立索引目录。这个可以通过Crawldb、Linkdb和segments合成:bin/nutch index crawl/indexscrawl/crawldb crawl/linkdb crawl/segments/*
  index:索引合并,存储索引信息。(Nutch的索引中没有存储内容,内容是存储在segment中的,所以直接用Lucene读取Nutch生成的索引会出现问题。Lucene中的segment与Nutch中的segment不同。 Lucene中的segments是索引的一部分,而Nutch中的segment只是WebDB中网页各个部分的内容和索引,它生成的索引与这些segment无关。)
  因为挖掘的不是索引文件,而是文档的解析词列表,所以我们关心的是nutch是如何解析网页的。通常,网络爬虫在抓取网页时会解析网页的内容,并将内容下载到本地存储。如果网页可以解析,自然解析pdf文档就不是问题了。Nutch 对富文本的分析是插件的形式,所以只需要在配置文件中添加这个选项。关键问题是如何提取解析后的文本?由于segment下的所有文件都是二进制文件,我们不知道如何将它们转换为可见的文本字符。Nutch 提供了导出捕获数据以供查看的命令。比如为了获取linkdb中的内容,我们可以
  使用bin/nutch readlinkdb crawl/linkdb/ -dump linkdb(导出地址),然后会在linkdb文件夹中看到part-00000,然后就可以用文本方式打开了。关键是我们要的是parse_data和parse_text,把segment数据整体导出,bin/nutchreadseg -dump crawl/segments/201segdb导出segment,其中crawl/segments/201是segment文件夹,segdb是转换后存储 文件夹的内容,这样查看时,收录了segments文件夹下的所有文件信息。在网上找了半天,没有找到可以直接操作解析文件的命令。有知道的请告诉我!或者如何使用它来解析文件信息。如果您之前使用过,请留言咨询!
  在readseg命令之后,添加一个可选参数命令,-nocontent,这样就不会导出内容,-noparsedata,这样就不会导出parse_data。这样的命令后只能导出parse_text,即解析后的文本,比如网页内容,里面收录label元素,parse_text,去除网页格式的文本信息
  参考资料:
  1.
  2.
  3.
  4.

htmlunit 抓取网页(网站服务器防火墙直接拒绝访问网站防火墙模拟下浏览器)

网站优化优采云 发表了文章 • 0 个评论 • 66 次浏览 • 2021-11-07 20:16 • 来自相关话题

  htmlunit 抓取网页(网站服务器防火墙直接拒绝访问网站防火墙模拟下浏览器)
  我们上面的测试代码是直接请求的,部分网站服务器防火墙会直接拒绝访问。
  我们现在使用 htmlunit 来模拟浏览器请求;主要是添加一些header消息;
  
  这是我们用谷歌调试工具看到的请求头中的属性,当然也有返回的头信息;
  我们可以使用htmlunit来模拟浏览器执行,内置可以模拟IE、Firefox、Google;
  WebClient构造方法中有一个重载方法,可以添加指定的版本属性;
  
  完整代码:
  package com.hbk.htmlunit;
import java.io.IOException;
import java.net.MalformedURLException;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
/**
*
* @author 黄宝康
*获取http://www.3dns.com.cn的源代码
*/
public class HtmlUnitTest
{
public static void main( String[] args )
{
WebClient webClient = new WebClient(BrowserVersion.FIREFOX_45); // 实例化Web客户端
try {
HtmlPage page = webClient.getPage("http://www.3dns.com.cn/");
System.out.println("网页html:"+page.asXml());// 获取html
System.out.println("======================");
System.out.println("网页文本:"+page.asText());// 获取文本
} catch (FailingHttpStatusCodeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
webClient.close(); // 关闭客户端,释放内存
}
}
}
  效果是一样的。 查看全部

  htmlunit 抓取网页(网站服务器防火墙直接拒绝访问网站防火墙模拟下浏览器)
  我们上面的测试代码是直接请求的,部分网站服务器防火墙会直接拒绝访问。
  我们现在使用 htmlunit 来模拟浏览器请求;主要是添加一些header消息;
  
  这是我们用谷歌调试工具看到的请求头中的属性,当然也有返回的头信息;
  我们可以使用htmlunit来模拟浏览器执行,内置可以模拟IE、Firefox、Google;
  WebClient构造方法中有一个重载方法,可以添加指定的版本属性;
  
  完整代码:
  package com.hbk.htmlunit;
import java.io.IOException;
import java.net.MalformedURLException;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
/**
*
* @author 黄宝康
*获取http://www.3dns.com.cn的源代码
*/
public class HtmlUnitTest
{
public static void main( String[] args )
{
WebClient webClient = new WebClient(BrowserVersion.FIREFOX_45); // 实例化Web客户端
try {
HtmlPage page = webClient.getPage("http://www.3dns.com.cn/";);
System.out.println("网页html:"+page.asXml());// 获取html
System.out.println("======================");
System.out.println("网页文本:"+page.asText());// 获取文本
} catch (FailingHttpStatusCodeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
webClient.close(); // 关闭客户端,释放内存
}
}
}
  效果是一样的。

htmlunit 抓取网页(Larbin开发语言:Java简介:Apache的子项目之一)

网站优化优采云 发表了文章 • 0 个评论 • 56 次浏览 • 2021-11-06 19:39 • 来自相关话题

  htmlunit 抓取网页(Larbin开发语言:Java简介:Apache的子项目之一)
  拉宾
  开发语言:C++
  Larbin 是一个基于 C++ 的网络爬虫工具,界面易于操作,但只能在 LINUX 下运行。Larbin在普通PC下每天可以抓取500万个页面(当然,你需要有良好的网络)
  介绍
  Larbin 是一个开源的网络爬虫/网络蜘蛛,由法国年轻人 Sébastien Ailleret 独立开发。larbin 的目的是能够跟踪页面的 URL 进行扩展抓取,最终为搜索引擎提供广泛的数据源。
  larbin只是一个爬虫,也就是说larbin只爬网页,如何解析是用户自己做的。此外,larbin 没有提供有关如何将其存储在数据库中和构建索引的信息。
  Latbin 最初的设计也是基于简单设计但高度可配置的原则。因此,我们可以看到一个简单的larbin爬虫每天可以获取500万个网页,非常高效。
  功能
  1. larbin 获取一个,确认网站的所有链接,甚至镜像一个网站。
  2. larbin建立一个url列表组,比如url检索所有网页后,得到xml的链接。或者mp3。
  3. larbin 定制后可以作为搜索引擎信息的来源(比如每2000组爬取的网页可以存储在一系列的目录结构中)。
  问题
  Labin的主要问题是:
  只提供保存网页的功能,不做进一步的网页分析;
  不支持分布式系统;
  功能比较简单,提供的配置项不够;
  不支持网页自动重访和更新功能;
  从2003年底开始,Labin就放弃了更新,目前处于荒草丛生的状态。
  **********
  纳奇
  开发语言:Java
  介绍:
  Apache的子项目之一是Lucene项目下的子项目。
  Nutch 是一个完整的网络搜索引擎解决方案,基于 Lucene,类似于 Google。基于Hadoop的分布式处理模型保证了系统的性能。类似Eclipse的插件机制保证了系统可以定制,并且很容易集成到自己的应用程序中。之中。
  一般来说,Nutch 可以分为两个部分:爬行部分和搜索部分。爬行程序对页面进行爬行,将检索到的数据制成倒排索引,搜索程序响应用户的倒排索引搜索请求。爬虫和搜索器的接口是索引,都使用索引中的字段。抓取程序和搜索程序可以位于不同的机器上。下面是爬取部分的详细介绍。
  爬行部分:
  履带由Nutch的履带驱动。这是一组用于创建和维护几种不同数据结构的工具:Web 数据库、一组段和索引。下面对这三种不同的数据结构进行一一说明:
  1、Web 数据库或 WebDB。这是一种特殊的存储数据结构,用于映射捕获的网站数据的结构和属性集合。WebDB用于存储从爬行开始(包括重新爬行)开始的所有网站结构数据和属性。WebDB 仅供爬虫程序使用,搜索程序不使用。WebDB 存储两种实体:页面和链接。该页面代表 Internet 上的一个网页。将这个网页的URL作为一个标记编入索引,同时创建了该网页内容的MD5哈希签名。与网页相关的其他内容也被存储,包括:页面中的链接数(外部链接)、页面爬取信息(在页面被重复爬取的情况下)、以及表示页面级别的分数。链接代表从一个网页到其他网页的链接。因此,WebDB 可以说是一个网络图,以节点为页面,以链接为边。
  2、段。这是网页的集合,并已编入索引。Segment 的 Fetchlist 是爬虫使用的 URL 列表,由 WebDB 生成。Fetcher 的输出数据是从 fetchlist 中取出的网页。Fetcher的输出数据先进行反向索引,然后将索引结果存入segment中。一个segment的生命周期是有限的,下一轮爬行开始的时候就没用了。默认重新爬网间隔为 30 天。因此,可以删除超过此时间限制的段。并且可以节省大量磁盘空间。Segment 以日期和时间命名,因此可以非常直观地查看其生命周期。
  3、索引。索引库是系统中所有爬取到的页面的反向索引。它不是直接从页面反向索引生成的,而是由许多小段索引合并生成的。Nutch 使用 Lucene 来构建索引,因此所有与 Lucene 相关的工具 API 都用于构建索引库。需要说明的是,Lucene的segment概念与Nutch的segment概念完全不同,不要混淆。简单来说,Lucene的segment是Lucene索引库的一部分,而Nutch的segment是被爬取索引的WebDB的一部分。
  爬取过程的详细说明:
  爬取是一个循环过程:爬取工具从WebDB生成一个fetchlist集合;提取工具根据fetchlist从互联网上下载网页内容;工具程序根据提取工具找到的新链接更新WebDB;然后生成一个新的fetchlist;反复。这个 fetch 循环通常在 nutch 中提到:生成/获取/更新循环。
  一般来说,同一个域名下的url链接会被合成到同一个fetchlist中。这样做的考虑是当同时使用多个工具进行抓取时,不会出现重复抓取。Nutch 遵循Robots Exclusion Protocol,可以使用robots.txt 来定义和保护私人网页数据不被捕获。
  以上抓取工具的组合是Nutch的最外层。也可以直接使用底层工具,结合这些底层工具的执行顺序,也可以达到同样的效果。这就是纳奇的魅力所在。下面详细描述上述过程。基础工具的名称在括号中:
  1、创建一个新的 WebDB (admin db -create)。
  2、将开始爬取和Url放入WebDb(注入)。
  3、 从 WebDb 的新段生成 fetchlist(生成)。
  4、 根据fetchlist列表(fetch)获取网页的内容。
  5、根据检索到的网页链接的URL更新WebDB(updatedb)。
  6、重复以上3-5步,直到达到指定的爬行层数。
  7、 使用计算出的 web url 权重分数更新段 (updatesegs)。
  8、 将抓取的网页编入索引。
  9、 消除索引中的重复内容和重复 URL (dedup)。
  10、将多个索引合并为一个大索引,并提供索引库(merge)进行搜索。
  *****************
  赫里特克斯
  开发语言:Java
  Heritrix 是一个开源、可扩展的网络爬虫项目。Heritrix 的设计严​​格遵循 robots.txt 文件和 META 机器人标签的排除说明。
  介绍
  Heritrix 和 Nutch 的比较
  还有纳奇。两者都是 Java 开源框架。Heritrix 是 SourceForge 上的开源产品。Nutch 是 Apache 的一个子项目。他们都被称为网络爬虫。它们的实现原理基本一致:深度遍历网站在本地捕获这些资源,使用的方法是分析每个有效的URI网站,并提交一个Http请求得到相应的结果,生成本地文件和相应的日志信息等。
  Heritrix 是一个“档案爬虫”——用于获取网站内容的完整、准确、深层副本。包括获取图片等非文字内容。抓取并存储相关内容。不拒绝任何内容,不对页面进行任何内容修改。重新抓取不会替换同一 URL 的前一次抓取。通过Web用户界面启动、监控和调整爬虫,可以灵活定义获取URL。
  Nutch和Heritrix的区别:
  Nutch 只获取和保存可索引的内容。Heritrix 接受这一切。力求保留页面的原创外观
  Nutch 可以修剪内容,或转换内容格式。
  Nutch 以数据库优化的格式保存内容以备将来索引;刷新并替换旧内容。而 Heritrix 正在添加(追加)新的内容。
  Nutch 是从命令行运行和控制的。Heritrix 有一个网页控制管理界面。
  Nutch 的定制能力还不够强大,但现在已经改进了。Heritrix 可以控制更多的参数。
  Heritrix 提供的功能没有 nutch 多,感觉就像从整个站点下载一样。既没有索引也没有解析,即使是重复爬取网址也不是很好。
  Heritrix 功能强大但配置起来有点麻烦。
  ************************
  三者的比较
  一、 在功能上,Heritrix 和 Larbin 的功能类似。两者都是纯网络爬虫,提供网站的镜像下载。Nutch 是一个网络搜索引擎框架,抓取网页只是它的一部分功能。
  二、 在分布式处理方面,Nutch 支持分布式处理,而另外两个好像还没有支持。
  三、 从抓取的网页存储方式来看,Heritrix和Larbin都将抓取的内容保存为原创内容类型。并且 Nutch 将内容保存到其特定的格式段。
  第四,对于爬取内容的处理,Heritrix和Larbin都将爬取的内容直接保存为原创内容,不做任何处理。Nutch 处理文本包括链接分析、文本提取和索引(Lucene 索引)。
  第五,在爬取效率方面,Larbin的效率更高,因为它是用C++实现的,功能单一。
  爬虫
  发展
  语
  功能
  单身的
  支持分布式
  爬行
  高效的
  镜像
  节省
  纳奇
  爪哇
  X
  √
  低的
  X
  拉宾
  C++
  √
  X
  高的
  √
  赫里特克斯
  爪哇
  √
  X
  中间
  √
  -------------------------------------------------- ---------
  其他一些开源爬虫的总结:
  网络SPHINX
  WebSPHINX 是 Java 类包和网络爬虫的交互式开发环境。网络爬虫(也称为机器人或蜘蛛)是可以自动浏览和处理网页的程序。WebSPHINX由两部分组成:爬虫工作平台和WebSPHINX包。
  ~rcm/websphinx/
  网络学习
  WebLech 是一个强大的网站下载和镜像工具。支持根据功能需求下载网站,并尽可能模仿标准网页浏览器的行为。WebLech 有功能控制台,使用多线程操作。
  阿拉蕾
  Arale 主要是为个人使用而设计的,不像其他爬虫那样专注于页面索引。Arale 可以下载整个网站或网站上的部分资源。Arale 还可以将动态页面映射到静态页面。
  J-蜘蛛
  J-Spider:是一个完全可配置和可定制的 Web Spider 引擎。可以用它来检查网站错误(内部服务器错误等),网站内外链接检查,分析网站的结构(可以创建一个网站@ &gt; map),下载整个网站,也可以写一个JSpider插件扩展你需要的功能。
  主轴
  Spindle 是一个建立在 Lucene 工具包上的 Web 索引/搜索工具。它包括一个用于创建索引的 HTTP 蜘蛛和一个用于搜索这些索引的搜索类。主轴项目提供了一组JSP标签库,让那些基于JSP的站点无需开发任何Java类就可以添加搜索功能。
  蛛形纲动物
  Arachnid:是一个基于 Java 的网络蜘蛛框架。它收录一个简单的 HTML 解析器,可以分析收录 HTML 内容的输入流。通过实现Arachnid子类,可以开发一个简单的网络蜘蛛,可以在每一个网站中使用 解析一个页面后,添加几行代码调用。Arachnid 下载包中收录两个蜘蛛应用程序示例,用于演示如何使用该框架。
  警报器
  LARM 可以为 Jakarta Lucene 搜索引擎框架的用户提供纯 Java 搜索解决方案。它收录索引文件、数据库表和用于索引网站的爬虫的方法。
  乔博
  JoBo 是一个用于下载整个网站的简单工具。它本质上是一个网络蜘蛛。与其他下载工具相比,它的主要优点是能够自动填写表单(如自动登录)和使用cookies来处理会话。JoBo 还具有灵活的下载规则(如:URL、大小、MIME 类型等)来限制下载。
  snoics-爬行动物
  snoics -reptile 是用纯 Java 开发的。它是用于捕获 网站 图像的工具。您可以使用配置文件中提供的 URL 条目来传输所有可以通过浏览器 GET 的 网站。这种方式获取的所有资源都是本地抓取的,包括网页和各类文件,如图片、flash、mp3、zip、rar、exe等文件。整个网站可以完全转移到硬盘上,保持原有的网站结构准确不变。只需将捕获到的网站放入Web服务器(如Apache)即可实现完整的网站镜像。
  网络收获
  Web-Harvest 是一个 Java 开源 Web 数据提取工具。它可以采集指定的网页并从这些网页中提取有用的数据。Web-Harvest主要使用XSLT、XQuery、正则表达式等技术来实现text/xml的操作。
  蜘蛛
  Spiderpy 是一个基于 Python 编码的开源网络爬虫工具,允许用户采集文件和搜索网站,并具有可配置的界面。
  蜘蛛网网络 Xoops Mod 团队
  pider Web Network Xoops Mod 是 Xoops 下的一个模块,完全由 PHP 语言实现。 查看全部

  htmlunit 抓取网页(Larbin开发语言:Java简介:Apache的子项目之一)
  拉宾
  开发语言:C++
  Larbin 是一个基于 C++ 的网络爬虫工具,界面易于操作,但只能在 LINUX 下运行。Larbin在普通PC下每天可以抓取500万个页面(当然,你需要有良好的网络)
  介绍
  Larbin 是一个开源的网络爬虫/网络蜘蛛,由法国年轻人 Sébastien Ailleret 独立开发。larbin 的目的是能够跟踪页面的 URL 进行扩展抓取,最终为搜索引擎提供广泛的数据源。
  larbin只是一个爬虫,也就是说larbin只爬网页,如何解析是用户自己做的。此外,larbin 没有提供有关如何将其存储在数据库中和构建索引的信息。
  Latbin 最初的设计也是基于简单设计但高度可配置的原则。因此,我们可以看到一个简单的larbin爬虫每天可以获取500万个网页,非常高效。
  功能
  1. larbin 获取一个,确认网站的所有链接,甚至镜像一个网站。
  2. larbin建立一个url列表组,比如url检索所有网页后,得到xml的链接。或者mp3。
  3. larbin 定制后可以作为搜索引擎信息的来源(比如每2000组爬取的网页可以存储在一系列的目录结构中)。
  问题
  Labin的主要问题是:
  只提供保存网页的功能,不做进一步的网页分析;
  不支持分布式系统;
  功能比较简单,提供的配置项不够;
  不支持网页自动重访和更新功能;
  从2003年底开始,Labin就放弃了更新,目前处于荒草丛生的状态。
  **********
  纳奇
  开发语言:Java
  介绍:
  Apache的子项目之一是Lucene项目下的子项目。
  Nutch 是一个完整的网络搜索引擎解决方案,基于 Lucene,类似于 Google。基于Hadoop的分布式处理模型保证了系统的性能。类似Eclipse的插件机制保证了系统可以定制,并且很容易集成到自己的应用程序中。之中。
  一般来说,Nutch 可以分为两个部分:爬行部分和搜索部分。爬行程序对页面进行爬行,将检索到的数据制成倒排索引,搜索程序响应用户的倒排索引搜索请求。爬虫和搜索器的接口是索引,都使用索引中的字段。抓取程序和搜索程序可以位于不同的机器上。下面是爬取部分的详细介绍。
  爬行部分:
  履带由Nutch的履带驱动。这是一组用于创建和维护几种不同数据结构的工具:Web 数据库、一组段和索引。下面对这三种不同的数据结构进行一一说明:
  1、Web 数据库或 WebDB。这是一种特殊的存储数据结构,用于映射捕获的网站数据的结构和属性集合。WebDB用于存储从爬行开始(包括重新爬行)开始的所有网站结构数据和属性。WebDB 仅供爬虫程序使用,搜索程序不使用。WebDB 存储两种实体:页面和链接。该页面代表 Internet 上的一个网页。将这个网页的URL作为一个标记编入索引,同时创建了该网页内容的MD5哈希签名。与网页相关的其他内容也被存储,包括:页面中的链接数(外部链接)、页面爬取信息(在页面被重复爬取的情况下)、以及表示页面级别的分数。链接代表从一个网页到其他网页的链接。因此,WebDB 可以说是一个网络图,以节点为页面,以链接为边。
  2、段。这是网页的集合,并已编入索引。Segment 的 Fetchlist 是爬虫使用的 URL 列表,由 WebDB 生成。Fetcher 的输出数据是从 fetchlist 中取出的网页。Fetcher的输出数据先进行反向索引,然后将索引结果存入segment中。一个segment的生命周期是有限的,下一轮爬行开始的时候就没用了。默认重新爬网间隔为 30 天。因此,可以删除超过此时间限制的段。并且可以节省大量磁盘空间。Segment 以日期和时间命名,因此可以非常直观地查看其生命周期。
  3、索引。索引库是系统中所有爬取到的页面的反向索引。它不是直接从页面反向索引生成的,而是由许多小段索引合并生成的。Nutch 使用 Lucene 来构建索引,因此所有与 Lucene 相关的工具 API 都用于构建索引库。需要说明的是,Lucene的segment概念与Nutch的segment概念完全不同,不要混淆。简单来说,Lucene的segment是Lucene索引库的一部分,而Nutch的segment是被爬取索引的WebDB的一部分。
  爬取过程的详细说明:
  爬取是一个循环过程:爬取工具从WebDB生成一个fetchlist集合;提取工具根据fetchlist从互联网上下载网页内容;工具程序根据提取工具找到的新链接更新WebDB;然后生成一个新的fetchlist;反复。这个 fetch 循环通常在 nutch 中提到:生成/获取/更新循环。
  一般来说,同一个域名下的url链接会被合成到同一个fetchlist中。这样做的考虑是当同时使用多个工具进行抓取时,不会出现重复抓取。Nutch 遵循Robots Exclusion Protocol,可以使用robots.txt 来定义和保护私人网页数据不被捕获。
  以上抓取工具的组合是Nutch的最外层。也可以直接使用底层工具,结合这些底层工具的执行顺序,也可以达到同样的效果。这就是纳奇的魅力所在。下面详细描述上述过程。基础工具的名称在括号中:
  1、创建一个新的 WebDB (admin db -create)。
  2、将开始爬取和Url放入WebDb(注入)。
  3、 从 WebDb 的新段生成 fetchlist(生成)。
  4、 根据fetchlist列表(fetch)获取网页的内容。
  5、根据检索到的网页链接的URL更新WebDB(updatedb)。
  6、重复以上3-5步,直到达到指定的爬行层数。
  7、 使用计算出的 web url 权重分数更新段 (updatesegs)。
  8、 将抓取的网页编入索引。
  9、 消除索引中的重复内容和重复 URL (dedup)。
  10、将多个索引合并为一个大索引,并提供索引库(merge)进行搜索。
  *****************
  赫里特克斯
  开发语言:Java
  Heritrix 是一个开源、可扩展的网络爬虫项目。Heritrix 的设计严​​格遵循 robots.txt 文件和 META 机器人标签的排除说明。
  介绍
  Heritrix 和 Nutch 的比较
  还有纳奇。两者都是 Java 开源框架。Heritrix 是 SourceForge 上的开源产品。Nutch 是 Apache 的一个子项目。他们都被称为网络爬虫。它们的实现原理基本一致:深度遍历网站在本地捕获这些资源,使用的方法是分析每个有效的URI网站,并提交一个Http请求得到相应的结果,生成本地文件和相应的日志信息等。
  Heritrix 是一个“档案爬虫”——用于获取网站内容的完整、准确、深层副本。包括获取图片等非文字内容。抓取并存储相关内容。不拒绝任何内容,不对页面进行任何内容修改。重新抓取不会替换同一 URL 的前一次抓取。通过Web用户界面启动、监控和调整爬虫,可以灵活定义获取URL。
  Nutch和Heritrix的区别:
  Nutch 只获取和保存可索引的内容。Heritrix 接受这一切。力求保留页面的原创外观
  Nutch 可以修剪内容,或转换内容格式。
  Nutch 以数据库优化的格式保存内容以备将来索引;刷新并替换旧内容。而 Heritrix 正在添加(追加)新的内容。
  Nutch 是从命令行运行和控制的。Heritrix 有一个网页控制管理界面。
  Nutch 的定制能力还不够强大,但现在已经改进了。Heritrix 可以控制更多的参数。
  Heritrix 提供的功能没有 nutch 多,感觉就像从整个站点下载一样。既没有索引也没有解析,即使是重复爬取网址也不是很好。
  Heritrix 功能强大但配置起来有点麻烦。
  ************************
  三者的比较
  一、 在功能上,Heritrix 和 Larbin 的功能类似。两者都是纯网络爬虫,提供网站的镜像下载。Nutch 是一个网络搜索引擎框架,抓取网页只是它的一部分功能。
  二、 在分布式处理方面,Nutch 支持分布式处理,而另外两个好像还没有支持。
  三、 从抓取的网页存储方式来看,Heritrix和Larbin都将抓取的内容保存为原创内容类型。并且 Nutch 将内容保存到其特定的格式段。
  第四,对于爬取内容的处理,Heritrix和Larbin都将爬取的内容直接保存为原创内容,不做任何处理。Nutch 处理文本包括链接分析、文本提取和索引(Lucene 索引)。
  第五,在爬取效率方面,Larbin的效率更高,因为它是用C++实现的,功能单一。
  爬虫
  发展
  语
  功能
  单身的
  支持分布式
  爬行
  高效的
  镜像
  节省
  纳奇
  爪哇
  X
  √
  低的
  X
  拉宾
  C++
  √
  X
  高的
  √
  赫里特克斯
  爪哇
  √
  X
  中间
  √
  -------------------------------------------------- ---------
  其他一些开源爬虫的总结:
  网络SPHINX
  WebSPHINX 是 Java 类包和网络爬虫的交互式开发环境。网络爬虫(也称为机器人或蜘蛛)是可以自动浏览和处理网页的程序。WebSPHINX由两部分组成:爬虫工作平台和WebSPHINX包。
  ~rcm/websphinx/
  网络学习
  WebLech 是一个强大的网站下载和镜像工具。支持根据功能需求下载网站,并尽可能模仿标准网页浏览器的行为。WebLech 有功能控制台,使用多线程操作。
  阿拉蕾
  Arale 主要是为个人使用而设计的,不像其他爬虫那样专注于页面索引。Arale 可以下载整个网站或网站上的部分资源。Arale 还可以将动态页面映射到静态页面。
  J-蜘蛛
  J-Spider:是一个完全可配置和可定制的 Web Spider 引擎。可以用它来检查网站错误(内部服务器错误等),网站内外链接检查,分析网站的结构(可以创建一个网站@ &gt; map),下载整个网站,也可以写一个JSpider插件扩展你需要的功能。
  主轴
  Spindle 是一个建立在 Lucene 工具包上的 Web 索引/搜索工具。它包括一个用于创建索引的 HTTP 蜘蛛和一个用于搜索这些索引的搜索类。主轴项目提供了一组JSP标签库,让那些基于JSP的站点无需开发任何Java类就可以添加搜索功能。
  蛛形纲动物
  Arachnid:是一个基于 Java 的网络蜘蛛框架。它收录一个简单的 HTML 解析器,可以分析收录 HTML 内容的输入流。通过实现Arachnid子类,可以开发一个简单的网络蜘蛛,可以在每一个网站中使用 解析一个页面后,添加几行代码调用。Arachnid 下载包中收录两个蜘蛛应用程序示例,用于演示如何使用该框架。
  警报器
  LARM 可以为 Jakarta Lucene 搜索引擎框架的用户提供纯 Java 搜索解决方案。它收录索引文件、数据库表和用于索引网站的爬虫的方法。
  乔博
  JoBo 是一个用于下载整个网站的简单工具。它本质上是一个网络蜘蛛。与其他下载工具相比,它的主要优点是能够自动填写表单(如自动登录)和使用cookies来处理会话。JoBo 还具有灵活的下载规则(如:URL、大小、MIME 类型等)来限制下载。
  snoics-爬行动物
  snoics -reptile 是用纯 Java 开发的。它是用于捕获 网站 图像的工具。您可以使用配置文件中提供的 URL 条目来传输所有可以通过浏览器 GET 的 网站。这种方式获取的所有资源都是本地抓取的,包括网页和各类文件,如图片、flash、mp3、zip、rar、exe等文件。整个网站可以完全转移到硬盘上,保持原有的网站结构准确不变。只需将捕获到的网站放入Web服务器(如Apache)即可实现完整的网站镜像。
  网络收获
  Web-Harvest 是一个 Java 开源 Web 数据提取工具。它可以采集指定的网页并从这些网页中提取有用的数据。Web-Harvest主要使用XSLT、XQuery、正则表达式等技术来实现text/xml的操作。
  蜘蛛
  Spiderpy 是一个基于 Python 编码的开源网络爬虫工具,允许用户采集文件和搜索网站,并具有可配置的界面。
  蜘蛛网网络 Xoops Mod 团队
  pider Web Network Xoops Mod 是 Xoops 下的一个模块,完全由 PHP 语言实现。

htmlunit 抓取网页(java页面分析工具是什么?是怎么做的? )

网站优化优采云 发表了文章 • 0 个评论 • 99 次浏览 • 2021-11-05 14:02 • 来自相关话题

  htmlunit 抓取网页(java页面分析工具是什么?是怎么做的?
)
  一、什么是 HtmlUnit?
  1、htmlunit 是一个开源的java页面分析工具。阅读完页面后,您可以有效地使用 htmlunit 来分析页面上的内容。该项目可以模拟浏览器操作,被称为java浏览器的开源实现。它是一个没有界面的浏览器,运行速度很快。
  2、 使用 Rhinojs 引擎。模拟js运行
  3、常规意义上,这个项目可以用来测试页面,实现网页的自动化测试,(包括JS)
  4、 但是一般来说,在小型爬虫项目中,这种框架非常常用,可以有效的分析dom标签,有效的运行页面上的js,得到一些需要的js执行。价值。
  二、应用:获取百度API返回的详细url,从详细url中抓取图片url
  maven 依赖:
  
net.sourceforge.htmlunit
htmlunit-core-js
2.23
net.sourceforge.htmlunit
htmlunit
2.23
xml-apis
xml-apis
1.4.01
  服务器代码:
  /**
* 从百度POI详情页获取图片url
* @param poiUid
* @return
*/
public static List grabImgUrl(String poiUid) {
if (StringUtils.isBlank(poiUid)) {
return null;
}
final String IMG_LIST_URL = "http://map.baidu.com/detail%3F ... 3B%3B
String detailUrl = IMG_LIST_URL + poiUid;
log.info("grabImgUrl. detailUrl=" + detailUrl);
final String DIV_ID = "photoContainer";
final String TAG_IMG = "img";
final String IMG_SRC = "src";
try (final WebClient webClient = new WebClient()) {
final HtmlPage page = webClient.getPage(detailUrl);
if (page != null && page.isHtmlPage()) {
Thread.sleep(40000); // 等待页面加载完成。
final HtmlDivision div = page.getHtmlElementById(DIV_ID);
DomNodeList eleList = div.getElementsByTagName(TAG_IMG);
List imgUrlList = new ArrayList();
for (HtmlElement hele : eleList) {
String imgUrl = hele.getAttribute(IMG_SRC);
if (StringUtils.isNotBlank(imgUrl)) {
log.info("imgUrl=" + imgUrl);
imgUrlList.add(imgUrl);
}
}
return imgUrlList;
}
} catch (Exception e) {
log.error("grabImgUrl error.", e);
}
return null;
}
  页面显示:
  
${im.picUrl }
设为封面
× 查看全部

  htmlunit 抓取网页(java页面分析工具是什么?是怎么做的?
)
  一、什么是 HtmlUnit?
  1、htmlunit 是一个开源的java页面分析工具。阅读完页面后,您可以有效地使用 htmlunit 来分析页面上的内容。该项目可以模拟浏览器操作,被称为java浏览器的开源实现。它是一个没有界面的浏览器,运行速度很快。
  2、 使用 Rhinojs 引擎。模拟js运行
  3、常规意义上,这个项目可以用来测试页面,实现网页的自动化测试,(包括JS)
  4、 但是一般来说,在小型爬虫项目中,这种框架非常常用,可以有效的分析dom标签,有效的运行页面上的js,得到一些需要的js执行。价值。
  二、应用:获取百度API返回的详细url,从详细url中抓取图片url
  maven 依赖:
  
net.sourceforge.htmlunit
htmlunit-core-js
2.23
net.sourceforge.htmlunit
htmlunit
2.23
xml-apis
xml-apis
1.4.01
  服务器代码:
  /**
* 从百度POI详情页获取图片url
* @param poiUid
* @return
*/
public static List grabImgUrl(String poiUid) {
if (StringUtils.isBlank(poiUid)) {
return null;
}
final String IMG_LIST_URL = "http://map.baidu.com/detail%3F ... 3B%3B
String detailUrl = IMG_LIST_URL + poiUid;
log.info("grabImgUrl. detailUrl=" + detailUrl);
final String DIV_ID = "photoContainer";
final String TAG_IMG = "img";
final String IMG_SRC = "src";
try (final WebClient webClient = new WebClient()) {
final HtmlPage page = webClient.getPage(detailUrl);
if (page != null && page.isHtmlPage()) {
Thread.sleep(40000); // 等待页面加载完成。
final HtmlDivision div = page.getHtmlElementById(DIV_ID);
DomNodeList eleList = div.getElementsByTagName(TAG_IMG);
List imgUrlList = new ArrayList();
for (HtmlElement hele : eleList) {
String imgUrl = hele.getAttribute(IMG_SRC);
if (StringUtils.isNotBlank(imgUrl)) {
log.info("imgUrl=" + imgUrl);
imgUrlList.add(imgUrl);
}
}
return imgUrlList;
}
} catch (Exception e) {
log.error("grabImgUrl error.", e);
}
return null;
}
  页面显示:
  
${im.picUrl }
设为封面
×

htmlunit 抓取网页(使用本文中推荐的开源工具——HtmlUnit,一款能够模拟浏览器的抓包神器!)

网站优化优采云 发表了文章 • 0 个评论 • 62 次浏览 • 2021-10-31 22:23 • 来自相关话题

  htmlunit 抓取网页(使用本文中推荐的开源工具——HtmlUnit,一款能够模拟浏览器的抓包神器!)
  之前一峰写过一篇关于使用Jsoup爬取网页内容的文章文章:
  [Jsoup] HTML 解析器,轻松访问网页内容
  Jsoup提供的api非常方便,完全类似于JQuery操作,轻松抓取网页数据。但是像Jsoup这样的普通爬虫工具的缺点是无法处理js生成的内容。
  做过Html开发的都知道,现在很多网站都大量使用ajax和JavaScript来获取和处理数据,普通的爬虫工具已经无法处理js中的内容了。
  比如我们在本地新建一个测试web文件text.html,源码如下:
   main.html a { line-height: 30px; margin: 20px; } var datas = [ { href : "http://www.jianshu.com/p/8d8edf25850d", title : "推荐一款编程字体,让代码看着更美"}, { href : "http://www.jianshu.com/p/153d9f31288d", title : "Android 利用Camera实现中轴3D卡牌翻转效果"}, { href : "http://www.jianshu.com/p/d6fb0c9c9c26", title : "【Eclipse】挖掘专属最有用的快捷键组合"}, { href : "http://www.jianshu.com/p/72d69b49d135", title : "【IIS】Windows下利用IIS建立网站并实现局域网共享"} ];window.onload = function() { var infos = document.getElementById("infos"); for( var i = 0 ; i < datas.length ; i++) { var a = document.createElement("a"); a.href = datas[i].href ; a.innerText = datas[i].title; infos.appendChild(a); infos.appendChild(document.createElement("br")) }} HtmlUnit 测试网页内容!

  通过IIS发布本地网站(参考易峰之前写的文章:【IIS】Windows下使用IIS建立网站,实现局域网共享),浏览器显示网页将如下:
  网页展示效果.jpg
  虽然通过网页评论元素可以看到body收录了网页显示中的文本内容:
  网络评论元素.jpg
  但是,它根本无法通过 Jsoup 工具使用!从网页源码中可以看出,我们需要抓取的内容是在页面显示后通过ajax和JavaScript加载的。
  那么该怎么办?使用本文推荐的开源工具——HtmlUnit,一款可以模拟浏览器的抓包神器!
  在官网下载对应的jar包,添加到工程项目的lib中。简单的测试代码如下:
  import java.io.IOException;import java.net.MalformedURLException;import java.text.ParseException;import com.gargoylesoftware.htmlunit.BrowserVersion;import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;import com.gargoylesoftware.htmlunit.WebClient;import com.gargoylesoftware.htmlunit.html.DomElement;import com.gargoylesoftware.htmlunit.html.DomNodeList;import com.gargoylesoftware.htmlunit.html.HtmlPage;/** * @author 亦枫 * @created_time 2016年1月12日 * @file_user_todo Java测试类 * @blog http://www.jianshu.com/users/1 ... icles */public class JavaTest { /** * 入口函数 * @param args * @throws ParseException */ public static void main(String[] args) throws ParseException { try { WebClient webClient = new WebClient(BrowserVersion.CHROME); HtmlPage htmlPage = (HtmlPage) webClient.getPage("http://localhost/test.html"); DomNodeList domNodeList = htmlPage.getElementsByTagName("a"); for (int i = 0; i < domNodeList.size(); i++) { DomElement domElement = (DomElement) domNodeList.get(i); System.out.println(domElement.asText()); } webClient.close(); } catch (FailingHttpStatusCodeException e) { e.printStackTrace(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }}
  运行后,控制台打印结果:
  HtmlUnit 测试结果.jpg
  可见HtmlUnit可以抓取AJAX和JavaScript加载的内容。
  HtmlUnit的介绍在官网上很详细。以下内容为易峰翻译的部分内容,供大家参考:
  HtmlUnit 是一个基于 Java 的浏览器程序,没有图形界面。它可以调用HTML文档并提供API,让开发者可以像在普通浏览器上操作一样访问网页内容、填写表格、点击超链接等。
  它可以很好地支持 JavaScript,并且仍在改进中。同时,它可以解析非常复杂的AJAX库,模拟不同配置下的Chrome、Firefox和IE浏览器。
  HtmlUnit 通常用于测试目的和检索 网站 信息。
  HtmlUnit 提供了很多用于测试网络请求和抓取网页内容的功能。可以到官网或者其他网站学习使用。 查看全部

  htmlunit 抓取网页(使用本文中推荐的开源工具——HtmlUnit,一款能够模拟浏览器的抓包神器!)
  之前一峰写过一篇关于使用Jsoup爬取网页内容的文章文章:
  [Jsoup] HTML 解析器,轻松访问网页内容
  Jsoup提供的api非常方便,完全类似于JQuery操作,轻松抓取网页数据。但是像Jsoup这样的普通爬虫工具的缺点是无法处理js生成的内容。
  做过Html开发的都知道,现在很多网站都大量使用ajax和JavaScript来获取和处理数据,普通的爬虫工具已经无法处理js中的内容了。
  比如我们在本地新建一个测试web文件text.html,源码如下:
   main.html a { line-height: 30px; margin: 20px; } var datas = [ { href : "http://www.jianshu.com/p/8d8edf25850d", title : "推荐一款编程字体,让代码看着更美"}, { href : "http://www.jianshu.com/p/153d9f31288d", title : "Android 利用Camera实现中轴3D卡牌翻转效果"}, { href : "http://www.jianshu.com/p/d6fb0c9c9c26", title : "【Eclipse】挖掘专属最有用的快捷键组合"}, { href : "http://www.jianshu.com/p/72d69b49d135", title : "【IIS】Windows下利用IIS建立网站并实现局域网共享"} ];window.onload = function() { var infos = document.getElementById("infos"); for( var i = 0 ; i < datas.length ; i++) { var a = document.createElement("a"); a.href = datas[i].href ; a.innerText = datas[i].title; infos.appendChild(a); infos.appendChild(document.createElement("br")) }} HtmlUnit 测试网页内容!

  通过IIS发布本地网站(参考易峰之前写的文章:【IIS】Windows下使用IIS建立网站,实现局域网共享),浏览器显示网页将如下:
  网页展示效果.jpg
  虽然通过网页评论元素可以看到body收录了网页显示中的文本内容:
  网络评论元素.jpg
  但是,它根本无法通过 Jsoup 工具使用!从网页源码中可以看出,我们需要抓取的内容是在页面显示后通过ajax和JavaScript加载的。
  那么该怎么办?使用本文推荐的开源工具——HtmlUnit,一款可以模拟浏览器的抓包神器!
  在官网下载对应的jar包,添加到工程项目的lib中。简单的测试代码如下:
  import java.io.IOException;import java.net.MalformedURLException;import java.text.ParseException;import com.gargoylesoftware.htmlunit.BrowserVersion;import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;import com.gargoylesoftware.htmlunit.WebClient;import com.gargoylesoftware.htmlunit.html.DomElement;import com.gargoylesoftware.htmlunit.html.DomNodeList;import com.gargoylesoftware.htmlunit.html.HtmlPage;/** * @author 亦枫 * @created_time 2016年1月12日 * @file_user_todo Java测试类 * @blog http://www.jianshu.com/users/1 ... icles */public class JavaTest { /** * 入口函数 * @param args * @throws ParseException */ public static void main(String[] args) throws ParseException { try { WebClient webClient = new WebClient(BrowserVersion.CHROME); HtmlPage htmlPage = (HtmlPage) webClient.getPage("http://localhost/test.html";); DomNodeList domNodeList = htmlPage.getElementsByTagName("a"); for (int i = 0; i < domNodeList.size(); i++) { DomElement domElement = (DomElement) domNodeList.get(i); System.out.println(domElement.asText()); } webClient.close(); } catch (FailingHttpStatusCodeException e) { e.printStackTrace(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }}
  运行后,控制台打印结果:
  HtmlUnit 测试结果.jpg
  可见HtmlUnit可以抓取AJAX和JavaScript加载的内容。
  HtmlUnit的介绍在官网上很详细。以下内容为易峰翻译的部分内容,供大家参考:
  HtmlUnit 是一个基于 Java 的浏览器程序,没有图形界面。它可以调用HTML文档并提供API,让开发者可以像在普通浏览器上操作一样访问网页内容、填写表格、点击超链接等。
  它可以很好地支持 JavaScript,并且仍在改进中。同时,它可以解析非常复杂的AJAX库,模拟不同配置下的Chrome、Firefox和IE浏览器。
  HtmlUnit 通常用于测试目的和检索 网站 信息。
  HtmlUnit 提供了很多用于测试网络请求和抓取网页内容的功能。可以到官网或者其他网站学习使用。

htmlunit 抓取网页(百度是全球大的中文搜索引擎,百度收录网站的原则)

网站优化优采云 发表了文章 • 0 个评论 • 97 次浏览 • 2021-10-30 17:15 • 来自相关话题

  htmlunit 抓取网页(百度是全球大的中文搜索引擎,百度收录网站的原则)
  百度是全球最大的中文搜索引擎。百度收录网站的原则基本上是原创为王,复制内容的网站基本不会收录或更少收录。百度已经在中国占据了绝大部分。一定要支持百度做网站,坚持原创。一旦百度把你的网站带入观察期,你就得小心了。它可能会在一个月内清除给您。百度对网站关键词的修改和修改很敏感,所以修改修改的时候一定要小心,一点一点的修改,不要一下子全改。百度收录网站从某种意义上说,人为因素太多,有时看起来不公平,搜索结果也不是那么理想。
  网站操作好不好,关键因素之一是网站收录的内容如何。获得的内容越多,网站的排名和权重就越高。网站的操作会更成功!如果你想让更多的网站页面成为收录,想要更多的网站页面成为收录,你必须想办法吸引搜索引擎蜘蛛. 挑选。——分析认为,影响搜索引擎蜘蛛爬行的主要因素有:
  1.网站 和页面权重:
  优质、资深的网站被认为权重较高,这类网站上的页面爬取深度也会更高,会出现很多收录。
  2.网站 更新频率:
  每次蜘蛛爬行时,都会存储页面数据。如果第二次爬取发现页面和第一次收录完全一样,说明页面没有更新,不需要蜘蛛频繁爬取。页面内容更新频繁,蜘蛛会更频繁地访问页面,页面上出现的新链接自然会被蜘蛛更快地跟踪和抓取。
  3.网站的原创内容:
  站长需要注意的是,原创的内容对百度蜘蛛的吸引力很大。原创的内容似乎是蜘蛛每天需要的主食。
  4. 网站 的整体结构:
  网站的基本结构包括:是否在标题中嵌入关键词、网站标题、meta中的关键字、描述标签、导航栏等。
  5.构建网站地图;
  网站 地图就像一个指针。只有明确的指针才能指引蜘蛛的行踪。对于站长来说,一条方便快捷的道路会吸引更多的蜘蛛。
  6.内链优化:
  蜘蛛来到你的网站之后,自然会通过你的网站结构遍历你的网站,并且能够跑遍你网站上的几乎所有链接,这些链接一旦出现死链接,很容易导致蜘蛛爬不出来。如果次数增加,百度自然不会对你有好感网站。
  7.网站 外部链接:
  为了让站长网站被蜘蛛抓取,必须有导入链接才能进入页面,否则蜘蛛没有机会知道页面的存在。
  8.监控蜘蛛爬行:
  关于如何监控蜘蛛的爬行,可以通过网站日志了解蜘蛛爬行的页面。也可以使用站长工具查看蜘蛛的爬行速度,合理分配资源,实现更高的爬行速度,勾引。更多的蜘蛛。 查看全部

  htmlunit 抓取网页(百度是全球大的中文搜索引擎,百度收录网站的原则)
  百度是全球最大的中文搜索引擎。百度收录网站的原则基本上是原创为王,复制内容的网站基本不会收录或更少收录。百度已经在中国占据了绝大部分。一定要支持百度做网站,坚持原创。一旦百度把你的网站带入观察期,你就得小心了。它可能会在一个月内清除给您。百度对网站关键词的修改和修改很敏感,所以修改修改的时候一定要小心,一点一点的修改,不要一下子全改。百度收录网站从某种意义上说,人为因素太多,有时看起来不公平,搜索结果也不是那么理想。
  网站操作好不好,关键因素之一是网站收录的内容如何。获得的内容越多,网站的排名和权重就越高。网站的操作会更成功!如果你想让更多的网站页面成为收录,想要更多的网站页面成为收录,你必须想办法吸引搜索引擎蜘蛛. 挑选。——分析认为,影响搜索引擎蜘蛛爬行的主要因素有:
  1.网站 和页面权重:
  优质、资深的网站被认为权重较高,这类网站上的页面爬取深度也会更高,会出现很多收录。
  2.网站 更新频率:
  每次蜘蛛爬行时,都会存储页面数据。如果第二次爬取发现页面和第一次收录完全一样,说明页面没有更新,不需要蜘蛛频繁爬取。页面内容更新频繁,蜘蛛会更频繁地访问页面,页面上出现的新链接自然会被蜘蛛更快地跟踪和抓取。
  3.网站的原创内容:
  站长需要注意的是,原创的内容对百度蜘蛛的吸引力很大。原创的内容似乎是蜘蛛每天需要的主食。
  4. 网站 的整体结构:
  网站的基本结构包括:是否在标题中嵌入关键词、网站标题、meta中的关键字、描述标签、导航栏等。
  5.构建网站地图;
  网站 地图就像一个指针。只有明确的指针才能指引蜘蛛的行踪。对于站长来说,一条方便快捷的道路会吸引更多的蜘蛛。
  6.内链优化:
  蜘蛛来到你的网站之后,自然会通过你的网站结构遍历你的网站,并且能够跑遍你网站上的几乎所有链接,这些链接一旦出现死链接,很容易导致蜘蛛爬不出来。如果次数增加,百度自然不会对你有好感网站。
  7.网站 外部链接:
  为了让站长网站被蜘蛛抓取,必须有导入链接才能进入页面,否则蜘蛛没有机会知道页面的存在。
  8.监控蜘蛛爬行:
  关于如何监控蜘蛛的爬行,可以通过网站日志了解蜘蛛爬行的页面。也可以使用站长工具查看蜘蛛的爬行速度,合理分配资源,实现更高的爬行速度,勾引。更多的蜘蛛。

htmlunit 抓取网页(htmlunit网络工具一个没有没有 )

网站优化优采云 发表了文章 • 0 个评论 • 61 次浏览 • 2021-10-24 22:14 • 来自相关话题

  htmlunit 抓取网页(htmlunit网络工具一个没有没有
)
  1:背景
  我想用jsoup抓取一个页面,但是我抓取的数据总是不完整的,然后发现页面执行了js后有一些数据渲染在页面上,也就是说只在执行js后的数据页。数据会显示出来,但是jsoup无法实现执行页面的js。
  2:解决
  搜索后发现htmlunit网络工具可以执行js,相当于没有页面的浏览器。解决办法是先用htmlUnit发送网络请求,执行js获取页面,然后用jsoup转换成Document页面对象。然后用jsoup分析页面读取数据。
  3: htmlUnit 发送请求
   1 public static Document getDocument() throws IOException, InterruptedException{
2 /*String url="https://www.marklines.com/cn/v ... 3B%3B
3 Connection connect = Jsoup.connect(url).userAgent("")
4 .header("Cookie", "PLAY_LANG=cn; _plh=b9289d0a863a8fc9c79fb938f15372f7731d13fb; PLATFORM_SESSION=39034d07000717c664134556ad39869771aabc04-_ldi=520275&_lsh=8cf91cdbcbbb255adff5cba6061f561b642f5157&csrfToken=209f20c8473bc0518413c226f898ff79cd69c3ff-1539926671235-b853a6a63c77dd8fcc364a58&_lpt=%2Fcn%2Fvehicle_sales%2Fsearch&_lsi=1646321; _ga=GA1.2.2146952143.1539926675; _gid=GA1.2.1032787565.1539926675; _plh_notime=8cf91cdbcbbb255adff5cba6061f561b642f5157")
5 .timeout(360000000);
6 Document document = connect.get();*/
7 WebClient wc = new WebClient(BrowserVersion.CHROME);
8 //是否使用不安全的SSL
9 wc.getOptions().setUseInsecureSSL(true);
10 //启用JS解释器,默认为true
11 wc.getOptions().setJavaScriptEnabled(true);
12 //禁用CSS
13 wc.getOptions().setCssEnabled(false);
14 //js运行错误时,是否抛出异常
15 wc.getOptions().setThrowExceptionOnScriptError(false);
16 //状态码错误时,是否抛出异常
17 wc.getOptions().setThrowExceptionOnFailingStatusCode(false);
18 //是否允许使用ActiveX
19 wc.getOptions().setActiveXNative(false);
20 //等待js时间
21 wc.waitForBackgroundJavaScript(600*1000);
22 //设置Ajax异步处理控制器即启用Ajax支持
23 wc.setAjaxController(new NicelyResynchronizingAjaxController());
24 //设置超时时间
25 wc.getOptions().setTimeout(1000000);
26 //不跟踪抓取
27 wc.getOptions().setDoNotTrackEnabled(false);
28 WebRequest request=new WebRequest(new URL("https://www.marklines.com/cn/v ... 6quot;));
29 request.setAdditionalHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0");
30 request.setAdditionalHeader("Cookie","PLAY_LANG=cn; _plh=b9289d0a863a8fc9c79fb938f15372f7731d13fb; PLATFORM_SESSION=39034d07000717c664134556ad39869771aabc04-_ldi=520275&_lsh=8cf91cdbcbbb255adff5cba6061f561b642f5157&csrfToken=209f20c8473bc0518413c226f898ff79cd69c3ff-1539926671235-b853a6a63c77dd8fcc364a58&_lpt=%2Fcn%2Fvehicle_sales%2Fsearch&_lsi=1646321; _ga=GA1.2.2146952143.1539926675; _gid=GA1.2.1032787565.1539926675; _plh_notime=8cf91cdbcbbb255adff5cba6061f561b642f5157");
31 try {
32 //模拟浏览器打开一个目标网址
33 HtmlPage htmlPage = wc.getPage(request);
34 //为了获取js执行的数据 线程开始沉睡等待
35 Thread.sleep(1000);//这个线程的等待 因为js加载需要时间的
36 //以xml形式获取响应文本
37 String xml = htmlPage.asXml();
38 //并转为Document对象return
39 return Jsoup.parse(xml);
40 //System.out.println(xml.contains("结果.xls"));//false
41 } catch (FailingHttpStatusCodeException e) {
42 e.printStackTrace();
43 } catch (MalformedURLException e) {
44 e.printStackTrace();
45 } catch (IOException e) {
46 e.printStackTrace();
47 }
48 return null;
49 }
  4:返回的Document对象交给jsoup处理
  我这里只做了一个简单的输出,我检查了数据是否全部渲染完毕。
   1 Document doc=getDocument();
2 Element table=doc.select("table.table.table-bordered.aggregate_table").get(0);//获取到表格
3 Element tableContext=table.getElementsByTag("tbody").get(0);
4 Elements contextTrs=tableContext.getElementsByTag("tr");
5 System.out.println(contextTrs.size());
6
7
8 String context=doc.toString();
9 OutputStreamWriter pw = null;
10 pw = new OutputStreamWriter(new FileOutputStream("D:/test.txt"),"GBK");
11 pw.write(context);
12 pw.close(); 查看全部

  htmlunit 抓取网页(htmlunit网络工具一个没有没有
)
  1:背景
  我想用jsoup抓取一个页面,但是我抓取的数据总是不完整的,然后发现页面执行了js后有一些数据渲染在页面上,也就是说只在执行js后的数据页。数据会显示出来,但是jsoup无法实现执行页面的js。
  2:解决
  搜索后发现htmlunit网络工具可以执行js,相当于没有页面的浏览器。解决办法是先用htmlUnit发送网络请求,执行js获取页面,然后用jsoup转换成Document页面对象。然后用jsoup分析页面读取数据。
  3: htmlUnit 发送请求
   1 public static Document getDocument() throws IOException, InterruptedException{
2 /*String url="https://www.marklines.com/cn/v ... 3B%3B
3 Connection connect = Jsoup.connect(url).userAgent("")
4 .header("Cookie", "PLAY_LANG=cn; _plh=b9289d0a863a8fc9c79fb938f15372f7731d13fb; PLATFORM_SESSION=39034d07000717c664134556ad39869771aabc04-_ldi=520275&_lsh=8cf91cdbcbbb255adff5cba6061f561b642f5157&csrfToken=209f20c8473bc0518413c226f898ff79cd69c3ff-1539926671235-b853a6a63c77dd8fcc364a58&_lpt=%2Fcn%2Fvehicle_sales%2Fsearch&_lsi=1646321; _ga=GA1.2.2146952143.1539926675; _gid=GA1.2.1032787565.1539926675; _plh_notime=8cf91cdbcbbb255adff5cba6061f561b642f5157")
5 .timeout(360000000);
6 Document document = connect.get();*/
7 WebClient wc = new WebClient(BrowserVersion.CHROME);
8 //是否使用不安全的SSL
9 wc.getOptions().setUseInsecureSSL(true);
10 //启用JS解释器,默认为true
11 wc.getOptions().setJavaScriptEnabled(true);
12 //禁用CSS
13 wc.getOptions().setCssEnabled(false);
14 //js运行错误时,是否抛出异常
15 wc.getOptions().setThrowExceptionOnScriptError(false);
16 //状态码错误时,是否抛出异常
17 wc.getOptions().setThrowExceptionOnFailingStatusCode(false);
18 //是否允许使用ActiveX
19 wc.getOptions().setActiveXNative(false);
20 //等待js时间
21 wc.waitForBackgroundJavaScript(600*1000);
22 //设置Ajax异步处理控制器即启用Ajax支持
23 wc.setAjaxController(new NicelyResynchronizingAjaxController());
24 //设置超时时间
25 wc.getOptions().setTimeout(1000000);
26 //不跟踪抓取
27 wc.getOptions().setDoNotTrackEnabled(false);
28 WebRequest request=new WebRequest(new URL("https://www.marklines.com/cn/v ... 6quot;));
29 request.setAdditionalHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0");
30 request.setAdditionalHeader("Cookie","PLAY_LANG=cn; _plh=b9289d0a863a8fc9c79fb938f15372f7731d13fb; PLATFORM_SESSION=39034d07000717c664134556ad39869771aabc04-_ldi=520275&_lsh=8cf91cdbcbbb255adff5cba6061f561b642f5157&csrfToken=209f20c8473bc0518413c226f898ff79cd69c3ff-1539926671235-b853a6a63c77dd8fcc364a58&_lpt=%2Fcn%2Fvehicle_sales%2Fsearch&_lsi=1646321; _ga=GA1.2.2146952143.1539926675; _gid=GA1.2.1032787565.1539926675; _plh_notime=8cf91cdbcbbb255adff5cba6061f561b642f5157");
31 try {
32 //模拟浏览器打开一个目标网址
33 HtmlPage htmlPage = wc.getPage(request);
34 //为了获取js执行的数据 线程开始沉睡等待
35 Thread.sleep(1000);//这个线程的等待 因为js加载需要时间的
36 //以xml形式获取响应文本
37 String xml = htmlPage.asXml();
38 //并转为Document对象return
39 return Jsoup.parse(xml);
40 //System.out.println(xml.contains("结果.xls"));//false
41 } catch (FailingHttpStatusCodeException e) {
42 e.printStackTrace();
43 } catch (MalformedURLException e) {
44 e.printStackTrace();
45 } catch (IOException e) {
46 e.printStackTrace();
47 }
48 return null;
49 }
  4:返回的Document对象交给jsoup处理
  我这里只做了一个简单的输出,我检查了数据是否全部渲染完毕。
   1 Document doc=getDocument();
2 Element table=doc.select("table.table.table-bordered.aggregate_table").get(0);//获取到表格
3 Element tableContext=table.getElementsByTag("tbody").get(0);
4 Elements contextTrs=tableContext.getElementsByTag("tr");
5 System.out.println(contextTrs.size());
6
7
8 String context=doc.toString();
9 OutputStreamWriter pw = null;
10 pw = new OutputStreamWriter(new FileOutputStream("D:/test.txt"),"GBK");
11 pw.write(context);
12 pw.close();

htmlunit 抓取网页(使用本文中推荐的开源工具——HtmlUnit,一款能够模拟浏览器的抓包神器!)

网站优化优采云 发表了文章 • 0 个评论 • 74 次浏览 • 2021-10-21 02:20 • 来自相关话题

  htmlunit 抓取网页(使用本文中推荐的开源工具——HtmlUnit,一款能够模拟浏览器的抓包神器!)
  之前一峰写过一篇关于使用Jsoup抓取网页内容的文章文章:
  [Jsoup] HTML解析器,轻松访问网页内容
  Jsoup提供的api非常方便,完全类似于JQuery操作,轻松抓取网页数据。但是Jsoup等普通爬虫工具的缺点是无法处理js生成的内容。
  做过Html开发的都知道,现在很多网站都大量使用ajax和JavaScript来获取和处理数据,普通的爬虫工具已经无法处理js中的内容了。
  比如我们在本地新建一个测试web文件text.html,源码如下:
  

main.html




a {
line-height: 30px;
margin: 20px;
}




var datas = [ {
href : "http://www.jianshu.com/p/8d8edf25850d",
title : "推荐一款编程字体,让代码看着更美"
}, {
href : "http://www.jianshu.com/p/153d9f31288d",
title : "Android 利用Camera实现中轴3D卡牌翻转效果"
}, {
href : "http://www.jianshu.com/p/d6fb0c9c9c26",
title : "【Eclipse】挖掘专属最有用的快捷键组合"
}, {
href : "http://www.jianshu.com/p/72d69b49d135",
title : "【IIS】Windows下利用IIS建立网站并实现局域网共享"
} ];
window.onload = function() {
var infos = document.getElementById("infos");
for( var i = 0 ; i < datas.length ; i++)
{
var a = document.createElement("a");
a.href = datas[i].href ;
a.innerText = datas[i].title;
infos.appendChild(a);
infos.appendChild(document.createElement("br"))
}
}


HtmlUnit 测试网页内容!




  通过IIS发布本地网站(参考易峰之前写的文章:
  【IIS】Windows下,使用IIS建立网站,实现局域网共享),
  网页在浏览器中显示的效果如下:
  
  网页展示效果.jpg
  虽然通过网页评论元素可以看到body收录了网页显示中的文本内容:
  
  网络评论元素.jpg
  但是,通过Jsoup工具根本无法使用!在网页的源码中可以看到,我们需要抓取的内容是在页面显示后通过ajax和JavaScript加载的。
  那么该怎么办?使用本文推荐的开源工具——HtmlUnit,一款可以模拟浏览器的抓包神器!
  在官网下载对应的jar包,添加到工程项目的lib中。简单的测试代码如下:
  import java.io.IOException;
import java.net.MalformedURLException;
import java.text.ParseException;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomElement;
import com.gargoylesoftware.htmlunit.html.DomNodeList;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
/**
* @author 亦枫
* @created_time 2016年1月12日
* @file_user_todo Java测试类
* @blog http://www.jianshu.com/users/1 ... icles
*/
public class JavaTest {
/**
* 入口函数
* @param args
* @throws ParseException
*/
public static void main(String[] args) throws ParseException {

try {
WebClient webClient = new WebClient(BrowserVersion.CHROME);
HtmlPage htmlPage = (HtmlPage) webClient.getPage("http://localhost/test.html");
DomNodeList domNodeList = htmlPage.getElementsByTagName("a");
for (int i = 0; i < domNodeList.size(); i++) {
DomElement domElement = (DomElement) domNodeList.get(i);
System.out.println(domElement.asText());
}
webClient.close();
} catch (FailingHttpStatusCodeException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}


}

}
  运行后,控制台打印结果:
  
  HtmlUnit 测试结果.jpg
  可见HtmlUnit可以抓取AJAX和JavaScript加载的内容。
  HtmlUnit的介绍在官网上很详细。以下内容为易峰翻译的部分内容,供大家参考:
  HtmlUnit 是一个基于 Java 的浏览器程序,没有图形界面。它可以调用HTML文档并提供API,让开发者可以像在普通浏览器上操作一样访问网页内容、填写表单、点击超链接等。
  它可以很好地支持 JavaScript,并且仍在改进中。同时,它可以解析非常复杂的AJAX库,模拟不同配置下的Chrome、Firefox和IE浏览器。
  HtmlUnit 通常用于测试目的和检索 网站 信息。
  HtmlUnit 提供了很多用于测试网络请求和抓取网页内容的功能。可以到官网或者其他网站学习使用。 查看全部

  htmlunit 抓取网页(使用本文中推荐的开源工具——HtmlUnit,一款能够模拟浏览器的抓包神器!)
  之前一峰写过一篇关于使用Jsoup抓取网页内容的文章文章:
  [Jsoup] HTML解析器,轻松访问网页内容
  Jsoup提供的api非常方便,完全类似于JQuery操作,轻松抓取网页数据。但是Jsoup等普通爬虫工具的缺点是无法处理js生成的内容。
  做过Html开发的都知道,现在很多网站都大量使用ajax和JavaScript来获取和处理数据,普通的爬虫工具已经无法处理js中的内容了。
  比如我们在本地新建一个测试web文件text.html,源码如下:
  

main.html




a {
line-height: 30px;
margin: 20px;
}




var datas = [ {
href : "http://www.jianshu.com/p/8d8edf25850d",
title : "推荐一款编程字体,让代码看着更美"
}, {
href : "http://www.jianshu.com/p/153d9f31288d",
title : "Android 利用Camera实现中轴3D卡牌翻转效果"
}, {
href : "http://www.jianshu.com/p/d6fb0c9c9c26",
title : "【Eclipse】挖掘专属最有用的快捷键组合"
}, {
href : "http://www.jianshu.com/p/72d69b49d135",
title : "【IIS】Windows下利用IIS建立网站并实现局域网共享"
} ];
window.onload = function() {
var infos = document.getElementById("infos");
for( var i = 0 ; i < datas.length ; i++)
{
var a = document.createElement("a");
a.href = datas[i].href ;
a.innerText = datas[i].title;
infos.appendChild(a);
infos.appendChild(document.createElement("br"))
}
}


HtmlUnit 测试网页内容!




  通过IIS发布本地网站(参考易峰之前写的文章:
  【IIS】Windows下,使用IIS建立网站,实现局域网共享),
  网页在浏览器中显示的效果如下:
  
  网页展示效果.jpg
  虽然通过网页评论元素可以看到body收录了网页显示中的文本内容:
  
  网络评论元素.jpg
  但是,通过Jsoup工具根本无法使用!在网页的源码中可以看到,我们需要抓取的内容是在页面显示后通过ajax和JavaScript加载的。
  那么该怎么办?使用本文推荐的开源工具——HtmlUnit,一款可以模拟浏览器的抓包神器!
  在官网下载对应的jar包,添加到工程项目的lib中。简单的测试代码如下:
  import java.io.IOException;
import java.net.MalformedURLException;
import java.text.ParseException;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomElement;
import com.gargoylesoftware.htmlunit.html.DomNodeList;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
/**
* @author 亦枫
* @created_time 2016年1月12日
* @file_user_todo Java测试类
* @blog http://www.jianshu.com/users/1 ... icles
*/
public class JavaTest {
/**
* 入口函数
* @param args
* @throws ParseException
*/
public static void main(String[] args) throws ParseException {

try {
WebClient webClient = new WebClient(BrowserVersion.CHROME);
HtmlPage htmlPage = (HtmlPage) webClient.getPage("http://localhost/test.html";);
DomNodeList domNodeList = htmlPage.getElementsByTagName("a");
for (int i = 0; i < domNodeList.size(); i++) {
DomElement domElement = (DomElement) domNodeList.get(i);
System.out.println(domElement.asText());
}
webClient.close();
} catch (FailingHttpStatusCodeException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}


}

}
  运行后,控制台打印结果:
  
  HtmlUnit 测试结果.jpg
  可见HtmlUnit可以抓取AJAX和JavaScript加载的内容。
  HtmlUnit的介绍在官网上很详细。以下内容为易峰翻译的部分内容,供大家参考:
  HtmlUnit 是一个基于 Java 的浏览器程序,没有图形界面。它可以调用HTML文档并提供API,让开发者可以像在普通浏览器上操作一样访问网页内容、填写表单、点击超链接等。
  它可以很好地支持 JavaScript,并且仍在改进中。同时,它可以解析非常复杂的AJAX库,模拟不同配置下的Chrome、Firefox和IE浏览器。
  HtmlUnit 通常用于测试目的和检索 网站 信息。
  HtmlUnit 提供了很多用于测试网络请求和抓取网页内容的功能。可以到官网或者其他网站学习使用。

官方客服QQ群

微信人工客服

QQ人工客服


线