Java网络爬虫基础和抓取网站数据的两个小实例

来源:互联网 发布:js 视频播放插件 编辑:程序博客网 时间:2024/06/05 19:33

前段时间在学习爬虫,并从网络抓取了一些简单的数据,记录一下。

抓取分成下面3个部分:

1、网络请求

2、解析抓取下来的页面,并且处理乱码或者解压代码的问题

3、拿到指定的数据、资源

完整代码如下:

第一个实例:

[java] view plain copy
  1. /** 
  2.      * 从某网站查找所有帖子标题 
  3.      * 把所有标题和链接存放在txt文件里面 
  4.      */  
  5.     public static Map<String, String> parseClPage(){  
  6.         String html = "http://cl.xxxx/thread0806.php"; // 解析的网站域名  
  7.         String currentuserdesktop = System.getProperty("user.home")+"\\Desktop";  // 获取操作系统为windows的桌面路径  
  8.         Map<String, String> resultMap = new TreeMap<String, String>(); // 结果-链接  
  9.         Document doc = null;  
  10.         try {  
  11.             for (int i = 0; i < 199; i++) { // 设置扫描的页数范围  
  12.                 StringBuffer htmlCode = new StringBuffer("");  
  13.                 HttpMethod httpMethod = new GetMethod("http://cl.xxxx/thread0806.php?fid=7&search=&page="+(i+1));  
  14.                 HttpClient client = new HttpClient(); // 以下是设置网络请求的头信息,可以直接用浏览器的头信息  
  15.                 httpMethod.addRequestHeader("Accept""text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");  
  16.                 httpMethod.addRequestHeader("Accept-Encoding""gzip, deflate, sdch");  
  17.                 httpMethod.addRequestHeader("Accept-Language""zh-CN,zh;q=0.8");  
  18.                 httpMethod.addRequestHeader("Referer""http://cl.clvv.biz/thread0806.php?fid=7");  
  19.                 httpMethod.addRequestHeader("HTTPS""1");  
  20.                 httpMethod.addRequestHeader("Connection""keep-alive");  
  21.                 httpMethod.addRequestHeader("Host""cl.clvv.biz");  
  22.                 httpMethod.addRequestHeader("User-Agent""Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.99 Safari/537.36ozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.99 Safari/537.36");  
  23.                 client.setTimeout(3000);  
  24.                 client.executeMethod(httpMethod);  
  25.                 InputStream inputStream = httpMethod.getResponseBodyAsStream();// 得到网络请求返回的HTML流  
  26.                 GZIPInputStream gzipInputStream = new GZIPInputStream(inputStream);// 解压压缩的HTML流,解压方式是GZIP  
  27.                 InputStreamReader inputStreamReader = new InputStreamReader(gzipInputStream,Charset.forName("gb2312")); // 转码  
  28.                 BufferedReader bin21 = new BufferedReader(inputStreamReader);  
  29.                 while(bin21.readLine()!=null){  
  30.                     String line = bin21.readLine();  
  31.                     htmlCode.append(line);  
  32.                 }  
  33.                 doc = Jsoup.parse(htmlCode.toString()); // 解析html用的是操作较简单的jsoup包  
  34.                 Elements elementsTr = doc.select("table tr"); // 用jQuery方式解析特定的数据域  
  35.                 for (Element element : elementsTr) {  
  36.                     String title = element.select("td").eq(1).select("h3 a").text();  
  37.                     if(null!=title && !"".equals(title)){  
  38.                         String link = "http://cl.xxxx/"+element.select("td").eq(1).select("h3 a").attr("href");  
  39.                         // 文件流  
  40.                         writefiletotxt((new FileWriter(currentuserdesktop+"\\查找结果.txt",true)),("标题:"+title+"\t链接:"+link+"\r\n"));  
  41.                     }  
  42.                 }  
  43.                 // 释放链接  
  44.                 httpMethod.abort();  
  45.                 httpMethod.releaseConnection();  
  46.             }  
  47.             System.out.println("done--");  
  48.         } catch (Exception e) {  
  49.             e.printStackTrace();  
  50.         }  
  51.         return resultMap;  
  52.     }  
  53.     public static void writefiletotxt(FileWriter fw,String result){  
  54.         try {  
  55.             fw.write(result);  
  56.             fw.flush();  
  57.             fw.close();  
  58.         } catch (IOException e) {  
  59.             e.printStackTrace();  
  60.         }  
  61.     }  

