Javaクローラーの解析例

黄舟
リリース: 2017-09-16 10:48:59
オリジナル
1828 人が閲覧しました

まず、この記事を読んだ後、マスターになれることを保証するものではありませんが、クローラーとは何か、クローラーの使用方法、http プロトコルを使用して他の人のシステムに侵入する方法を理解することができます。もちろん、これは単なる簡単なチュートリアルであり、いくつかの簡単なデータを取得できます。

コードから始めて、ステップごとに説明しましょう:

これはツール クラスです。 http リクエストを送信するためのツール クラスはインターネット上のどこにでも見つかります。 -------------区切り線

トピックに入りましょう: まず、Web サイトのログイン ページをクロールし、ページのソース コードを確認し、ログイン要求を送信するためのメソッド名。一般に、小規模な Web サイトでは from surface アクションに直接記述されるため、簡単に見つけることができますが、中規模の Web サイトではこれは記述されません。非常に簡単ですが、見つけるのに少し手間がかかります。 js にある場合もあれば、このページにない場合もあります。大規模な Web サイトの場合は、パケット キャプチャ ツールを使用して、キャプチャされたリクエスト情報を確認することをお勧めします。ブラウザに付属の f12 を押しても、すぐにログイン情報が取得できませんでした。最終的に、JD.com のログイン インターフェイスを取得することができました。インターフェースアドレス; コードをアップロードしました

String data =HttpPosts.sendGet(ログインアドレス (パラメータなし; 文字列型アドレス), パラメータ (user_id=6853&export=112)); (返されるログインステータスは通常、json 形式です)ログインに成功したかどうかがカウントされます。状況に応じて true のものもあれば、1 のものもある) 取得または投稿を選択し、ログイン ページのリクエストを真似します

次に、Cookie を取得するための別のリクエストを作成します

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;
       }       
}
ログイン後にコピー

get メソッドまたは post メソッドに動的に渡される Cookie について話し、ハードコーディングされた Cookie を置き換えます。これはテストであるため、Cookie は動的に書き込むことができます

その後、それを削除する必要があります。ログイン後のページ、ホームページ、またはデータ ページには Cookie と http リクエストの基本パラメータ情報が含まれている必要があります。そうでない場合は、確実にインターセプトされます。

String data=HttpPosts.sendGet(ログインアドレス(パラメータなし; 文字列型アドレス), パラメータ(例: user_id=6853&export=112)); 今回のアクセス方法は上記と同じで、ページが返されます。反対側にデータ インターフェイスが見つかった場合は、そのインターフェイスに直接アクセスでき、データが直接返されます。そうでない場合は、そのページを解析する必要があります。これは非常に面倒です。 Jsoup は通常、ページを解析するために使用されます。

実際、これは別の種類の侵入であり、相手のインターフェイス ドキュメントを知る必要はありません。http プロトコルを使用して相手のサーバーに直接アクセスできます。

以上がJavaクローラーの解析例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート