java怎么抓取网页_java网页数据抓取实例

packagecom.jointsky.jointframe.weather.utils;importjava.io.BufferedReader;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.net.HttpURLConnection;importjava.net.URL;importjava.text.SimpleDateFormat;importjava.util.ArrayList;importjava.util.Date;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjava.util.regex.Matcher;importjava.util.regex.Pattern;importorg.apache.commons.lang.StringUtils;importcom.jointsky.jointframe.weather.entity.ActuallyForecastWeather;importcom.jointsky.jointframe.weather.entity.ActuallyWeather;/***

Description:实况天气资料工具类

*/

public classUrlInfo {/*** 生成一个Pattern,同时编译一个正则表达式*/

private static Pattern proInfo = Pattern.compile("(.*?)", Pattern.DOTALL);/*** 宁夏区县编码(总乡镇数190)

* 银川{市辖区(11个乡镇):53614;贺兰县(7):53610;永宁县(8):53618;灵武市(8):53619}*/

private static String countyCodes = "53614,53610,53618,53619";/*** 获取实况天气(当天)数据的方法

*@paramurlInfo

*@paramcharset

*@return*@throwsException*/

public static List getURLInfoOfActully(String urlInfo,String charset) throwsException {

String info=getUrlInfo(urlInfo);//获得网页源码(0是当天)

return getDataStructure(info,0);

}/*** 获取实况天气(预报)数据的方法

*@paramurlInfo

*@paramcharset

*@return*@throwsException*/

public static List getURLInfoOfForecast(String urlInfo,String charset) throwsException {

String info=getUrlInfo(urlInfo);//获得网页源码(1是预报)

return getDataStructure(info,1);

}/*** 网页信息

*@paramurlInfo

*@return*@throwsException*/

public static String getUrlInfo(String urlInfo) throwsException {//读取目的网页URL地址,获取网页源码

URL url = newURL(urlInfo);

HttpURLConnection httpUrl=(HttpURLConnection)url.openConnection();

InputStream is=httpUrl.getInputStream();

BufferedReader br= new BufferedReader(new InputStreamReader(is,"utf-8"));

StringBuilder sb= newStringBuilder();

String line;while ((line = br.readLine()) != null) {//这里是对链接进行处理

line = line.replaceAll("?a[^>]*>", "");//这里是对样式进行处理

line = line.replaceAll("]*>", "");

sb.append(line);

}

is.close();

br.close();returnsb.toString().trim();

}private static List getDataStructure(String str,intj) {//运用正则表达式对获取的网页源码进行数据匹配,提取我们所要的数据,在以后的过程中,我们可以采用httpclient+jsoup,//现在暂时运用正则表达式对数据进行抽取提取//String[] info = str.split("");

SimpleDateFormat sf = new SimpleDateFormat("HH");

Date dateTime= newDate();

String hour=sf.format(dateTime);

Integer h=Integer.parseInt(hour);int t = 0;//如果十二点之前当天会有四个时间段模块(今天上午6~12;今天下午12~18;今天前半夜18~24;今天后半夜次日00~06)

if (h<=12) {

t=4;//如果十二点之后十八点之前当天会有三个时间段模块(今天下午12~18;今天前半夜18~24;今天后半夜次日00~06)

}else if (12

t=3;//如果十八点之后当天会有两个时间段模块(今天前半夜18~24;今天后半夜次日00~06)

}else if(h>18) {

t=2;

}

String[] info= str.split("

");

List list_actually = new ArrayList();

List list_forecast = new ArrayList();

SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");//当t的值是几的时候相应的当天的天气数据就还剩下几个模块,k就是用来控制第几个模块数据的参数

int k = 0;for(String s : info) {//这个Pattern对象将会使用matcher()方法来生成一个Matcher实例,接着便可以使用该 Matcher实例以编译的正则表达式为基础对目标字符串进行匹配工作,多个Matcher是可以共用一个Pattern对象的。

Matcher m =proInfo.matcher(s);

ActuallyWeather actually= null;

ActuallyForecastWeather forecast= null;//使用find()方法查找第一个匹配的对象

if(m.find()) {

actually= newActuallyWeather();

forecast= newActuallyForecastWeather();//返回与组匹配的子串内容

String[] ss = m.group(1).trim().replace(" ", "").split(">");if ("风力".equals(ss[0])) {

k++;

String[] strsss= s.split("

");int i = 0;if (k<=t&&j==0) {

actually= newActuallyWeather();for(String ss1 : strsss) {

Matcher mm=proInfo.matcher(ss1);if(mm.find()) {//设置产品型号

String[] sss = mm.group(1).trim().replace(" ", "").split(">");if (i%4==1) {

actually.setPlaceName(sss[0]);

}else if (i%4==2) {

actually.setWeatherStatus(sss[0]);

}else if (i%4==3) {

String temp= sss[0];

String[] temps= temp.split("/");

actually.setMaxTemperature(temps[0]+"℃");

actually.setMinTemperature(temps[1]);

}else if (i%4==0&&i!=0) {

actually.setWindPower(sss[0]);

}

}if (i%4==0&&i!=0) {

Date date= newDate();//发布日期

actually.setPubTime(sdf.format(date));//前四模块数据从当天早上七点开始加六个小时//date = new Date(date.getTime() + (k-1)*21600000);

int p = 0;//t是当日数据剩余次数;k是当前循环次数

if ((t-k)==3) {

p= 6;

}else if ((t-k)==2) {

p= 12;

}else if ((t-k)==1) {

p= 18;

}else if ((t-k)==0) {

p= 24;

}//次日凌晨

if (24==p) {

Date time= new Date(date.getTime() + 86400000);

actually.setForecastTime(sdf.format(time)+" 00");

}else if (p<10) {

actually.setForecastTime(sdf.format(date)+" 0"+p);

}else if (p>10&&p!=24) {

actually.setForecastTime(sdf.format(date)+" "+p);

}

list_actually.add(actually);

actually=newActuallyWeather();

}

i++;

}

}else if (k>t&&j==1) {

forecast= newActuallyForecastWeather();for(String ss1 : strsss) {

Matcher mm=proInfo.matcher(ss1);if(mm.find()) {//设置产品型号

String[] sss = mm.group(1).trim().replace(" ", "").split(">");if (i%4==1) {

forecast.setPlaceName(sss[0]);

}else if (i%4==2) {

forecast.setWeatherStatus(sss[0]);

}else if (i%4==3) {

String temp= sss[0];

String[] temps= temp.split("/");

forecast.setMaxTemperature(temps[0]+"℃");

forecast.setMinTemperature(temps[1]);

}else if (i%4==0&&i!=0) {

forecast.setWindPower(sss[0]);

}

}if (i%4==0&&i!=0) {

Date date= newDate();//发布日期

forecast.setPubTime(sdf.format(date));//从第五个模块数据开始数据是从次日凌晨开始每下一组比上一组晚24小时

date = new Date(date.getTime() + (k-t)*86400000);

forecast.setForecastTime(sdf.format(date)+" 00");

list_forecast.add(forecast);

forecast=newActuallyForecastWeather();

}

i++;

}

}

}

}

}if (0==j) {returnlist_actually;

}else if (1==j) {returnlist_forecast;

}return null;

}/*** 生成url

*@paramcountyCode

*@return*@throwsException*/

public static String getUrl(String countyCode) throwsException {

String url= "http://3g.nx121.com/pc/tqybxzb.aspx";if(StringUtils.isNotEmpty(countyCode)) {

url= url + "?sd="+countyCode;

}returnurl;

}/*** 根据城市编码查询所属市级和区县级行政区

*@paramcountyCode

*@return*@throwsException*/

public static Map getDistrict(String countyCode) throwsException {

Map map = new HashMap();if ("53614".equals(countyCode)) {//市级行政区

map.put("cityLevel", "银川市");//区县级行政区

map.put("countyLevel", "市辖区");

}else if ("53610".equals(countyCode)) {//市级行政区

map.put("cityLevel", "银川市");//区县级行政区

map.put("countyLevel", "贺兰县");

}else if ("53618".equals(countyCode)) {//市级行政区

map.put("cityLevel", "银川市");//区县级行政区

map.put("countyLevel", "永宁县");

}else if ("53619".equals(countyCode)) {//市级行政区

map.put("cityLevel", "银川市");//区县级行政区

map.put("countyLevel", "灵武市");

}returnmap;

}public staticPattern getProInfo() {returnproInfo;

}public static voidsetProInfo(Pattern proInfo) {

UrlInfo.proInfo=proInfo;

}public staticString getCountyCodes() {returncountyCodes;

}public static voidsetCountyCodes(String countyCodes) {

UrlInfo.countyCodes=countyCodes;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值