Android Studio 爬虫 之 简单实现使用 jsoup/okhttp3 爬取购物商品信息的案例demo(附有详细步骤)

 

 

Android Studio 爬虫 之 简单实现使用 jsoup/okhttp3  爬取购物商品信息的案例demo(附有详细步骤)

 

目录

Android Studio 爬虫 之 简单实现使用 jsoup/okhttp3  爬取购物商品信息的案例demo(附有详细步骤)

一、简单介绍

二、实现原理

三、注意事项

四、效果预览

五、下载相关 jar 包

六、网页数据分析,以确认 jsoup 解析需要的数据

七、实现步骤

八、关键代码

九、参考工程


 

一、简单介绍

Android 开发中的一些基础操作,使用Java 实现爬取指定网页的信息的方法整理,便于后期使用。

本节介绍,爬取 https://www.smzdm.com/ 网页的值得买精选的购物商品信息的方法,其中使用的工具是 jsoup 和 okhttp3。

 

二、实现原理

1、okhttp3 获得网页的 html 内容

2、jsoup  解析 html 的内容,获取需要的部分信息

 

三、注意事项

1、网页的 html 有些格式标签可能会变化,具体根据实际最新的网页 html 为准

2、AndroidManifest.xml 中注意添加 INTERNET 权限

3、okhttp3 依赖 okio (最好下载 okio-1.16.0.jar),使用的时候也要添加这个 jar 包

 

四、效果预览

 

五、下载相关 jar 包

1、jsoup.jar 下载

1)百度搜索 jsoup.jar

 

2)点击下载即可

(网址:https://jsoup.org/download

 

2、okhttp.jar 下载

1)百度搜索 okhttp.jar

2)对应下载即可(若官网打不开,可以使用搜索结果其他方式下载即可)

(github 网址:https://github.com/square/okhttp)

 

3、okio-1.16.0.jar 下载

1)百度搜索 okio-1.16.0.jar

 

2)点击下载即可

 

六、网页数据分析,以确认 jsoup 解析需要的数据

1、爬取目标网页

