最近一直在做java爬蟲,有些感悟心得,分享給大家;


首先,看完這篇文章,不能保證你成為大神,但是卻可以讓你懂得什么是爬蟲,如何使用爬蟲,如何利用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協議直接訪問對方的服務器,

拿到你想要的東西。當然有驗證碼的情況下,是很難的。這是爬蟲基礎。只是一帶而過,講的有些片面,不到之處多多海涵;

請為我點贊 thankyou

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM