Android将网页做成app– Jsoup网络解析框架
Jsoup能够获得网页数据,而我们在制作app的数据来源为一些公开网站,比如;干活集中营,豆瓣,知乎之类的。不过目前主流框架模式是Retrofit&RxJava。然而这种方法局限性很大,主要获取的数据都是很规范的,不能随意获得对应网页任意的数据。
我们使用Jsoup做app时,需要对照网站源码来做,这样能够让我们快速获得自己想要的数据。
首先做一下准备工作,打开网页https://xjh.haitou.cc/wh/uni-1/after/hold/page-1,我们使用浏览器的开发者模式
我们可以看到一行代码对应网页中的位置,这样方便我们写程序。
我首先放出完整代码,然后再一步一步的讲解
添加依赖
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站
下期再见。