(网址为:https://www.smzdm.com/

 

2、选中网页右键 检查元素(这里以火狐浏览器为例),查看 html 源码

 

3、点击选中 鼠标选择器,这样选择 html 就会和 网页 双双对应

 

4、Elements 的目标 html 为如下

 

5、title 的目标 html 为如下

 

6、author 的目标 html 为如下

 

7、imgurl 的目标 html 为如下

 

8、context 的目标 html 为如下

 

9、articleurl 的目标 html 为如下

(获取的方法很多,我根据图片获取的)

 

七、实现步骤

1、打开 Android Studio 之后,新建一个工程或者一个模块

 

2、选择 模块,点击 Next

 

3、取个名称,点击 Next

 

4、选择 Activity ,点击 Next

 

4、取个名称,点击 Finish

 

5、把下载好的 jar 添加到 libs 中

 

6、把他们都引入模块中

 

7、编写相关代码,Article 为数据模型类,OkHttpUtils 获取网页 html,GetData 解析 html 整理成列表Article 模型数据,MainActivity 线程测试 OkHttpUtils /GetData  功能,并展示数据

 

8、打包apk,运行结果如上

 

八、关键代码

1、Article

package com.example.javacrawlertest.Tools;

/***
 * 抓取到的文章数据封装
 */
public class Article {

    private String title;
    private String author;
    private String imgUrl;
    private String context;
    private String articleUrl;
 

    //有几个属性还没用到,所以构造方法先用上这四个有爬取到数据的
    public Article(String title, String author, String imgUrl, String context, String articleUrl) {
        this.title = title;
        this.author = author;
        this.imgUrl = imgUrl;
        this.context = context;
        this.articleUrl = articleUrl;
    }


    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getImgUrl() {
        return imgUrl;
    }

    public void setImgUrl(String imgUrl) {
        this.imgUrl = imgUrl;
    }

    public String getContext() {
        return context;
    }

    public void setContext(String context) {
        this.context = context;
    }

    public String getArticleUrl() {
        return articleUrl;
    }

    public void setArticleUrl(String articleUrl) {
        this.articleUrl = articleUrl;
    }

   

    @Override
    public String toString() {
        return "Article{" +
                "title='" + title + '\'' +
                ", author='" + author + '\'' +
                ", imgUrl='" + imgUrl + '\'' +
                ", context='" + context + '\'' +
                ", articleUrl='" + articleUrl + '\'' +             
                '}';
    }
}

 

2、GetData

package com.example.javacrawlertest.Tools;

import android.util.Log;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.util.ArrayList;

public class GetData {

    private static final String TAG ="GetData" ;

    /**
     * 抓取什么值得买首页的精选文章
     * @param html
     * @return  ArrayList<Article> articles
     */
    public static ArrayList<Article> spiderArticle(String html){
        ArrayList<Article> articles = new ArrayList<>();

        Document document = Jsoup.parse(html);
        Elements elements = document
                .select("ul[class=feed-list-hits feed-list-index]")
                .select("li[class=feed-row-wide J_feed_za feed-haojia]");

        Log.i(TAG, "spiderArticle: elements " +elements.html());

        for (Element element : elements) {
            String title = element
                    .select("h5[class=feed-block-title has-price]")
                    .text();
            String author = element
                    .select("div[class=z-feed-foot]")
                    .select("span[class=feed-block-extras]")
                    .select("a")
                    .select("span")
                    .text();

            String imgurl = element
                    .select("div[class=z-feed-img]")
                    .select("a")
                    .select("img")
                    .attr("src");
            String context = element
                    .select("div[class=feed-block-descripe]")
                    .text();
            String articleUrl = element
                    .select("div[class=z-feed-img ]")
                    .select("a")
                    .attr("href");

            Article article = new Article(title,author,imgurl,context,articleUrl);
            articles.add(article);
            //Log.e("DATA>>",article.toString());
        }
        return articles;
    }
}

 

3、OkHttpUtils

package com.example.javacrawlertest.Tools;

import android.util.Log;

import java.io.IOException;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;


public class OkHttpUtils {

    final static String TAG = "OkHttpUtils";

    public static String OkGetArt(String url) {
        String html = null;
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url(url)
                .build();
        try  {
        Response response = client.newCall(request).execute();
        //return
            html = response.body().string();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //Log.i(TAG, "OkGetArt: html "+html);
        return html;

    }
}

 

4、MainActivity

package com.example.javacrawlertest;

import android.os.Debug;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import com.example.javacrawlertest.Tools.Article;
import com.example.javacrawlertest.Tools.GetData;
import com.example.javacrawlertest.Tools.OkHttpUtils;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    final static String url = "https://www.smzdm.com/";
    final static String TAG = "MainActivity";
    private Handler handler = new Handler() {
        public void handleMessage(Message msg) {
            Log.i(TAG, "handleMessage: "+ "爬结束");

                        switch (msg.what) {
                             case 1:
                                 Log.i(TAG, "handleMessage: "+ "开始展示数据");
                                 ArrayList<Article> articles = (ArrayList<Article>)msg.obj;
                                 Log.i(TAG, "handleMessage:articles.size() "+ articles.size());

                                 for (Article item:articles) {
                                     Log.i(TAG, "handleMessage: "+ item.toString());
                                 }
                                    break;
                           default:
                                   break;
                             }
                   }
     };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Test();
    }
    private void Test(){


        new Thread(){
            public void run(){
                String html = OkHttpUtils.OkGetArt(url);
                ArrayList<Article> articles = GetData.spiderArticle(html);
                //发送信息给handler用于更新UI界面
                Message message = handler.obtainMessage();
                message.what = 1;
                message.obj = articles;
                handler.sendMessage(message);
            }
        }.start();
    }
}

 

5、AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.javacrawlertest">
<uses-permission android:name="android.permission.INTERNET"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <uses-library android:name="org.apache.http.legacy" android:required="false" />
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

 

九、参考工程

1、工程下载地址:https://download.csdn.net/download/u014361280/12733231

(也可以在CSDN搜索博文标题找到下载地址)

 

2、参考博文(谢谢博主):https://blog.csdn.net/FRYAN28/article/details/88741373

 

  • 2
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,以下是使用Jsoup爬取网站并获取食谱图片、食谱名称和食谱描述的代码: 1. 首先,在build.gradle文件中添加Jsoup库的依赖: ``` implementation 'org.jsoup:jsoup:1.14.2' ``` 2. 在MainActivity.java文件中添加以下代码: ```java public class MainActivity extends AppCompatActivity { private ArrayList<Recipe> recipeList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); recipeList = new ArrayList<>(); new FetchRecipesTask().execute(); } private class FetchRecipesTask extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... voids) { try { Document doc = Jsoup.connect("https://www.ecook.cn/shicai/11530/").get(); Elements recipeElements = doc.select(".recipe-list > li > a"); for (Element recipeElement : recipeElements) { String imgUrl = recipeElement.select(".recipe-img img").attr("data-src"); String name = recipeElement.select(".recipe-name").text(); String description = recipeElement.select(".recipe-desc").text(); Recipe recipe = new Recipe(imgUrl, name, description); recipeList.add(recipe); } } catch (IOException e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); RecyclerView recyclerView = findViewById(R.id.recyclerView); recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this)); RecipeAdapter adapter = new RecipeAdapter(recipeList); recyclerView.setAdapter(adapter); } } } ``` 3. 创建Recipe类,用于储存食谱图片、食谱名称和食谱描述的内容: ```java public class Recipe { private String imgUrl; private String name; private String description; public Recipe(String imgUrl, String name, String description) { this.imgUrl = imgUrl; this.name = name; this.description = description; } public String getImgUrl() { return imgUrl; } public String getName() { return name; } public String getDescription() { return description; } } ``` 4. 创建RecipeAdapter类,用于显示食谱列表: ```java public class RecipeAdapter extends RecyclerView.Adapter<RecipeAdapter.ViewHolder> { private ArrayList<Recipe> recipeList; public RecipeAdapter(ArrayList<Recipe> recipeList) { this.recipeList = recipeList; } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recipe_item, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { Recipe recipe = recipeList.get(position); Glide.with(holder.itemView.getContext()).load(recipe.getImgUrl()).into(holder.imageView); holder.nameTextView.setText(recipe.getName()); holder.descriptionTextView.setText(recipe.getDescription()); } @Override public int getItemCount() { return recipeList.size(); } public static class ViewHolder extends RecyclerView.ViewHolder { ImageView imageView; TextView nameTextView; TextView descriptionTextView; public ViewHolder(@NonNull View itemView) { super(itemView); imageView = itemView.findViewById(R.id.imageView); nameTextView = itemView.findViewById(R.id.nameTextView); descriptionTextView = itemView.findViewById(R.id.descriptionTextView); } } } ``` 5. 在res/layout文件夹中创建recipe_item.xml文件,用于定义食谱列表项的布局: ```xml <androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="8dp" android:elevation="4dp"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <ImageView android:id="@+id/imageView" android:layout_width="96dp" android:layout_height="96dp" android:scaleType="centerCrop" /> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_weight="1" android:orientation="vertical"> <TextView android:id="@+id/nameTextView" android:layout_width="match_parent" android:layout_height="wrap_content" android:textAppearance="?attr/textAppearanceListItem" /> <TextView android:id="@+id/descriptionTextView" android:layout_width="match_parent" android:layout_height="wrap_content" android:maxLines="2" android:textAppearance="?attr/textAppearanceListItemSecondary" /> </LinearLayout> </LinearLayout> </androidx.cardview.widget.CardView> ``` 这样,就可以获取网站https://www.ecook.cn/shicai/11530/中的食谱图片、食谱名称和食谱描述,并用列表储存并显示出来了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仙魁XAN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值