学习java3天有余,知道一些基本语法后

学习java爬虫,1天后开始出现明显效果

刚开始先从最简单的爬虫逻辑入手

爬虫最简单的解析面真的是这样

  1. import org.jsoup.Jsoup;
  2. import org.jsoup.nodes.Document;
  3. import java.io.IOException;
  4.  
  5. public class Test {
  6. public static void Get_Url(String url) {
  7. try {
  8. Document doc = Jsoup.connect(url)
  9. //.data("query", "Java")
  10. //.userAgent("头部")
  11. //.cookie("auth", "token")
  12. //.timeout(3000)
  13. //.post()
  14. .get();
  15. } catch (IOException e) {
  16. e.printStackTrace();
  17. }
  18. }
  19. }

这只是一个函数而已

那么在下面加上:

  1. //main函数
  2. public static void main(String[] args) {
  3. String url = "...";
  4. Get_Url(url);
  5. }

哈哈,搞定

就是这么一个爬虫了

太神奇

但是得到的只是网页的html页面的东西

而且还没筛选

那么就筛选吧

  1. public static void Get_Url(String url) {
  2. try {
  3. Document doc = Jsoup.connect(url)
  4. //.data("query", "Java")
  5. //.userAgent("头部")
  6. //.cookie("auth", "token")
  7. //.timeout(3000)
  8. //.post()
  9. .get();
  10.  
  11. //得到html的所有东西
  12. Element content = doc.getElementById("content");
  13. //分离出html下<a>...</a>之间的所有东西
  14. Elements links = content.getElementsByTag("a");
  15. //Elements links = doc.select("a[href]");
  16. // 扩展名为.png的图片
  17. Elements pngs = doc.select("img[src$=.png]");
  18. // class等于masthead的div标签
  19. Element masthead = doc.select("div.masthead").first();
  20.  
  21. for (Element link : links) {
  22. //得到<a>...</a>里面的网址
  23. String linkHref = link.attr("href");
  24. //得到<a>...</a>里面的汉字
  25. String linkText = link.text();
  26. System.out.println(linkText);
  27. }
  28. } catch (IOException e) {
  29. e.printStackTrace();
  30. }
  31. }

那就用上面的来解析一下我的博客园

解析的是<a>...</a>之间的东西

看起来很不错,就是不错

-------------------------------我是快乐的分割线-------------------------------

其实还有另外一种爬虫的方法更加好

他能批量爬取网页保存到本地

先保存在本地再去正则什么的筛选自己想要的东西

这样效率比上面的那个高了很多

很多

很多

看代码!

  1.   //将抓取的网页变成html文件,保存在本地
  2. public static void Save_Html(String url) {
  3. try {
  4. File dest = new File("src/temp_html/" + "保存的html的名字.html");
  5. //接收字节输入流
  6. InputStream is;
  7. //字节输出流
  8. FileOutputStream fos = new FileOutputStream(dest);
  9.  
  10. URL temp = new URL(url);
  11. is = temp.openStream();
  12.  
  13. //为字节输入流加缓冲
  14. BufferedInputStream bis = new BufferedInputStream(is);
  15. //为字节输出流加缓冲
  16. BufferedOutputStream bos = new BufferedOutputStream(fos);
  17.  
  18. int length;
  19.  
  20. byte[] bytes = new byte[1024*20];
  21. while((length = bis.read(bytes, 0, bytes.length)) != -1){
  22. fos.write(bytes, 0, length);
  23. }
  24.  
  25. bos.close();
  26. fos.close();
  27. bis.close();
  28. is.close();
  29. } catch (IOException e) {
  30. e.printStackTrace();
  31. }
  32. }

这个方法直接将html保存在了文件夹src/temp_html/里面

在批量抓取网页的时候

都是先抓下来,保存为html或者json

然后在正则什么的进数据库

东西在本地了,自己想怎么搞就怎么搞

反爬虫关我什么事

上面两个方法都会造成一个问题

这个错误代表

这种爬虫方法太low逼

大部分网页都禁止了

所以,要加个头

就是UA

方法一那里的头部那里直接

.userAgent("Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; MALC)")

方法二间接加:

  1. URL temp = new URL(url);
  2. URLConnection uc = temp.openConnection();
  3. uc.addRequestProperty("User-Agent", "Mozilla/5.0 (iPad; U; CPU OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5");
  4. is = temp.openStream();

加了头部,几乎可以应付大部分网址了

-------------------------------我是快乐的分割线-------------------------------

将html下载到本地后需要解析啊

解析啊看这里啊

  1. //解析本地的html
  2. public static void Get_Localhtml(String path) {
  3.  
  4. //读取本地html的路径
  5. File file = new File(path);
  6. //生成一个数组用来存储这些路径下的文件名
  7. File[] array = file.listFiles();
  8. //写个循环读取这些文件的名字
  9.  
  10. for(int i=0;i<array.length;i++){
  11. try{
  12. if(array[i].isFile()){
  13. //文件名字
  14. System.out.println("正在解析网址:" + array[i].getName());
  15.  
  16. //下面开始解析本地的html
  17. Document doc = Jsoup.parse(array[i], "UTF-8");
  18. //得到html的所有东西
  19. Element content = doc.getElementById("content");
  20. //分离出html下<a>...</a>之间的所有东西
  21. Elements links = content.getElementsByTag("a");
  22. //Elements links = doc.select("a[href]");
  23. // 扩展名为.png的图片
  24. Elements pngs = doc.select("img[src$=.png]");
  25. // class等于masthead的div标签
  26. Element masthead = doc.select("div.masthead").first();
  27.  
  28. for (Element link : links) {
  29. //得到<a>...</a>里面的网址
  30. String linkHref = link.attr("href");
  31. //得到<a>...</a>里面的汉字
  32. String linkText = link.text();
  33. System.out.println(linkText);
  34. }
  35. }
  36. }catch (Exception e) {
  37. System.out.println("网址:" + array[i].getName() + "解析出错");
  38. e.printStackTrace();
  39. continue;
  40. }
  41. }
  42. }

文字配的很漂亮

就这样解析出来啦

主函数加上

  1. //main函数
  2. public static void main(String[] args) {
  3. String url = "http://www.cnblogs.com/TTyb/";
  4. String path = "src/temp_html/";
  5. Get_Localhtml(path);
  6. }

那么这个文件夹里面的所有的html都要被我解析掉

好啦

3天java1天爬虫的结果就是这样子咯

-------------------------------我是快乐的分割线-------------------------------

其实对于这两种爬取html的方法来说,最好结合在一起

作者测试过

方法二稳定性不足

方法一速度不好

所以自己改正

将方法一放到方法二的catch里面去

当方法二出现错误的时候就会用到方法一

但是当方法一也错误的时候就跳过吧

