网页数据抓取怎么写( 简单贴一下Adapter的代码怎么去展示数据(图))
优采云 发布时间: 2021-12-09 14:01网页数据抓取怎么写(
简单贴一下Adapter的代码怎么去展示数据(图))
获取请求
在这里可以看到简书首页的html代码。我们要实现的是提取首页的文章列表。
目标很明确,你可以开始编码了。
首先在build.gradle中添加Jsoup的依赖
dependencies {
compile 'org.jsoup:jsoup:1.10.2'
}
既然Jsoup是对html进行操作的,那么首先我们要得到html。这里我使用okhttp发起请求。也可以根据自己的喜好更换。
Request request = new Request.Builder().
url("http://www.jianshu.com").
//如果请求的url需要提交参数,那么需改为post方式并提交对应的参数
get().
build();
okHttpClient.newCall(request).enqueue(this);
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
String result = response.body().string();
parseHtml(result);
}
}
这里没有什么特别的,无非就是发送一个请求,获取返回的html。
好了,现在我们已经成功拿到了简书首页的html代码。这里我们先回到浏览器,按住ctrl+shift+c(chrome浏览器下的快捷键),点击列表中的一项文章,
如您所见,li 标记收录在 id 为 list-container 的 div 中的 ul 中。
点击标题
点击标题,可以看到标题收录在a标签中,类是li中的标题,文章的详情页的url也收录在href属性中。熟悉jq或js的孩子可能知道,在jq或js中,我们可以通过标签来查找元素。回顾Jsoup的介绍,可以使用类似于jquery的方法来提取或操作数据。你大概明白了吧?
我们来看一下代码实现
private void parseHtml(String html) {
//将html转为Document对象
Document document = Jsoup.parse(html);
//获得li的元素集合
Elements elements = document.select("div#list-container ul li");
List lists = new ArrayList();
BlogModel blogModel;
for (Element element : elements) {
//获得作者
String author = element.select("div.name a").first().text();
//获得标题
String title = element.select("a.title").first().text();
//获得图片url,因为文章有可能没有图片,所以这里需要特殊处理一下
String image = element.select("a.wrap-img").first() != null ?
element.select("a.wrap-img").first().children().first().attr("src") : "";
//获得文章详情url
String targetUrl = element.select("a.title").first().attr("href");
blogModel = new BlogModel();
blogModel.setAuthor(author);
blogModel.setName(title);
blogModel.setImage(image);
blogModel.setTargetUrl(targetUrl);
lists.add(blogModel);
}
}
这里我们把我们拿到的数据封装成一个BlogModel对象,BlogModel的代码很简单
public class BlogModel {
private String author;
private String name;
private String image;
private String targetUrl;
//get和set方法...
}
现在我们有了我们需要的数据,下一步就是展示它。这里使用RecyclerView,简单贴一下Adapter的代码
static class MyAdapter extends RecyclerView.Adapter {
private Context context;
private List blogModels;
public MyAdapter(Context context) {
this.context = context;
}
public void setBlogModels(List blogModels) {
this.blogModels = blogModels;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new ViewHolder(View.inflate(context, R.layout.item_blog, null));
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.tvTitle.setText(blogModels.get(position).getName());
Glide.with(context).load(blogModels.get(position).getImage()).into(holder.ivImg);
}
@Override
public int getItemCount() {
return blogModels.size();
}
}
数据的展示方式大家一定很熟悉,这里就不啰嗦了,最后上传演示图片。
演示
总结
好的,通过Jsoup,你可以抓取各种网页的数据,比如你们学校的教务网等,这里我们只简单介绍一下Jsoup的基本用法。细心的童鞋一定会发现的。如果使用Jsoup抓取数据如果抓取的网站的html发生变化,代码也必须改变,这是它的缺点之一。这就是本文的内容。解释中如有错误,望不吝赐教~谢谢~