安卓仿手机网易新闻app项目开发系列之(三)数据抓取和解析 上

来源:互联网 发布:vb ado控件下载 编辑:程序博客网 时间:2024/06/04 18:24

一.项目简介和思路

    上节我们实现了在网上请求静态图片显示在手机上,这节我们来实现在网上找一个新闻网页来抓取其中的数据然后显示在手机上。


二.项目流程

1.获取网页数据工具介绍

 现在我们要获取网页新闻数据在手机上显示,那么网络数据怎么获取呢?在这里先给大家讲先获取网络数据的工具。主要是用到了火狐浏览器下的插件 firebug和httprequest。firebug可以查看网页的些源码,里面包括我们需要json数据。hettprequest是可以直接把网页转化为源码然后输出可以方便我们复制粘贴。接下来就放些图来简单讲下我们的操作。

  首先是如何来找到和安装我们的这两个插件,步骤如下图:

                                        

 

     点击右上角的菜单,然后选择附加组件,这里我已经安装过了,所以显示的是禁用和移除。

   然后我们用火狐打开一个新闻网站,如凤凰资讯网,然后点击如图的小虫子图标,然后在弹出窗口选择如下菜单:

    



  在响应一栏里可以看到有一长串的字符串和文字,这应该就是html、css的源码吧,然后往下翻,找到我们需要的数据,如下:

  


                                                           往下翻。。。。。。                   

                                                                                

    

这就是我们说的json格式的数据,他的格式是[ [{ }]、[  {  } ]、 [  {   }  ].......  ] 就是数组集合,数组里面包括数组,数组里面放着集合数据。通过仔细分析对比,发现一个[  {   }] 放的就是一个栏目的数据,比如体育或者娱乐类。这部分就是我们想要的数据。 然后再简单讲讲httprequest,它就是“小虫子”图片右边的两个箭头


点击打开后,会弹出下面的窗口,把网址输入,然后点击submit,右边就显示出网页的数据,如图:



2.编写获取数据工具类代码

 

/*   加载数据获取模块 */public class JsonUtils{    private List<Data>[] msg_list;    private CallBackListener mlistener ;    public void getResult() {        new Thread(new Runnable() {            @Override            public void run() {                //1.创建一个okhttp对象                OkHttpClient client = new OkHttpClient();                //2.新建一个请求                Request request = new Request.Builder().url("http://news.ifeng.com/").build();                //3.执行请求,获得响应数据                Call call = client.newCall(request);                //4.加入调度,执行回调                call.enqueue(new Callback() {                    @Override                    public void onFailure(Call call, IOException e) {                    }                    @Override                    public void onResponse(Call call, Response response) throws IOException {                        //Log.i("json","onresponse"+response.body().string());                        if (response.isSuccessful()) {                            String str = response.body().string();                            Message msg = new Message();                            msg.obj = str;                            msg.arg1 = 0x1;                            mhandler.sendMessage(msg);                        }                    }                });            }        }).start();    }    private Handler mhandler = new Handler() {        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);            if (msg.arg1 == 0x1) {                getJson(msg.obj.toString());//处理返回的字符串            }        }    };    //截取返回的数据的json格式    public void getJson(String msg) {        String json = null;        if (msg != null) {            json =msg.substring(msg.indexOf("[[{"), msg.indexOf("}]]") + 3);            Log.d("666", "get------------->json"+ json);        }        initMessageList(json);    }
   此部分的代码主要功能就是获取到我们需要的json格式数据。这里用到网络请求框架okhttp,使用前需要添加依赖。okhttp是现在比较主流的一个网络通信库,内部接口封装做的简单易用。网络请求一般有get和post请求,这里我们要获取网络数据,所以我们用的get请求。 大概流程如代码注释,首先要请求得创建个request对象,然后通过build().url()去设置我们需要的参数,这里我们需要访问的是凤凰新闻的地址。接下来通过newcall方法来创建一个call对象,这个call对象就相当于讲你的请求封装成了任务。最后,我们希望以异步的方式去执行请求,所以我们调用的是call.enqueue(),将call加入调度队列,然后等待任务执行完成,我们在Callback中即可得到结果。

    在执行回调函数里,我们看到了handler.sendmassage方法,这是用到异步消息处理机制。因为我们知道在子线程中是不能执行ui操作的(在这里个人觉得可能理解不对,可能此线程不是ui操作)。所以这里先把我们获取的数据str存放在msg.obj字段里,并将msg.arg1字段设置为0x1,用于接收端识别。然后通过sendmassage把消息发送出去。很快,handler就hi收到这条massage,并在handlermassage()方法中对它进行处理。注意此时已经在主线程中进行了,所以可以放心进行ui操作。接下来是对massage携带的字段进行判断,如果等于0x1就往下执行。

  也就是执行了getjson的方法,此方法就是从我们请求的数据中截取出json部分的的数据,也就我们之前说的“[[{” “}]]”格式的数据。最后我们通过打印来看下数据截取是否成功。如下图:


得到此数据,说明数据截取成功。


阅读全文
0 0