第二个实例:抓取网站图片。思路和第一个差不多

[java] view plain copy
  1. /** 
  2.  * @author 高攀 
  3.  * @上午9:58:01 
  4.  */  
  5. public class CatchImages {  
  6.       
  7.     private static String curdesktop = System.getProperty("user.home")+"\\Desktop\\CatchImages\\";  
  8.       
  9.     public static void main(String[] args) {  
  10.         doCatch("http://item.jd.com/716240.html");  
  11.     }  
  12.       
  13.     // 网络请求并且拿到图片链接  
  14.     public static Integer doCatch(String site){  
  15.         GetMethod method = new GetMethod(site);  
  16.         HttpClient client = new HttpClient();  
  17.           
  18.         try {  
  19.             method.addRequestHeader("Accept""text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");  
  20. //          method.addRequestHeader("Accept-Encoding", "gzip, deflate, sdch");  
  21.             method.addRequestHeader("Accept-Language""zh-CN,zh;q=0.8");  
  22.             method.addRequestHeader("Avail-Dictionary""XprLfaXG");  
  23.             method.addRequestHeader("Cache-Control""max-age=0");  
  24.             method.addRequestHeader("Connection""keep-alive");  
  25.             method.addRequestHeader("Cookie""");  
  26.             method.addRequestHeader("Host""user.qzone.qq.com");  
  27.             method.addRequestHeader("If-Modified-Since""Thu, 24 Sep 2015 02:55:30 GMT");  
  28.             method.addRequestHeader("Upgrade-Insecure-Requests""1");  
  29.             method.addRequestHeader("User-Agent""Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.99 Safari/537.36ozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.99 Safari/537.36");  
  30.               
  31.             client.executeMethod(method);  
  32.             String htmlCode = method.getResponseBodyAsString();  
  33.             // 得到所有的img标签的链接  
  34.             Document doc = Jsoup.parse(htmlCode);  
  35.             Elements elementImg = doc.select("body img");  
  36.             for (Element element : elementImg) {  
  37.                 String src = element.attr("src");  
  38.                 if(src.contains("http")){ // 绝对路径就不变  
  39.                       
  40.                 }else { // 否则变成绝对路径  
  41.                     String rootUrl = HTMLParserHelper.getRootUrl(site); // 得到根路径  
  42.                     // 加上跟路径  
  43.                     src = rootUrl+src;  
  44.                 }  
  45.                 System.out.println(src);  
  46.                 downloadImage(src);  
  47.                 System.out.println("ok");  
  48.             }  
  49.             System.out.println(elementImg.size()+" result catched.");  
  50.         } catch (Exception e) {  
  51.             e.printStackTrace();  
  52.         } finally{  
  53.             method.abort();  
  54.             method.releaseConnection();  
  55.         }  
  56.         return 0;  
  57.     }  
  58.   
  59.     // 下载图片的方法  
  60.     public static void downloadImage(String imageUrl){  
  61.         GetMethod method = new GetMethod(imageUrl);  
  62.         HttpClient client = new HttpClient();  
  63.         try {  
  64.             client.executeMethod(method);  
  65.             InputStream inputStream = method.getResponseBodyAsStream();  
  66.               
  67.             File file = new File(curdesktop);  
  68.             if(!file.exists()){  
  69.                 try {  
  70.                     file.mkdir();  
  71.                 } catch (Exception e) {  
  72.                     e.printStackTrace();  
  73.                 }  
  74.             }  
  75.               
  76.             byte b[] = {1};  
  77.             int size = 0;  
  78.             FileOutputStream outputStream = new FileOutputStream(new File(curdesktop+HTMLParserHelper.getImageNameAndHouzui(imageUrl)));  
  79.             while((size=inputStream.read(b))!=-1){  
  80.                 outputStream.write(b, 0, size);  
  81.             }  
  82.             outputStream.close();  
  83.         } catch (Exception e) {  
  84.             e.printStackTrace();  
  85.         } finally{  
  86.             // 释放链接  
  87.             method.abort();  
  88.             method.releaseConnection();  
  89.         }  
  90.           
  91.     }  
  92. }