制作安卓app抓取网页数据需要了解以下几个关键点:
1. 确定数据来源的网页URL,确定需要抓取的数据字段;
2. 分析网页结构,确定需要用到的解析器;
3. 使用安卓开发工具(如Android Studio)创建新项目;
4. 编写代码,使用HTTP请求获取网页数据并解析;
5. 将解析后的数据展示在应用界面上。
下面,我们来详细介绍一下这几个关键点:
1. 确定数据来源的网页URL,确定需要抓取的数据字段
在我们开始编写代码之前,需要确定我们需要从哪个网页抓取哪些数据。一般来说,我们需要先在浏览器中打开该网页,然后右键查看网页源代码,找到我们需要抓取的数据在网页中的标签和位置。比如,我们要从百度百科中抓取电影《流浪地球》的评分,我们需要找到该网页源代码中与评分相关的标签和位置。在百度百科中,评分标签为:
```html
7.8
```
我们可以看到评分数据位于 `` 标签内,因此我们需要从该标签中获取数据。
2. 分析网页结构,确定需要用到的解析器
在我们确定了需要抓取的数据之后,我们需要对网页结构进行分析。通常,在网页数据抓取中,我们需要解析的数据是包含在特定标签内的文本或链接等,我们需要使用不同的解析器来解析这些数据。
常用的解析器包括 DOM 解析器、SAX 解析器和JSON解析器等。在安卓应用中,我们可以使用安卓自带的解析器或第三方库来解析数据。对于 HTML 和 XML 数据,Android系统提供了 DOM 解析器和 SAX 解析器。而对于 JSON 数据,则通常使用 JSON 解析器。
3. 使用安卓开发工具(如Android Studio)创建新项目
创建新项目的过程相对简单,这里不做赘述。
4. 编写代码,使用HTTP请求获取网页数据并解析
1. 使用 HttpURLConnectio 进行网络请求获取HTML字符串
在安卓应用中,我们需要使用网络请求来获取网页数据。Android SDK 提供了多种方式进行网络请求,包括 HttpURLConnection、HttpClient 等。这里我们演示使用 HttpURLConnection 进行网络请求的方式获取页面 HTML 代码:
```java
public String getHtmlString() throws IOException {
URL url = new URL(mUrlString);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
BufferedInputStream inputStream = new BufferedInputStream(connection.getInputStream());
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, len);
}
inputStream.close();
outputStream.close();
return outputStream.toString();
}
```
2. 使用 Jsoup 进行 HTML 解析
获取到了网页的 HTML 代码,我们需要解析出我们需要的数据。Jsoup 是一款优秀的 Java HTML 解析器,它支持 DOM 解析和 CSS 选择器等。我们可以使用 Jsoup 来解析页面数据:
```java
public void parseHtml(String html) {
Document document = Jsoup.parse(html);
Elements scoreElements = document.select("span.score strong");
if (scoreElements != null && !scoreElements.isEmpty()) {
String score = scoreElements.get(0).text();
Log.d(TAG, "score:" + score);
} else {
Log.d(TAG, "score is null.");
}
}
```
这里使用 Jsoup 的 `select` 方法来选取评分数据所在的标签,并使用 `text` 方法获取该标签的文本内容。
5. 将解析后的数据展示在应用界面上
最后,我们将解析后的数据展示在应用界面上。这里我们可以使用 Android 原生的 TextView 组件来展示数据:
```java
TextView mScoreTextView;
public void showData(String data) {
mScoreTextView.setText(data);
}
```
完整的代码示例:
```java
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private static final String URL = "https://baike.baidu.com/item/%E6%B5%81%E6%B5%AA%E5%9C%B0%E7%90%83/21879693";
private TextView mScoreTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mScoreTextView = findViewById(R.id.score_text_view);
new Thread(new Runnable() {
@Override
public void run() {
try {
String html = getHtmlString(URL);
String score = parseHtml(html);
showData(score);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
private String getHtmlString(String urlString) throws IOException {
URL url = new URL(urlString);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
BufferedInputStream inputStream = new BufferedInputStream(connection.getInputStream());
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, len);
}
inputStream.close();
outputStream.close();
return outputStream.toString();
}
private String parseHtml(String html) {
Document document = Jsoup.parse(html);
Elements scoreElements = document.select("span.score strong");
if (scoreElements != null && !scoreElements.isEmpty()) {
return scoreElements.get(0).text();
} else {
return null;
}
}
private void showData(String data) {
runOnUiThread(new Runnable() {
@Override
public void run() {
mScoreTextView.setText(data);
}
});
}
}
```
在应用启动时,我们会新开一个线程获取页面 HTML 代码,并在获取成功后通过 Jsoup 解析评分数据,并在界面上展示评分。最后的效果如下图所示:
