首頁 > Java > java教程 > 主體

Java爬蟲的實例分析

黄舟
發布: 2017-09-16 10:48:59
原創
1825 人瀏覽過

首先,看完這篇文章,不能保證你成為大神,但是卻可以讓你懂得什麼是爬蟲,如何使用爬蟲,如何利用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中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板