Android Studio 爬虫 之 简单实现使用 jsoup/okhttp3 爬取购物商品信息的案例demo(附有详细步骤)
Android Studio 爬虫 之 简单实现使用 jsoup/okhttp3 爬取购物商品信息的案例demo(附有详细步骤)
目录
Android Studio 爬虫 之 简单实现使用 jsoup/okhttp3 爬取购物商品信息的案例demo(附有详细步骤)
一、简单介绍
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
本文地址:https://blog.csdn.net/u014361280/article/details/108124146