java爬取某个机票查询网站上面的信息(刚学!!!)
[ 本帖最后由 shangjS009 于 2018-5-25 16:42 编辑 ]\n\n[ 本帖最后由 shangjS009 于 2018-5-25 16:00 编辑 ]\n\n[ 本帖最后由 shangjS009 于 2018-5-25 15:50 编辑 ]\n\n[ 本帖最后由 shangjS009 于 2018-5-25 15:49 编辑 ]\n\n[ 本帖最后由 shangjS009 于 2018-5-25 15:44 编辑 ]\n\n[ 本帖最后由 shangjS009 于 2018-5-25 15:41 编辑 ]\n\n@RequestMapping(value = "${adminPath}/python/rFeichangzhun")public class RFeichangzhunController extends BaseController {
private static CloseableHttpClient httpclient = HttpClients.createDefault(); // 创建一个客户端
private static String filename = "d:" + File.separator + File.separator
+ "zhuye.html"; // 定义输出html文件的路径
private static String filenames = "d:" + File.separator + File.separator
+ "xiangxi.html"; // 定义输出html文件的路径
private static String outfile = "d:" + File.separator + File.separator
+ "liudehua.csv"; // 定义输出csv文件的路径
private static boolean bfile = true; // 定义控制输出file的boolean变量
private static boolean bdb = true; // 定义控制输出file的boolean变量
private static ArrayList<String> datalist = new ArrayList<String>(); // 定义Arraylist类集用来保存每一条数据的信息
private static String headtitle = "航班信息,计划起飞,出发地,计划到达,到达地"; // 打印的标题头
private static int countrs = 0; // 计数变量
/**
* 输出html文件
*/
public static void htmltoFile(String htmlString) throws Exception {
// 获得文件输出流
FileOutputStream output = new FileOutputStream(filename);
// 以utf-8编码的形式输出到文件(utf-8是中文编码,ISO-8859-1是英文编码)
output.write(htmlString.getBytes("utf-8"));
if (output != null) {
output.close();
}
}
/**
* 下载页面
*/
public static String downloadPage(String url) throws Exception {
String htmlString = ""; // 定义返回的String变量
HttpGet request = new HttpGet(url); // 请求资源
CloseableHttpResponse response = httpclient.execute(request); // 得到回应
try {
System.out.println(response.getStatusLine()); // 打印状态码
HttpEntity entity = response.getEntity(); // 获得Entity对象
htmlString = EntityUtils.toString(entity); // 将Entity对象转化为字符串
EntityUtils.consume(entity); // 销毁对象
} finally {
response.close();
}
htmltoFile(htmlString); // 调用htmltoFile()方法在制定路径输出html文件
return htmlString;
}
@RequiresPermissions("python:rFeichangzhun:view")
@RequestMapping(value = { "python" })
public String python(RFeichangzhun rFeichangzhun,
HttpServletRequest request, HttpServletResponse response,
Model model) throws Exception {
String didian = request.getParameter("didian");
String riqi = request.getParameter("riqi");
String hangbanhao = request.getParameter("hangbanhao");
String url = "http://www.variflight.com/flight/fnum/" + hangbanhao
+ ".html?AE71649A58c77&fdate=" + riqi;
String url2 = "http://www.variflight.com/schedule/"+didian+"-"+hangbanhao+".html?AE71649A58c77=&fdate="+riqi;
getDouBanList(url, riqi, url2);
return "modules/python/rFeichangzhunList";
}
/**
* 获取非常准航班信息
*
* @throws Exception
*/
public void getDouBanList(String surl, String riqi, String surls)
throws Exception {
String html = RFeichangzhunController.downloadPage(surl); // 通过url下载页面
String html2 = RFeichangzhunController.downloadPages(surls);
html = html.replace("star clearfix", "star_clearfix"); // 用"star_clearfix"替代"star clearfix"
html2 = html2.replace("star clearfix", "star_clearfix");
Document doc = Jsoup.parse(html); // 解析获取Document对象
Document docs = Jsoup.parse(html2);
Element divNode = doc.getElementsByClass("li_box").first(); // 通过getElementsByClass方法获取class为"li_box"的div节点对象
Element divNodes = docs.getElementsByClass("flyProc").first();
Elements liTag = divNode.select("li"); // 通过select选择器选择有class属性的li标签节点,返回Element元素的集合
// Elements liTag1 = divNodes.select("span");
Elements liTag2 = divNodes.select("div");
// System.out.println(liTag2);
String title, jpg;
for (Element liNode : liTag) { // 对于liTag Element集合中的每一个元素liNode
Element dd = liNode.select("div").first(); // 取得liNode的第一个a节点对象
title = dd.getElementsByTag("span").text(); // 使用getElementsByTag方法,通过标签名称取得a标签节点对象,然后取其中的文本元素,即为电影名称
jpg = dd.getElementsByTag("span").html();
String[] strs = title.split(" ");
RFeichangzhun rFeichangzhun = new RFeichangzhun();
rFeichangzhun.setQueryDate(riqi);
String a = (strs.toString() + " " + strs.toString());
rFeichangzhun.setFlightXinxi(a);
String b = strs.toString();
rFeichangzhun.setPlanTime(b);
String c = strs.toString();
rFeichangzhun.setChufadi(c);
String d = strs.toString();
String e = strs.toString();
rFeichangzhun.setDaodadi(e);
String f = strs.toString();
rFeichangzhun.setStatus(f);
for (Element liNodes : liTag2) {
Element bb = liNodes.select("div").first();
title = bb.getElementsByTag("span").text();
String[] strs2 = title.split(" ");
String aa = strs2.toString();
String cc = strs2.toString();// 8
System.out.println(aa);
System.out.println(cc);
这个是我自己写着玩的 好像很厉害的样子 目标地址是http://www.variflight.com 上面我不会加了 ,有大佬在吗 你这种方法我没试过,但是你都能把网页下载下来了还用爬吗?直接单独写一个方法去截取准点率的图片地址不就行了吗? 看着很厉害###############{:301_992:} //截取方法
private String GetStringMid(String allStr, String firstStr, String lastStr)
{
try
{
int index1 = allStr.indexOf(firstStr);
index1 = index1 + firstStr.length();
int index2 = allStr.indexOf(lastStr, index1 + 1);
if (index1 < 0 || index2 < 0)
{
return "";
}
return allStr.substring(index1, index2);
}
catch (Exception e)
{
return "";
}
} 本帖最后由 shangjS009 于 2018-5-25 16:42 编辑
Agx 发表于 2018-5-25 16:09
你这种方法我没试过,但是你都能把网页下载下来了还用爬吗?直接单独写一个方法去截取准点率的图片地址不就 ...
src="/flight/detail/productImg&s=S3lsUWZnTThkNzdKMyswWXIva0dNMm1mVldIWjVWM2k=&w=63&h=28&fontSize=13&fontColor=2f3032&background=ffffff?AE71649A58c77=" shangjS009 发表于 2018-5-25 16:21
src="/flight/detail/productImg&s=S3lsUWZnTThkNzdKMyswWXIva0dNMm1mVldIWjVWM2k=&w=63&h=28&fontSize=1 ...
http://www.variflight.com/
加这个就是完整的图片地址了,但是这个地址过一段时间会变化 图片地址其他都是固定的,主要是s这个参数,每隔一段时间会刷新 爬整个网站的图片怎么写代码?
页:
[1]
2