众所周知,网络爬虫的最基本原理就是模拟HTTP协议向指定网站发送请求,从而从服务器端返回的网页源代码中抽取具有实用价值的信息(也可能下一次任务队列的地址)。这中间涉及到很多算法,根据网站不同域名,网站网页更新速度,网站结构深度,设定爬虫不同的爬取策略。爬虫可以从一些简单的网站上直接获取网页源代码,从而对网页源代码进行分析。但是对于一些需要用户登录的网站,要抓取网站当中被保护的数据具有一定的困难。今天要说就是一个从需要登录的网站上获取收保护数据的方法。
按照现实生活中的方法,需要获取这些数据,我们首先需要登录这个网站,然后才能访问这个网站当中受保护的数据。好了,话题回来,我们想想,在服务器端网站是如何记录当前用户是否合法(是否已经登录了呢),很简单撒,session,这个我想是大家肯定都知道的方法了。原理很简单,我们访问一个网站,网站在我们首次访问的时候,会返回一个cookies信息。这个信息相当于我们在这个网站的一个登录信息。我们每次访问该网站的时候需要带上这个cookies信息,以便让该网站很容易的识别我们先前已经登录该网站了。
其实步骤很简单,我们需要访问该网站,获取和这个网站会话的cookies信息。然后带这个这个合法的cookies信息重新登录该网站,登录成功后,会在服务器端产生一个保存用户信息的session。以后我们只需每次访问该网站带上合法的cookies信息,服务器端会根据cookies来判别我们是否是合法用户(当前用户信息是否存在session当中)。如果合法我们就可以顺利获取该受保护的网站内容。
用java来实现一个简单的代码。从指定网站当中获取需要的cookies信息
URL url_con;
HttpURLConnection http_con = null;
try {
url_con = new URL(url);
http_con = (HttpURLConnection) url_con.openConnection();
//构造请求信息,对于安全性稍微高一些的网站,构造此类的请求头信息是必须的,第一次请求不带正确的cookies信息
http_con.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-CN; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)");
http_con.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
http_con.setRequestProperty("Accept-Charset", "GB2312,utf-8;q=0.7,*;q=0.7");
http_con.setRequestProperty("Accept-Language", "zh-cn,zh;q=0.5");
http_con.setRequestProperty("Host", "search.cnipr.com");
http_con.setRequestProperty("Accept-Encoding", "gzip,deflate");
http_con.setRequestProperty("Keep-Alive", "300");
http_con.setRequestProperty("Connection", "keep-alive");
http_con.setRequestProperty("Cookie", "cizi=2");
http_con.setRequestProperty("Referer","http://www.cnipr.com/top_js.htm");
//设置请求方式为get请求
http_con.setDoInput(true);
http_con.setDoOutput(true);
http_con.setRequestMethod("GET");
//建立和服务器之间的连接。
http_con.connect();
String cookieVal = http_con.getHeaderField("Set-Cookie");
//获取服务器端传回的jsessionId(对于使用tomcat内核的服务器一般传回此类值)值
if (cookieVal != null) {
cookiesId = cookieVal.substring(0, cookieVal.indexOf(";"));
}
} catch (Exception e) {
e.printStackTrace();
getCookies() ;
}
很简单,我们获得cookies以后呢,重新登录该网站,当然别忘了在HTTP请求头加上需要的cookies信息啊。就是我们获取的cookiesId。这样就可以顺利登录。以后每次请求都需要带上该ID。这样我们就可以抓取需要的网页信息