首先,看完這篇文章,不能保證你成為大神,但是卻可以讓你懂得什麼是爬蟲,如何使用爬蟲,如何利用http協議,侵入別人的系統,當然只是一些簡單的教程,拿到一些簡單的資料;
先上程式碼,在一步一步講解:
這是一個工具類,不用詳細看,網路上哪裡都能找到發送http請求的工具類,少包自己導
package com.df.util; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; import org.jsoup.Connection; import org.jsoup.Connection.Method; import org.jsoup.Connection.Response; import org.jsoup.Jsoup; import com.df.controller.DFContorller; public class HttpPosts { private final static Logger logger = Logger.getLogger(DFContorller.class); public static String sendPost(String url, String param) { PrintWriter out = null; BufferedReader in = null; String result = ""; try { URL realUrl = new URL(url); // 打开和URL之间的连接 URLConnection conn = realUrl.openConnection(); // 设置通用的请求属性 conn.setRequestProperty("accept", "*/*"); conn.setRequestProperty("connection", "Keep-Alive"); conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); // 发送POST请求必须设置如下两行 conn.setDoOutput(true); conn.setDoInput(true); // 获取URLConnection对象对应的输出流 out = new PrintWriter(conn.getOutputStream()); // 发送请求参数 out.print(param); // flush输出流的缓冲 out.flush(); // 定义BufferedReader输入流来读取URL的响应 in = new BufferedReader( new InputStreamReader(conn.getInputStream(),"utf-8")); String line; while ((line = in.readLine()) != null) { result += line; } } catch (Exception e) { logger.info("发送 POST 请求出现异常!"+e); e.printStackTrace(); } //使用finally块来关闭输出流、输入流 finally{ try{ if(out!=null){ out.close(); } if(in!=null){ in.close(); } } catch(IOException ex){ ex.printStackTrace(); } } return result; } public static String sendGet(String url, String param) { String result = ""; BufferedReader in = null; try { String urlNameString = url + "?" + param; URL realUrl = new URL(urlNameString); // 打开和URL之间的连接 URLConnection connection = realUrl.openConnection(); // 设置通用的请求属性 connection.setRequestProperty("accept", "*/*"); connection.setRequestProperty("connection", "Keep-Alive"); connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); connection.setRequestProperty("Cookie","PHPSESSID=27roc4d0ccd2cg4jbht80k8km2"); // 建立实际的连接 connection.connect(); // 获取所有响应头字段 Map<String, List<String>> map = connection.getHeaderFields(); // 遍历所有的响应头字段 for (String key : map.keySet()) { System.out.println(key + "--->" + map.get(key)); } // 定义 BufferedReader输入流来读取URL的响应 in = new BufferedReader(new InputStreamReader( connection.getInputStream(),"utf-8")); String line; while ((line = in.readLine()) != null) { result += line; } } catch (Exception e) { System.out.println("发送GET请求出现异常!" + e); e.printStackTrace(); } // 使用finally块来关闭输入流 finally { try { if (in != null) { in.close(); } } catch (Exception e2) { e2.printStackTrace(); } } return result; } }
---------------------------------------分割線
下面進入主題:首先你要先進入,你要去爬取網站的登入頁面,查看頁面原始碼,找到登入請求發送的方法名稱;一般來所,小型網站會直接寫在from表面action裡面,很容易找得到,中型的網站就不會寫的這麼直接了,找起來要費些功夫,可能在js裡面,也可能不在這個頁面,推薦使用抓包工具登陸一次,看抓到的請求信息,大型的網站,本人爬取過的京東商城後台,用遊覽器自帶的f12,抓不到登錄的信息,一閃即逝,最後想了很多招才搞到京東的登入介面;實作爬去;拿到了登入介面位址後;上碼
String data=HttpPosts.sendGet(登入位址(不含參數;String類型位址),參數(如:user_id=6853&export =112));(回傳的登入狀態,一般是json格式,他會高數你是否登入成功,有的是true,有的是1,視情況而定)選擇get還是post,模仿登入頁面的請求
然後再來一個請求獲取cookie
Connection conn = Jsoup.connect("登录后页面的地址"); conn.method(Method.GET); conn.followRedirects(false); Response response = conn.execute(); System.out.println(response.cookies());
再講cookie動態傳入get或post方法裡面替換到寫死的cookie;因為是測試所以寫死了cookie,可以寫成動態的;
之後再掉你要訪問登入之後的頁面,主頁,或是資料頁面,裡面一定要攜帶cookie,和http請求的基本參數訊息,不然一定會被攔截的。
String data=HttpPosts.sendGet(登入位址(不含參數;String類型位址),參數(如:user_id=6853&export=112));存取方法同上;這回給你回傳的就是他們的頁面了,如何你找到了對面的某個數據接口,那就可以直接訪問他,返回的就直接是數據,不然你還要解析,他的頁面,很麻煩的。解析頁面一般用jsoup。
其實這個等於另類的入侵,不需要知道對方的介面文檔,用程式利用http協定直接存取對方的伺服器,
以上是Java爬蟲的實例分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!