एंड्रॉइड में Jsoup लाइब्रेरी से वेब स्क्रैपिंग — पूरा गाइड
Jsoup एक लोकप्रिय Java HTML पार्सर लाइब्रेरी है जो "जक्वेरी-जैसे" सिंटैक्स में HTML डॉक्यूमेंट से डेटा निकालने, मैनिपुलेट करने और साफ़ करने की सुविधा देती है। यह एंड्रॉइड में वेब स्क्रैपिंग के लिए मानक विकल्प है।
⚠️ महत्वपूर्ण चेतावनी
कानूनी/नैतिक नोट: किसी वेबसाइट को स्क्रैप करने से पहले उसकीrobots.txtऔर Terms of Service जांचें। कई साइट्स स्क्रैपिंग प्रतिबंधित करती हैं। आधिकारिक API उपलब्ध हो तो उसी का उपयोग करें। अत्यधिक रिक्वेस्ट्स से सर्वर पर लोड पड़ता है —Thread.sleep()या रेट लिमिटिंग का उपयोग करें।
चरण 1: नया प्रोजेक्ट बनाएं
Android Studio → File → New → New Project → "Empty Activity" → Finish।
चरण 2: Jsoup डिपेंडेंसी जोड़ें (build.gradle.kts / build.gradle)
// build.gradle (Module: app) — Groovy DSL
dependencies {
implementation 'org.jsoup:jsoup:1.17.2' // नवीनतम वर्ज़न जांचें
}
// या Kotlin DSL (build.gradle.kts)
dependencies {
implementation("org.jsoup:jsoup:1.17.2")
}
सिंक करने के बाद Sync Now दबाएं।
चरण 3: इंटरनेट परमिशन (AndroidManifest.xml)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="com.example.webscrapingdemo">
<uses-permission android:name="android.permission.INTERNET" />
<application ...>
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
चरण 4: Layout (activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
tools:context=".MainActivity">
<Button
android:id="@+id/btnScrape"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="32dp"
android:text="वेबसाइट से डेटा निकालें" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@id/btnScrape"
android:layout_marginBottom="16dp">
<TextView
android:id="@+id/tvResult"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="14sp"
android:lineSpacingExtra="4dp"
android:text="परिणाम यहां दिखेगा..." />
</ScrollView>
</RelativeLayout>
चरण 5: MainActivity.java — AsyncTask में स्क्रैपिंग
नोट: AsyncTask API 30+ में डिप्रिकेटेड है। आधुनिक कोड में Coroutines + OkHttp या RxJava का उपयोग करें। यह उदाहरण केवल Jsoup API समझाने के लिए है।
package com.example.webscrapingdemo;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
private TextView tvResult;
private Button btnScrape;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvResult = findViewById(R.id.tvResult);
btnScrape = findViewById(R.id.btnScrape);
btnScrape.setOnClickListener(v -> new ScrapeTask().execute());
}
// बैकग्राउंड थ्रेड में नेटवर्क ऑपरेशन
private class ScrapeTask extends AsyncTask<Void, Void, String> {
@Override
protected void onPreExecute() {
tvResult.setText("लोड हो रहा है...");
}
@Override
protected String doInBackground(Void... voids) {
try {
// वेबसाइट से HTML डॉक्यूमेंट प्राप्त करें
Document doc = Jsoup.connect("https://www.tutorialspoint.com/css_online_training/index.asp")
.userAgent("Mozilla/5.0 (Android) Jsoup Scraper") // कुछ साइट्स बॉट ब्लॉक करती हैं
.timeout(10000) // 10 सेकंड टाइमआउट
.get();
// उदाहरण: सभी हेडिंग्स निकालें
Elements headings = doc.select("h2");
StringBuilder sb = new StringBuilder();
sb.append("पाए गए हेडिंग्स (").append(headings.size()).append("):\n\n");
for (Element heading : headings) {
sb.append("• ").append(heading.text()).append("\n");
}
// उदाहरण: सभी लिंक्स निकालें
Elements links = doc.select("a[href]");
sb.append("\nपाए गए लिंक्स (").append(links.size()).append("):\n\n");
int count = 0;
for (Element link : links) {
if (count++ > 10) break; // केवल पहले 10 दिखाएं
String href = link.attr("abs:href"); // एब्सोल्यूट URL
String text = link.text().trim();
if (!text.isEmpty()) {
sb.append("• ").append(text).append(" → ").append(href).append("\n");
}
}
return sb.toString();
} catch (IOException e) {
e.printStackTrace();
return "त्रुटि: " + e.getMessage();
}
}
@Override
protected void onPostExecute(String result) {
tvResult.setText(result);
}
}
}
चरण 6: चलाएं और टेस्ट करें
- डिवाइस/एमुलेटर पर ऐप इंस्टॉल करें।
- "वेबसाइट से डेटा निकालें" बटन दबाएं।
- कुछ सेकंड में पेज के हेडिंग्स और लिंक्स TextView में दिखेंगे।
💡 Jsoup के शक्तिशाली सेलेक्टर्स (CSS-style)
| सेलेक्टर | अर्थ | उदाहरण |
|---|---|---|
tag | टैग नाम से | doc.select("div") |
#id | ID से | doc.select("#main-content") |
.class | क्लास से | doc.select(".article-body") |
[attr] | एट्रिब्यूट मौजूद है | doc.select("a[href]") |
[attr=value] | एट्रिब्यूट मान बराबर | doc.select("input[type=submit]") |
parent > child | डायरेक्ट चाइल्ड | doc.select("ul > li") |
ancestor descendant | कोई भी डिसेंडेंट | doc.select(".container p") |
:contains(text) | टेक्स्ट कंटेन करता है | doc.select("p:contains(Android)") |
🚀 आधुनिक विकल्प: Coroutines + OkHttp + Jsoup
// build.gradle.kts
dependencies {
implementation("org.jsoup:jsoup:1.17.2")
implementation("com.squareup.okhttp3:okhttp:4.12.0")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3")
}
// Repository/ViewModel में
suspend fun scrapeWebsite(): Result<String> = try {
val client = OkHttpClient()
val request = Request.Builder()
.url("https://example.com")
.header("User-Agent", "Mozilla/5.0")
.build()
val response = client.newCall(request).await()
val html = response.body?.string() ?: return Result.failure(IOException("Empty body"))
val doc = Jsoup.parse(html)
val titles = doc.select("h1, h2, h3").map { it.text() }
Result.success(titles.joinToString("\n"))
} catch (e: Exception) {
Result.failure(e)
}
सारांश
- ✅ Jsoup एंड्रॉइड में HTML पार्सिंग/स्क्रैपिंग का मानक लाइब्रेरी है।
- ✅ CSS सेलेक्टर्स से डेटा निकालना बहुत आसान है।
- ⚠️ कभी भी मेन थ्रेड पर नेटवर्क कॉल न करें — ANR क्रैश होगा।
- ⚠️ कानूनी/नैतिक दिशानिर्देशों का पालन करें।
- 🔄 नए प्रोजेक्ट्स के लिए Coroutines + OkHttp + Jsoup कॉम्बिनेशन बेहतर है।