Java-如何挖取某个网站中的ajax请求信息

通常情况,通过网络爬虫挖取到的基本为网页静态内容,而动态ajax取数的内容是我个人暂时不知如何一次性把网站中的ajax获取

这里介绍的是某个网站中的某一个ajax多某个table刷新,期数据,并提供其他操作,如下载:

假设我们需挖取某一个网站:

例:某个网站中的那些pdf文件,并下载下来

首先:需要分析期网页组成结果;查看是通过什么方式读取处理的。这里结束ajax的方案(其它异同,ajax只是对数据进行一个一次数据的请求)

具体操作已案例介绍为主:

首先分析需要使用到的是ajax使用的请求url和请求中所需要的参数的含义,然后给定响应的参数

    /**
     * 获取某个请求的内容
     * @param url  请求的地址
     * @param code 请求的编码,不传就代表UTF-8
     * @return 请求响应的内容
     * @throws IOException
     */
    public static String fetch_url(String url, String code) throws IOException {
        BufferedReader bis = null;
        InputStream is = null;
        InputStreamReader inputStreamReader = null;
        try {
            URLConnection connection = new URL(url).openConnection();
            connection.setConnectTimeout(20000);
            connection.setReadTimeout(20000);
            connection.setUseCaches(false);
            connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11");
            is = connection.getInputStream();
            inputStreamReader = new InputStreamReader(is, code);
            bis = new BufferedReader(inputStreamReader);
            String line = null;
            StringBuffer result = new StringBuffer();
            while ((line = bis.readLine()) != null) {
                result.append(line);
            }
            return result.toString();
        } finally {
            if (inputStreamReader != null) {
                try {
                    inputStreamReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (bis != null) {
                try {
                    bis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (is != null) {
                try {
                    is.close();
               } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

通过上面的url请求,观看响应的数据格式,这里响应的数据测试格式为json格式

    /**
     * 数据转化成json格式
     * @param s
     */
    public static void getJSON(String s) {
        JSONObject object = JSONObject.fromObject(s);
        JSONArray array = JSONArray.fromObject(object.get("disclosureInfos"));
        //System.out.println(array);
        String filePath = object.getString("filePath");//解析数据中的某一个值
        //System.out.println(array.size());
        List<String> listFilePath = getJSONArray(array,filePath);//将数据解析成条数
        /*System.out.println(listFilePath);
        System.out.println(listFilePath.size());*/
        writer(listFilePath);//根据数据的内容开始挖取下载
    }

很多个数据需要下载,一条一条的下载

    public static void writer(List<String> listFilePath) {
        for (String string : listFilePath) {
            downloadFile(string);
        }
    }

解析json数据从格式数据

    /**
     * 解析文件url
     * @param array
     * @return
     */
    public static List<String> getJSONArray(JSONArray array,String filePath) {
        List<String> listFilePath = new ArrayList<String>();
        for (Object object : array) {
            JSONObject ob = JSONObject.fromObject(object);
            filePath = filePath + ob.get("filePath").toString();
            // System.out.println(filePath);
            listFilePath.add(filePath);
        }
        return listFilePath;
    }

文件下载处理

    /* 下载 url 指向的网页 */
    public static String downloadFile(String url) {
        String filePath = null;
        /* 1.生成 HttpClinet 对象并设置参数 */
        HttpClient httpClient = new HttpClient();
        // 设置 Http 连接超时 5s
        httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(5000);
        /* 2.生成 GetMethod 对象并设置参数 */
        GetMethod getMethod = new GetMethod(url);
        // 设置 get 请求超时 5s
        getMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, 5000);
        // 设置请求重试处理
        getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());
        /* 3.执行 HTTP GET 请求 */
        try {
            int statusCode = httpClient.executeMethod(getMethod);
            // 判断访问的状态码
            if (statusCode != HttpStatus.SC_OK) {
                System.err.println("Method failed: " + getMethod.getStatusLine());
                filePath = null;
            }
            /* 4.处理 HTTP 响应内容 */
            byte[] responseBody = getMethod.getResponseBody();// 读取为字节数组
            // 根据网页 url 生成保存时的文件名
            filePath = "e:\\spider\\";
            String fileName =  getFileNameByUrl(url, getMethod.getResponseHeader("Content-Type").getValue());
            saveToLocal(responseBody, filePath,fileName);
        } catch (HttpException e) {
            // 发生致命的异常,可能是协议不对或者返回的内容有问题
            System.out.println("Please check your provided http address!");
            e.printStackTrace();
        } catch (IOException e) {
            // 发生网络异常
            e.printStackTrace();
        } finally {
            // 释放连接
            getMethod.releaseConnection();
        }
        return filePath;
    }

确认文件名称和文件格式

    /**
     * 根据 url 和网页类型生成需要保存的网页的文件名 去除掉 url 中非文件名字符
     */
    public static String getFileNameByUrl(String url, String contentType) {
        // remove http://
        url = url.substring(7);
        // text/html类型
        if (contentType.indexOf("html") != -1) {
            url = url.replaceAll("[\\?/:*|<>\"]", "_") + ".html";
            return url;
        }
        // 如application/pdf类型
        else {
            return url.replaceAll("[\\?/:*|<>\"]", "_") + "." + contentType.substring(contentType.lastIndexOf("/") + 1);
        }
    }

保存文件地址写入

    /**
     * 保存网页字节数组到本地文件 filePath 为要保存的文件的相对地址
     */
    private static void saveToLocal(byte[] data, String fileDir,String fileName) {
        try {
            File fileNew=new File(fileDir+"\\"+fileName);//new 一个文件 构造参数是字符串
            File rootFile=fileNew.getParentFile();//得到父文件夹

            if( !fileNew.exists()) {
                rootFile.mkdirs();
                fileNew.createNewFile();
            }
            DataOutputStream out = new DataOutputStream(new FileOutputStream(fileNew));
            for (int i = 0; i < data.length; i++)
                out.write(data[i]);
            out.flush();
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

测试,这里写了个测试网址,网站地址和网址参数可能会改变,需适当调整

    public static void main(String[] args)  throws Exception{
        String s = fetch_url("http://www.neeq.cc/controller/GetDisclosureannouncementPage?type=7&key=&startDate=2015-05-20&endDate=2015-05-21&queryParams=0&page=1&_=1432187131769", "utf-8");
        //System.out.println(s);
        getJSON(s);
    }
    

完(欢迎转载)

时间: 2024-10-07 03:24:19

Java-如何挖取某个网站中的ajax请求信息的相关文章

React 中的 AJAX 请求:获取数据的方法

React 中的 AJAX 请求:获取数据的方法 React 只是使用 props 和 state 两处的数据进行组件渲染. 因此,想要使用来自服务端的数据,必须将数据放入组件的 props 或 state 中. 首先引入 axios. 1.`import axios from 'axios';` constructor 方法非常标准,调用 super,然后初始化 state,设置一个空的 posts 数 传入新的 posts 数组,使用 this.setState 方法更新组件状态.这会导致重

jquery中的ajax请求用法以及参数详情

url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如put和 delete也可以使用,但仅部分浏览器支持. timeout: 要求为Number类型的参数,设置请求超时时间(毫秒).此设置将覆盖$.ajaxSetup()方法的全局设 置. async:要求为Boolean类型的参数,默认设置为true,所有请求均为异步请求. 如果需要发送同步请求,请将此选项

如何使用JAVA语言抓取某个网页中的邮箱地址

现实生活中咱们常常在浏览网页时看到自己需要的信息,但由于信息过于庞大而又不能逐个保存下来. 接下来,咱们就以获取邮箱地址为例,使用java语言抓取网页中的邮箱地址 实现思路如下: 1.使用Java.net.URL对象,绑定网络上某一个网页的地址 2.通过java.net.URL对象的openConnection()方法获得一个URLConnection对象 3.通过URLConnection对象的getInputStream()方法获得该网络文件的输入流对象InputStream 4.循环读取流

PHP--------TP中的ajax请求

刚刚在查资料的时候看到一篇对自己今后有的文章,是关于TP框架的,将就吧它摘下来了. 以jQuery中的ajax为例: (1)引入jQuery 通过模板替换表示路径,我们可以自定义模板替换变量(在config中定义) /*自定义模板替换标签*/ 'TMPL_PARSE_STRING' =>array( '__JS__'=>'/Think_php/Public/script' ), (2)发送ajax请求(跟jquery中的ajax一样8步) (3)ajax回应(ajaxReturn()方法)  

PHP中检测ajax请求的代码例子

多数情况下,基于JavaScript 的Js框架如jquery.Mootools.Prototype等,在发出Ajax请求指令时,都会发送额外的 HTTP_X_REQUESTED_WITH 头部信息,就当是一个ajax请求,因此你可以在服务器端检测到这些Ajax请求,在PHP中的检测方法如下代码所示: <?php if(!emptyempty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUE

Vue2.0中的Ajax请求

Vue可以借助于vue-resource来实现Ajax请求 http请求报文 浏览器与服务器数据交互是遵循http协议的,当浏览器要访问服务器的时候,浏览器需要将相关请求数据提交给服务器. 格式分为:请求报文行.请求报文头.请求空行.请求报文体 http响应报文 当浏览器请求服务器的时候,服务器需要将数据返回给浏览器,这种数据是通过响应报文响应会回浏览器的. 格式分为:响应报文行.响应报文头.响应空行.响应报文体 HTTP协议约定 1.浏览器祥服务器发出请求的时候有get请求和post请求,浏览

Vue 中使用Ajax请求

Vue 项目中常用的 2 个 ajax 库 (一)vue-resource vue 插件, 非官方库,vue1.x 使用广泛 vue-resource 的使用 在线文档   https://github.com/pagekit/vue-resource/blob/develop/docs/http.md 下载 npm install vue-resource--save 编码 // 引入模块 ,注意应该在App.vue中引入和声明 import VueResource from 'vue-res

python-爬虫:取qq号中各分组成员信息存入数据库,并将qq头像下载保存到文件夹,图片命名为qq号(实例3)

import requestsimport pymongoimport requestsimport os class QqGroup:#三个接口url 获取 qq组号 获取每组成员信息 获取qq头像下载地址 group_url = "https://qun.qq.com/cgi-bin/qun_mgr/get_group_list" member_url = "https://qun.qq.com/cgi-bin/qun_mgr/search_group_members&q

laravel5.4中自定义ajax请求响应类

本人小白在it界混迹一年之久暂时没有什么成绩只是把所以到的和大家分享一下,在工作和学习的过程中一直追求美观,但是对于我来说毕竟实力有限,每当遇到一些返回或者是网站或者项目中的返回给用户的友好提示的时候总是感觉头痛不已,直接alert吧显得真的是太low了所以结合所使用的laravel5.4分享给大家一个自定义的提示类 首先我们先来看一下官方提供的文档 文档中已经明确的表示出在config的文件夹下包含了所有的配置文件,那么我们的配置文件同样的可以放到配置文件中,所以命名一个文件为constant