Java - Android Studio 中的网页抓取

标签 java android-studio web-scraping

我正在尝试从网站 https://www.worldometers.info/coronavirus/ 进行网络抓取并将该数据转换为一个应用程序,但数据实际上并未打印,我不知道原因,但每当我单击 Android 模拟器中的按钮时,它就会立即崩溃!

我的应用程序中有 3 个 textView 和一个按钮,因此每当我单击按钮时,它都应该在 textView 中显示数据!!

textView 的 ID 为 TotalCases/TotalDeaths/TotalRecovered 按钮有一个按钮的 id

这是我所做的

package com.example.coronaupdate;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import android.widget.Button;
import java.io.IOException;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Button btn;
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn = (Button) findViewById(R.id.button);
        btn.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                compare();
            }
        });

    }
    public void compare()
    {
        final TextView totalCases;
        final  TextView totalDeaths;
        final TextView totalRecovered;

        totalCases = (TextView) findViewById(R.id.TotalCases);
        totalDeaths = (TextView) findViewById(R.id.TotalDeaths);
        totalRecovered = (TextView) findViewById(R.id.TotalRecovered);

        try {
            Document doc = Jsoup.connect("https://www.worldometers.info/coronavirus/").userAgent("mozilla/17.0").get();
            Elements temp = doc.select("div.maincounter-number");


            Element totalcase = temp.get(0);
            String cases = totalcase.select("div.maincounter-number span").text();
            totalCases.setText(cases);

            Element totaldeaths = temp.get(1);
            String deaths = totaldeaths.select("div.maincounter-number span").text();
            totalDeaths.setText(deaths);

            Element totalrecovered = temp.get(2);
            String recovered = totalrecovered.select("div.maincounter-number span").text();
            totalRecovered.setText(recovered);

           /* for(Element totalCase:temp)
            {
                String cases = totalCase.select("div.maincounter-number span").text();
                System.out.println("" + cases);
                *//*i++;
                System.out.println(i + "" + totalCase.getElementsByTag("span"));*//*
            }*/
        }

        catch (IOException e){
            e.printStackTrace();
        }
    }
}

应用程序 View 的图像

Image of the app view

最佳答案

如果您可以发布您收到的错误,则可以更轻松地了解发生了什么,但我对问题有两个假设。

首先,您应该检查 Manifest 是否请求 INTERNET 访问权限。如果不是,您应该将其包含在内。

第二:在 Android 中向互联网发出请求时,您始终应该使用 AsyncTasks 或至少手动打开一个单独的线程。这是因为根据定义,互联网调用是异步的,如果您阻止应用程序的主要执行以等待响应,则 UI 将卡住或崩溃。因此,也许您应该将 compare() 函数的逻辑提取到一个继承自 AsyncTask 的单独类,并将其放入 doInBackground() 方法中。

关于Java - Android Studio 中的网页抓取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60855507/

相关文章:

java - MediaStore.Images.Media.getBitmap 意外失败

Android Studio 签名 APK ':app:transformClassesAndResourcesWithProguardForRelease'

Python/BeautifulSoup 中的多线程抓取根本没有加速

java - 基元数组的最简单列表包装器

java - HashMap 不添加重复键

android - 如何在 ionic +react + capacitor 项目中设置最低 android 版本支持?

python - 无法按行拆分网页抓取的表格

css - 使用 rvest 在 Twitter 中抓取用户视频

java - 如果我从 Stream API 中在 filter() 之后调用 limit() 会发生什么?

java - 查找 vector 的重复项并删除,保留平行 vector 的顺序