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协议直接访问对方的服务器,

以上就是Java爬虫的实例分析的详细内容,更多请关注其它相关文章!

生气是拿别人做错的事来惩罚自己

Java爬虫的实例分析

相关文章:

你感兴趣的文章:

标签云: