先上代码,在一步一步讲解:
这是一个工具类,不用详细看,网上哪里都能找到发送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爬虫的实例分析的详细内容。