java 抓取网站数据
假设你需要获取51job 人才网上java 人才的需求数量,首先你需要分析51job 网站的搜索这
一块是怎么运作的,通过解析网页的源代码,我们发现了以下一些信息:
1. 搜索时页面请求的URL search.51job/jobsearch/search_result.php
2. 请求所用的方法为:POST
3. 返回的页面的编码格式为:GBK
4. 假设我们想获取搜索java 人才时结果页面中显示的需求数量,我们发现数量位于返回的
HTML 数据中这样的一段代码之中:<td>1-30 / 14794</td>,于是我们可以得到这样的一个
模式:".+1-\d+ / (\d+).+",第一个分组的内容就是我们需要的最终数据,有关java 中的模式,
请参考java 文档中Pattern 类的介绍
5. 另外做为POST 请求,页面向服务器发送的数据如下(这个很容易能过prototype 这样的js
框架抓取到, 参考我的其它博客介绍)
lang=c&stype=1&postchannel=0000&fromType=1&line=&keywordtype=2&keyword=java&btnJ
obarea=%E9%80%89%E6%8B%A9%E5%9C%B0%E5%8C%BA&jobarea=0000&image=&btn
Funtype=%E9%80%89%E6%8B%A9%2F%E4%BF%AE%E6%94%B9&funtype=0000&btnInd
ustrytype=%E9%80%89%E6%8B%A9%2F%E4%BF%AE%E6%94%B9&industrytype=00
对于第5 条中的数据哪些是服务器真正需要的我们不管,全部发送过去就是了。有了这些准
备,我们就可以真正开始通过java 发送请求,并获得最终数据了。
我们定义Resource 类,这个类封装所有的与请求有关的信息,Resource 包括以下属性:
view plaincopy to clipboardprint?
/**
* 需要获取资源的目标地址,不包含查询串
*/
private String target;
/**
* get 请求时的查询串,或post 请求的请求数据
*/
private String queryData = "";
/**
* 请求方式,get / post
*/
private String method = "GET";
/**
* 返回的数据的编码类型
*/
private String charset = "GBK";
/**
* 抓取数据的模式,将根据模式的分组来返回数据列表
*/
private String pattern;
/**
* 需要获取资源的目标地址,不包含查询串
*/
private String target;
/**
* get 请求时的查询串,或post 请求的请求数据
*/
private String queryData = "";
/**
* 请求方式,get / post
*/
private String method = "GET";
/**
* 返回的数据的编码类型
*/
private String charset = "GBK";
/**
* 抓取数据的模式,将根据模式的分组来返回数据列表
*/
private String pattern;
以下为抓取内容的代码:
view plaincopy to clipboardprint?
//假设以下代码中res 对象封装了所有的请求信息。
//URL 指向目的地。
//Target 返回目标地址,且当为get 请求时,这个地址包含了查询串的信息
URL url = new Target());
HttpURLConnection con = (HttpURLConnection) url.openConnection(); //建立到目的地的联接
con.Method()); //设置请求的方法
//设置HTTP 请求头信息
con.setRequestProperty("accept", "*/*");
con.setRequestProperty("connection", "Keep-Alive");
con.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
con.setDoInput(true);
if (Method().equals("POST")) { //如果为Post 请求则发送请求数据
con.setDoOutput(true);
OutputStream().QueryData().getBytes());
OutputStream().flush();
}
//通过BufferedReader 一行行的读取数据,如果你需要的是全部返回结果,可以修改一下这
BufferedReader br = new BufferedReader(new InputStreamReader(
InputStream(), Charset()));
Pattern pattern = Pattern());
String s = null;
while ((s = br.readLine()) != null) {
System.out.println(s);
Matcher m = pattern.matcher(s); //检测当前行是否与要求结果的模式相匹配
boolean b = m.matches();
if (! b) {
continue;
}
int size = m.groupCount();
List result = new ArrayList(size);
for(int i=0; i result.up(i+1)); //如果有多个分组,则取出所有分组,并把最终
结果做为列表返回
}
return result;
}
远程抓取页面信息并解析XML
XmlTransfer.java 负责链接对方服务器
package untitled1;
import java.URL;
import java.URLConnection;
import java.HttpURLConnection;
import java.MalformedURLException;getattribute方法返回类型
import java.ProtocolException;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import org.w3c.dom.*;
l.parsers.*;
public class XmlTransfer{
private String urlAddr;
private String xmlStr;
HttpURLConnection urlCon = null;
public XmlTransfer(String _urlAddr,String _xmlStr) {
this.urlAddr = _urlAddr;
lStr = _xmlStr;
}
public InputStream get() throws Exception
{
if(urlCon==null){urlCon=getUrlConnection();}
if(urlCon==null){throw new Exception("连接失败");}
PrintWriter out = new OutputStream());
out.print(xmlStr);
out.flush();
out.close();
urlCon.disconnect();
InputStream fin1 = InputStream();
return fin1;
}
private HttpURLConnection getUrlConnection(){
try{
URL url = new URL(urlAddr);
URLConnection conn = url.openConnection();
urlCon = (HttpURLConnection)conn;
urlCon.setRequestProperty("Content-type", "text/html;charset=gb2312");
urlCon.setDoOutput(true);
urlCon.setRequestMethod("GET");
urlCon.setUseCaches(false);
}
catch (MalformedURLException mex) {
mex.printStackTrace();
}
catch (ProtocolException pex) {
pex.printStackTrace();
}
catch (IOException iex) {
iex.printStackTrace();
}
return urlCon;
}
public static String getHttp( String strURL ){
XmlTransfer xt=new XmlTransfer(strURL,"");
StringBuffer sb = new StringBuffer();
try{
InputStream is = xt.get();
byte[] b = new byte[1024];
int iCount = 0;
while ((iCount = is.read(b)) > 0) {

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。