(一)Jsoup
Jsoup是一个Java开源HTML解析器,可直接解析某个URL地址、HTML文本内容。通过Dom或Css选择器来查找、取出数据,实现爬虫。
maven坐标
<dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.11.2</version></dependency>
Jsoup开发指南(中文版)
演示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是一个可编程的无头浏览器。通过PhantomJs可以采集Ajax生成的内容。
无头浏览器:一个完整的浏览器内核,包括js解析引擎,渲染引擎,请求处理等,但是不包括显示和用户交互页面的浏览器。
PhantomJs官方文档
步骤:
- 下载安装,配置环境变量
- 编写并执行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");//引入jquerypage.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());}
}