结合如下:

  1. import org.jsoup.Jsoup;
  2. import org.jsoup.nodes.Document;
  3. import org.jsoup.nodes.Element;
  4. import org.jsoup.select.Elements;
  5.  
  6. import java.io.BufferedInputStream;
  7. import java.io.BufferedOutputStream;
  8. import java.io.BufferedReader;
  9. import java.io.File;
  10. import java.io.FileOutputStream;
  11. import java.io.IOException;
  12. import java.io.InputStream;
  13. import java.io.InputStreamReader;
  14. import java.io.OutputStream;
  15. import java.io.OutputStreamWriter;
  16. import java.net.HttpURLConnection;
  17. import java.net.URL;
  18. import java.net.URLConnection;
  19. import java.util.Date;
  20. import java.text.SimpleDateFormat;
  21.  
  22. public class JavaSpider {
  23.  
  24. //将抓取的网页变成html文件,保存在本地
  25. public static void Save_Html(String url) {
  26. try {
  27. File dest = new File("src/temp_html/" + "我是名字.html");
  28. //接收字节输入流
  29. InputStream is;
  30. //字节输出流
  31. FileOutputStream fos = new FileOutputStream(dest);
  32.  
  33. URL temp = new URL(url);
  34. URLConnection uc = temp.openConnection();
  35. uc.addRequestProperty("User-Agent", "Mozilla/5.0 (iPad; U; CPU OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5");
  36. is = temp.openStream();
  37.  
  38. //为字节输入流加缓冲
  39. BufferedInputStream bis = new BufferedInputStream(is);
  40. //为字节输出流加缓冲
  41. BufferedOutputStream bos = new BufferedOutputStream(fos);
  42.  
  43. int length;
  44.  
  45. byte[] bytes = new byte[1024*20];
  46. while((length = bis.read(bytes, 0, bytes.length)) != -1){
  47. fos.write(bytes, 0, length);
  48. }
  49.  
  50. bos.close();
  51. fos.close();
  52. bis.close();
  53. is.close();
  54. } catch (IOException e) {
  55. e.printStackTrace();
  56. System.out.println("openStream流错误,跳转get流");
  57. //如果上面的那种方法解析错误
  58. //那么就用下面这一种方法解析
  59. try{
  60. Document doc = Jsoup.connect(url)
  61. .userAgent("Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; MALC)")
  62. .timeout(3000)
  63. .get();
  64.  
  65. File dest = new File("src/temp_html/" + "我是名字.html");
  66. if(!dest.exists())
  67. dest.createNewFile();
  68. FileOutputStream out=new FileOutputStream(dest,false);
  69. out.write(doc.toString().getBytes("utf-8"));
  70. out.close();
  71.  
  72. }catch (IOException E) {
  73. E.printStackTrace();
  74. System.out.println("get流错误,请检查网址是否正确");
  75. }
  76.  
  77. }
  78. }
  79.  
  80. //解析本地的html
  81. public static void Get_Localhtml(String path) {
  82.  
  83. //读取本地html的路径
  84. File file = new File(path);
  85. //生成一个数组用来存储这些路径下的文件名
  86. File[] array = file.listFiles();
  87. //写个循环读取这些文件的名字
  88.  
  89. for(int i=0;i<array.length;i++){
  90. try{
  91. if(array[i].isFile()){
  92. //文件名字
  93. System.out.println("正在解析网址:" + array[i].getName());
  94. //文件地址加文件名字
  95. //System.out.println("#####" + array[i]);
  96. //一样的文件地址加文件名字
  97. //System.out.println("*****" + array[i].getPath());
  98.  
  99. //下面开始解析本地的html
  100. Document doc = Jsoup.parse(array[i], "UTF-8");
  101. //得到html的所有东西
  102. Element content = doc.getElementById("content");
  103. //分离出html下<a>...</a>之间的所有东西
  104. Elements links = content.getElementsByTag("a");
  105. //Elements links = doc.select("a[href]");
  106. // 扩展名为.png的图片
  107. Elements pngs = doc.select("img[src$=.png]");
  108. // class等于masthead的div标签
  109. Element masthead = doc.select("div.masthead").first();
  110.  
  111. for (Element link : links) {
  112. //得到<a>...</a>里面的网址
  113. String linkHref = link.attr("href");
  114. //得到<a>...</a>里面的汉字
  115. String linkText = link.text();
  116. System.out.println(linkText);
  117. }
  118. }
  119. }catch (Exception e) {
  120. System.out.println("网址:" + array[i].getName() + "解析出错");
  121. e.printStackTrace();
  122. continue;
  123. }
  124. }
  125. }
  126. //main函数
  127. public static void main(String[] args) {
  128. String url = "http://www.cnblogs.com/TTyb/";
  129. String path = "src/temp_html/";
  130. //保存到本地的网页地址
  131. Save_Html(url);
  132. //解析本地的网页地址
  133. Get_Localhtml(path);
  134. }
  135. }

总的来说

java爬虫的方法比python的多好多

java的库真特么变态

