>  기사  >  Java  >  Java 크롤러 분석 예

Java 크롤러 분석 예

黄舟
黄舟원래의
2017-09-16 10:48:591816검색

우선, 이 글을 읽고 나면 마스터가 될 것이라는 보장은 없지만 크롤러가 무엇인지, 크롤러를 어떻게 사용하는지, 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 표면 작업에 직접 작성하므로 찾기 쉽지만 중간 규모 웹사이트에서는 작성하지 않습니다. 매우 간단하지만 찾는 데 약간의 노력이 필요합니다. js에 있을 수도 있고, 이 페이지에 없을 수도 있습니다. 일단 로그인해서 캡처된 요청 정보를 보려면 패킷 캡처 도구를 사용하는 것이 좋습니다. 브라우저와 함께 제공되는 f12에서 로그인 정보를 얻을 수 없었습니다. 결국 JD.com의 로그인 인터페이스를 얻기 위해 많은 트릭을 시도했습니다. 인터페이스 주소; 코드를 업로드했습니다.

String data =HttpPosts.sendGet(로그인 주소(매개변수 없음, 문자열 유형 주소), 매개변수(예: user_id=6853&export=112))(반환된 로그인 상태는 일반적으로 json 형식입니다. . 성공적으로 로그인했는지 여부가 계산됩니다. 상황에 따라 일부는 true이고 일부는 1입니다. 가져오기 또는 게시를 선택하고 로그인 페이지의 요청을 모방하세요

그런 다음 쿠키를 가져오기 위해 또 다른 요청을 하세요

Connection conn = Jsoup.connect("登录后页面的地址");  
          conn.method(Method.GET);  
          conn.followRedirects(false);  
          Response response = conn.execute();  
          System.out.println(response.cookies());

get 또는 post 메소드에 동적으로 전달된 쿠키에 대해 이야기하고 하드 코딩된 쿠키를 교체하십시오. 왜냐하면 쿠키가 하드 작성되어 동적으로 작성될 수 있기 때문입니다.

그런 다음 삭제해야 합니다. 로그인 후 페이지, 홈페이지 또는 데이터 페이지에는 쿠키와 http 요청의 기본 매개변수 정보가 포함되어야 합니다. 그렇지 않으면 반드시 차단됩니다.

String data=HttpPosts.sendGet(로그인 주소(매개변수 없음, 문자열 유형 주소), 매개변수(예: user_id=6853&export=112)) 액세스 방법은 위와 동일하며 해당 페이지가 반환됩니다. 반대편에서 특정 데이터 인터페이스를 찾으면 해당 인터페이스에 직접 액세스할 수 있으며 반환된 데이터는 직접 데이터가 됩니다. 그렇지 않으면 해당 페이지를 구문 분석해야 하는데 이는 매우 번거로운 작업입니다. Jsoup은 일반적으로 페이지를 구문 분석하는 데 사용됩니다.

사실 이것은 다른 종류의 침입입니다. 상대방의 인터페이스 문서를 알 필요는 없지만 http 프로토콜을 사용하여 상대방의 서버에 직접 액세스할 수 있습니다.

위 내용은 Java 크롤러 분석 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.