某先生 2019-06-26
Jsoup是一个Java开源HTML解析器,可直接解析某个URL地址、HTML文本内容。通过Dom或Css选择器来查找、取出数据,实现爬虫。
maven坐标
<dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.11.2</version> </dependency>
演示Demo
import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.select.Elements; import java.io.IOException; public class JsoupDemo { public static void main( String[] args ) throws IOException { Document doc = Jsoup.connect("http://www.baidu.com").get(); System.out.println("title:"+doc.title()); Elements es = doc.select("area"); //Elements es = doc.getElementByTag("area"); System.out.println("百度图片点击路径:"+es.attr("href")); } }
PhantomJS是一个可编程的无头浏览器。通过PhantomJs可以采集Ajax生成的内容。
无头浏览器:一个完整的浏览器内核,包括js解析引擎,渲染引擎,请求处理等,但是不包括显示和用户交互页面的浏览器。
步骤:
演示Demo
var page = require("webpage").create(), //网页对象 system = require("system"), //系统对象 address,t; phantom.outputEncoding='gbk'; //设置输出编码 //phantom.outputEncoding='utf-8'; //设置输出编码 var arr = system.args; //判断参数是否传入 if(arr.length==1){ console.log("请输入待请求url"); phantom.exit(0); } else { address = arr[1]; console.log("开始访问页面:"+address); t = Date.now(); //访问页面 page.open(address,function(status){ if(status !== 'success'){ console.log('page faild to load.'); phantom.exit(); } else { t = Date.now() - t; console.log("页面访问结束:耗时:"+t+"ms"); //引入jquery page.includeJs("http://code.jquery.com/jquery-2.2.4.min.js",function(){ var result = (page.evaluate(function(){ return $('area').attr('href'); })); console.log("图片点击路径:"+result); phantom.exit(); }) } }) }
假设文件名为 c:/baidu.js;在命令行中执行 phantomjs c:/baidu.js http://www.baidu.com
java 调用Phantomjs
演示Demo
import java.io.*; public class PhantomJsDemo { public static void main( String[] args ) throws IOException { Runtime rn = Runtime.getRuntime(); String url = "http://www.baidu.com" Process process = rn.exec("phantomjs c:/baidu.js " + url); BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream())); StringBuffer sb = new StringBuffer(); String temp = ""; while((temp=br.readLine())!=null){ sb.append(temp); } System.out.println(sb.toString()); } }