java jsoup爬取动态网页_java网络爬虫-利用phantomjs和jsoup爬取动态ajax加载页面

java基于windows爬取ajax加载的动态页面需要一定的辅助工具支持,本文爬取ajax加载的动态页面所使用的工具是phantomJS(关于phantomJS的介绍百度一大堆)

下载之后解压文件,为了后面方便使用建议单独放在一个文件夹里面,例如我这边是放在F盘下面单独的文件夹phantomjs,然后进入phantomjs--bin点击运行phantomjs.exe,出现一下界面:

java jsoup爬取动态网页_java网络爬虫-利用phantomjs和jsoup爬取动态ajax加载页面_第1张图片

即表示可以正常运行js代码了。(如果要经常使用建议配置path环境)

接下来就是爬取页面了。

首先需要写一个js(例:parser.js):

1 system = require('system')2 address = system.args[1];3 var page = require('webpage').create();4 var url =address;5

6 page.settings.resourceTimeout = 1000*10; //10 seconds

7 page.onResourceTimeout = function(e) {8 console.log(page.content);9 phantom.exit(1);10 };11

12 page.open(url, function(status) {13 //Page is loaded!

14 if (status !== 'success') {15 console.log('Unable to post!');16 } else{17 console.log(page.content);18 }19 phantom.exit();20 });

然后是java代码(我的parser.js是放在F盘下面的):

1 //读取动态页面

2 public staticString dynamicHtml(String url){3 Runtime rt =Runtime.getRuntime();4 Process process = null;5 String html = "";6 try{7 process = rt.exec("F:\\phantomjs\\bin\\phantomjs.exe F:/parser.js " +url);8 InputStream in =process.getInputStream();9 InputStreamReader reader = new InputStreamReader(in, "UTF-8");10 BufferedReader br = newBufferedReader(reader);11 String tmp = "";12 while ((tmp = br.readLine()) != null) {13 html = html +tmp;14 }15 br.close();16 reader.close();17 } catch(IOException e) {18 e.printStackTrace();19 }20 returnhtml;21 }

处理逻辑(利用Jsoup爬取):

1 public static voidReadAjaxDynamicHtml(String htmlUrl){2 String imageHtml =dynamicHtml(htmlUrl);3 Document imageDoc =Jsoup.parse(imageHtml);4 //如果选择其中部分元素 有class就用:5 //Elements childrenImg = imageDoc.select(".class");6 //System.err.println(childrenImg.html());7 //System.err.println(childrenImg.text());8 //如果选择其中部分标签 比如img:9 //Elements childrenImg = imageDoc.select("img");

10 System.err.println(imageDoc);11 /*接下来的处理逻辑*/

12 //...

13 }

main方法调用示例:

1 public static voidmain(String[] args) {2 String htmlUrl = "http://www.baidu.com";3 ReadAjaxDynamicHtml(htmlUrl);4 }

显示的结果部分截图:

java jsoup爬取动态网页_java网络爬虫-利用phantomjs和jsoup爬取动态ajax加载页面_第2张图片

jar参考:

1

2

3 org.jsoup

4 jsoup

5 1.8.3

6

至此测试完成。爬取页面或会涉及读取文本和图片,给出示例读取文本和下载图片到本地示例代码:

1 /**

2 *3 *@paramtext 要写入的文本4 *@paramfileName 文件名5 *@throwsIOException6 */

7 public static void Writer(String text,String fileName) throwsIOException {8 //生成的文件路径

9 String path = "F:\\" + fileName + System.currentTimeMillis() + ".txt";10 File file = newFile(path);11 if (!file.exists()) {12 file.getParentFile().mkdirs();13 }14 file.createNewFile();15 OutputStreamWriter fw = new OutputStreamWriter(new FileOutputStream(file), "UTF-8");16 BufferedWriter bw = newBufferedWriter(fw);17 bw.write(text);18 bw.flush();19 bw.close();20 fw.close();21 }

1 /**

2 *3 *@paramurlList 图片地址4 *@parampath 存储路径5 */

6 private static voiddownloadPicture(String urlList,String path) {7 URL url = null;8 try{9 url = newURL(urlList);10 DataInputStream dataInputStream = newDataInputStream(url.openStream());11 File file = newFile(path);12 if (!file.exists()) {13 file.getParentFile().mkdirs();14 }15 //file.createNewFile();

16 FileOutputStream fileOutputStream = newFileOutputStream(file);17 ByteArrayOutputStream output = newByteArrayOutputStream();18

19 byte[] buffer = new byte[1024];20 intlength;21

22 while ((length = dataInputStream.read(buffer)) > 0) {23 output.write(buffer, 0, length);24 }25 BASE64Encoder encoder = newBASE64Encoder();26 String encode = encoder.encode(buffer);//返回Base64编码过的字节数组字符串

27 fileOutputStream.write(output.toByteArray());28 dataInputStream.close();29 fileOutputStream.close();30 } catch(MalformedURLException e) {31 e.printStackTrace();32 } catch(IOException e) {33 e.printStackTrace();34 }35 }

当然 接口入参可自定义。

你可能感兴趣的:(java,jsoup爬取动态网页)