网页数据抓取怎么写( 简单贴一下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发生变化,代码也必须改变,这是它的缺点之一。这就是本文的内容。解释中如有错误,望不吝赐教~谢谢~

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线