使用Java访问一般网页,进行数据抓取等比较简单,直接用URL和URLConnection连接所需要的网站地址即可,然后对返回的html源码进行处理分析,获取感兴趣的内容。
不过如果是需要登录后才能访问的网页就不能直接传入网站url进行连接了,一般网页会自动跳转到登录页面,要求先登录。
另外,即使先在登录页面进行了登录,然后再转到要登录才能访问的网页时,如果没在第二次连接中加入之前登录成功后的session,那么访问仍然会失败。URLConnection每次打开一个连接,如果不进行设置,则默认会以新的session去访问,那么相当于又需要重新登录,因此需要加入登录成功的session才能访问到需要登录的页面。
以下通过一个小例子来说明该如何操作:
1.首先找到登录界面
2.查看表单提交给哪个action
3.来到单一的表单提交页面
4.修改表单提交方式为get
5.随便输入用户名和密码后浏览器的地址栏就有这么一串地址,只要把user和password改成正确的,那么直接在浏览器输入这串地址就直接登录,类似的,直接用URLConnetion打开这串数据的连接即实现了登录,获取服务器返回过来的session,下次再连接该网站的别的需要登录的页面时带上这个session即可成功访问了。
代码如下(具体网站地址已隐去):
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
public class Test
{
public static void main(String[] args) throws Exception//以下仅举个小例子,不处理异常
{
String id="xxxxx";
String passwd="xxxxx";
String loginUrl="http://xxxxx/login.aspx?__VIEWSTATE=dDw2Nzg5Mjk2NTY7O2w8b2s7Pj5OOk%2B5QUCLHuIzBtlhui5aZbY11Q%3D%3D&txt_user="+id+"&txt_password="+passwd+"&ok.x=35&ok.y=12";
URL url = new URL(loginUrl);
URLConnection conn = url.openConnection();
String sessionValue = conn.getHeaderField("Set-Cookie");//获取session值
String[] sessionId = sessionValue.split(";");
URL newUrl = new URL("http://xxxxx/student_info1.aspx");
URLConnection newConn = newUrl.openConnection();
newConn.setRequestProperty("Cookie", sessionId[0]);
newConn.connect();
BufferedInputStream bis = new BufferedInputStream(newConn.getInputStream());
InputStreamReader inputStreamReader = new InputStreamReader(bis,"utf-8");
BufferedReader br = new BufferedReader(inputStreamReader);
String str = null;
while ((str = br.readLine()) != null)
{
System.out.println(str);//输出登录后才能访问的网页的html源码,可以根据需要获取相关信息
}
}
}