java从零到变身爬虫大神(一)的更多相关文章

  1. java从零到变身爬虫大神

    刚开始先从最简单的爬虫逻辑入手 爬虫最简单的解析面真的是这样 import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import java. ...

  2. 【推荐】Java工程师如何从普通成为大神值得一读

    本文源自 http://www.hollischuang.com/archives/489 一点感悟 java作为一门编程语言,在各类编程语言中作为弄潮儿始终排在前三的位置,这充分肯定了java语言的 ...

  3. 从菜鸟到大神:Java高并发核心编程(连载视频)

    任何事情是有套路的,学习是如此, Java的学习,更是如此. 本文,为大家揭示 Java学习的套路 背景 Java高并发.分布式的中间件非常多,网上也有很多组件的源码视频.原理视频,汗牛塞屋了. 作为 ...

  4. 交流希望希望能得到一些大神的指点,加QQ群:249627436 java技术交流群

    查了好多资料,发现还是不全,干脆自己整理吧,至少保证在我的做法正确的,以免误导读者,也是给自己做个记录吧! 本人学习java,1年多,对一些基本技巧已掌握.为了使自己能力晋升建了一个QQ群:java交 ...

  5. 关于Java8 Stream流的利与弊 Java初学者,大神勿喷

    题目需求: 1:第一个队伍只要名字为3个字成员的姓名,存储到新集合 2:第一个队伍筛选之后只要前3人:存储到一个新集合 3:第2个队伍只要姓张的成员姓名:存储到一个新集合 4:第2个队伍不要前2人,存 ...

  6. 大神教你零基础学PS,30堂课从入门到精通

    ps视频教程,ps自学视频教程.ps免费视频教程下载,大神教你零基础学PS教程视频内容较大,分为俩部分: 大神教你零基础学PS--30堂课从入门到精通第一部分:百度网盘,https://pan.bai ...

  7. java大神进阶之路

    既然励志在java路上走的更远,那就必须了解java的路径.先看图 更加细化的细节如下 一: 编程基础 不管是C还是C++,不管是Java还是PHP,想成为一名合格的程序员,基本的数据结构和算法基础还 ...

  8. 一个4年工作经验的java程序员的困惑,怎样才能能为一个架构师,请教大神

    一个4年工作经验的java程序员的困惑,怎样才能能为一个架构师 LZ本人想往架构师发展, 业余时间也会看一些书籍, 但是感觉没有头绪, 有些书看了,也没有地方实践 我做了4年的java开发, 在一个公 ...

  9. 学习 Doug Lea 大神写的——Scalable IO in Java

    学习 Doug Lea 大神写的--Scalable IO in Java 网络服务 Web services.分布式对象等等都具有相同的处理结构 Read request Decode reques ...

随机推荐

  1. 对于我的linux常用命令的说明

    我所列出的linux常用命令中的选项并不是全部的选项,是一些我们经常用到的linux命令及选项

  2. 三色二叉树_树形DP

    Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem Description 一棵二叉树可以按照如下规则表示成一个由0.1.2组成的字符序 ...

  3. HDU 3047

    http://acm.hdu.edu.cn/showproblem.php?pid=3047 和hdu 3038以及poj那个食物链一样,都是带权并查集,此题做法和hdu 3038完全相同,具体操作看 ...

  4. Asp.net操作Excel----NPOI!!!!1

    前言 Asp.net操作Excel已经是老生长谈的事情了,可下面我说的这个NPOI操作Excel,应该是最好的方案了,没有之一,使 用NPOI能够帮助开发者在没有安装微软Office的情况下读写Off ...

  5. I.MX6 SHT20 Linux 驱动移植

    /*********************************************************************** * I.MX6 SHT20 Linux 驱动移植 * ...

  6. 本地日志数据实时接入到hadoop集群的数据接入方案

    1. 概述 本手册主要介绍了,一个将传统数据接入到Hadoop集群的数据接入方案和实施方法.供数据接入和集群运维人员参考. 1.1.  整体方案 Flume作为日志收集工具,监控一个文件目录或者一个文 ...

  7. What are the 10 algorithms one must know in order to solve most algorithm challenges/puzzles?

    QUESTION : What are the 10 algorithms one must know in order to solve most algorithm challenges/puzz ...

  8. (基础篇)PHP获取时间、时间戳的各种格式写法汇总

    1.获取当前时间方法date() 很简单,这就是获取时间的方法,格式为:date($format, $timestamp),format为格式.timestamp为时间戳–可填参数. 2.获取时间戳方 ...

  9. UVa 10810 - Ultra-QuickSort

    题目大意:给出一个数列,每次交换相邻数字,求排成递增序的最少交换次数. 分析:求逆序数,合并排序 #include<cstdio>#include<cstring>#inclu ...

  10. int integer string间的转换

    1.int-->Integer new Integer(i); 2.Integer-->int Integer i = new Integer(1); int k = i.intValue ...