Android将网页做成app– Jsoup网络解析框架
Jsoup能够获得网页数据,而我们在制作app的数据来源为一些公开网站,比如;干活集中营,豆瓣,知乎之类的。不过目前主流框架模式是Retrofit&RxJava。然而这种方法局限性很大,主要获取的数据都是很规范的,不能随意获得对应网页任意的数据。

我们使用Jsoup做app时,需要对照网站源码来做,这样能够让我们快速获得自己想要的数据。

首先做一下准备工作,打开网页https://xjh.haitou.cc/wh/uni-1/after/hold/page-1,我们使用浏览器的开发者模式

android 网页生成 手机快捷方式_网络


我们可以看到一行代码对应网页中的位置,这样方便我们写程序。

我首先放出完整代码,然后再一步一步的讲解
添加依赖

compile 'org.jsoup:jsoup:1.9.2'

代码

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView tv = (TextView)findViewById(R.id.tv);
        tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new Thread(new Task()).start();
            }
        });

    }

    class Task implements Runnable {
        @Override
        public void run() {
            Log.v("test","start");
            String url = "http://xjh.haitou.cc/wh/uni-1/after/hold/page-1/";
            Connection conn = Jsoup.connect(url);
            // 修改http包中的header,伪装成浏览器进行抓取
            conn.header("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:32.0) Gecko/    20100101 Firefox/32.0");
            Document doc = null;
            try {
                doc = conn.get();
            } catch (IOException e) {
                e.printStackTrace();
            }

            // 获取tbody元素下的所有tr元素
            Elements elements = doc.select("tbody tr");
            for(Element element : elements) {
                String companyName = element.select("div.company").first().text();
                //String companyName = element.select("td.cxxt-title").first().text();
                String time = element.select("td.text-left").first().text();
                String address = element.select("td.text-ellipsis").first().text();
                Log.v("test","---------------------------------");
                Log.v("test","公司:"+companyName);
                Log.v("test","宣讲时间:"+time);
                Log.v("test","具体地点:"+address);
                Log.v("test","---------------------------------");
            }

            Log.v("test","end");
        }
    }
}

首先从网页获取数据,是属于网络操作必须另起一个线程运行代码,

conn.header("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:32.0) Gecko/    20100101 Firefox/32.0");
Document doc = null;

然后这个伪装成浏览器这步,基本成惯例,代码看起来是伪装成火狐浏览器。

try {
                doc = conn.get();
            } catch (IOException e) {
                e.printStackTrace();
            }

            // 获取tbody元素下的所有tr元素
            Elements elements = doc.select("tbody tr");

这个获得Elements元素,这个在网页开发者模式里可以看到tr这个标签代表着一条宣传会信息,其中有公司名,举办地点,举办时间等等。这个tbody是它自定义的标签,所以很好找,这个tbody在网站源代码就一个,所以能够确定唯一性。对于select函数唯一性很重要,然后它空了一行加tr,这说明是在找tbody标签的所有的tr标签。

for(Element element : elements) {
    String companyName = element.select("div.company").first().text();
    //String companyName = element.select("td.cxxt-title").first().text();
    String time = element.select("td.text-left").first().text();
    String address = element.select("td.text-ellipsis").first().text();
    Log.v("test","---------------------------------");
    Log.v("test","公司:"+companyName);
    Log.v("test","宣讲时间:"+time);
    Log.v("test","具体地点:"+address);
    Log.v("test","---------------------------------");
}

这就是一个tr一个tr的解析获得数据。这里可以看到select函数的另一个用法,通过 标签名+.+类名 来获得一个元素,这个很重要,后来获得最终的数据都是使用这个函数。

获得数据如下
09-28 13:16:20.736 22136-22310/zzw.myapplication V/test: start
09-28 13:16:27.006 22136-22310/zzw.myapplication V/test: ———————————
09-28 13:16:27.006 22136-22310/zzw.myapplication V/test: 公司:深圳市星河互动科技有限公司
09-28 13:16:27.006 22136-22310/zzw.myapplication V/test: 宣讲时间:2017-09-28 14:00 (今天)
09-28 13:16:27.006 22136-22310/zzw.myapplication V/test: 具体地点:华科1号楼2楼报告厅
09-28 13:16:27.006 22136-22310/zzw.myapplication V/test: ———————————
09-28 13:16:27.006 22136-22310/zzw.myapplication V/test: 公司:深圳中兴飞贷金融科技有限公司

还有很多就不贴出来了

想要掌握Jsoup其实很简单,毕竟使用的函数很少,过程都是固定的。

目前到此结束了,其实这距离做成app,还需要形成实体类,然后填充数据,界面完成。不过我不搞了,接下来大家自由发挥,换一个自己想做的网站,比如:B站
下期再见。