JSoup দিয়ে ওয়েব স্ক্রেপিং

Sabbir Mollah
NSUACMSC
Published in
4 min readApr 16, 2018

--

আমাদের অধিকাংশেরই সকাল টা শুরু হয় নিউজ পোর্টাল এ চোখ বুলিয়ে। অনেকেই কর্ম ব্যস্ততার জন্য সে সময়টুকুও যেন বের করতে পারে না। তাই আমরা এখন দেখবো কিভাবে জাভা প্রোগ্রামিং এর সাহায্যে একটি ওয়েব স্ক্রেপার বানানো যায়, যে নিজে নিজেই কোন নিউজ এর ওয়েব সাইট থেকে হেডলাইন গুলো কনসোল অ্যাপ এর মদ্ধে নিয়ে আসতে পারবে।

ওয়েব স্ক্রেপিং কি?

কোন ওয়েব সাইট থেকে প্রয়োজনীয় ডেটা এক্সট্রাক্ট করাটাই হলো ওয়েব স্ক্রেপিং। যেমন আমরা যখন প্রথম আলো এর ওয়েব সাইট এ ঢুকি তখন ওদের সার্ভার থেকে একটা HTML Document আমাদের কম্পিউটার এ পাঠানো হয়। এরপর আমাদের ওয়েব ব্রাউজার সেই ডকুমেন্ট কে সুন্দর করে প্রদর্শন করে। আমরা চাইলেই, যেকোন ওয়েব পেজ এর উপর Right Click করে view source অপশন এ ক্লীক করে HTML Document কে দেখতে পারি। কিছু ক্ষেত্রে আমাদের ঐ HTML Document এর সব ইনফর্মেশন প্রয়োজন হয় না। এর জন্য আমাদের যেসব ইনফর্মেশন দরকার সেগুলোকে HTML থেকে আলাদা করাটাই হলো স্ক্রেপিং।

Inspecting a web document.

পূর্বশর্ত:

  1. আপনাকে অবশ্যই জাভার উপর ধারনা থাকতে হবে
  2. অব্জেক্ট ওরিয়েন্টেড প্রোগ্রামিং সম্পর্কে জানতে হবে
  3. যেকোন একটা জাভা আইডিই। IntelliJ হলে ভালো।

এখানে আমরা প্রথম আলো এর প্রধান পেজ কে Scrape করা দেখবো।

জাভা দিয়ে ওয়েব স্ক্রেপিং

জাভা দিয়ে ওয়েব স্ক্রেপিং এর জন্য ভালো একটা লাইব্রেরী হলো Jsoup. Jsoup একটি Third Party লাইব্রেরী যা JDK তে দেয়া থাকে না। তাই আমাদের সর্বপ্রথম কাজ হবে Jsoup download করা। Jsoup এখান থেকে ডাউনলোড করা যাবে jsoup-1.11.2.jar

এখন আমাদের এই লাইব্রেরীকে আমাদের প্রোজেক্ট এ include করতে হবে। ডিপেন্ডেন্সি কিভাবে include করে সেটা আমরা জানতে পারবো এই আর্টিকেল টি পড়ে।

Jsoup API

Jsoup এ কি কি class বা methods আছে তা Jsoup এর DOCUMENTATION দেখলেই জানা যাবে। কিন্তু আপাততো আমাদের সিম্পল প্রোগ্রাম এর জন্য এগুলো নিয়ে মাথা না ঘামালেও চলবে।

JSoup Documentation

CODING

অনেক বকবক করা হলো, এবার আমরা চলে আসি আমাদের প্রিয় অংশে, অর্থাৎ কোডিং এ।

আমাদের প্রধান টার্গেট হলো http://www.prothom-alo.com/ পেজ থেকে শুধুমাত্র হেডলাইন গুলো নিয়ে আসা।

প্রথমেই আমরা প্রয়োজনীয় দুইটা ক্লাস import করিঃ

import org.jsoup.Jsoup; 
import org.jsoup.nodes.Document;

এর পরে main মেথড এর মদ্ধে নিচের কোড টুকু লিখে দেখি।

Document doc = null; 
try{
doc=Jsoup.connect("http://www.prothom-alo.com/").get();
//most important line
}
catch (Exception ex){
System.out.println("Couldn't connect with the website.");
}

এখানে connect মেথডটি web page টির সাথে আমাদের একটি connection return করে। এইক্ষেত্রে web page টির সাথে কোন কারনে কানেকশন establish করতে না পারলে এ্কটা exception throw করে, যার কারনে try and catch ব্লক ব্যবহার করতে হয়েছে। এরপর get() মেথড এর কাজ হলো, ঐ connection থেকে HTML Document কে রিটার্ন করা। আমরা ঐ রিটার্ন করা HTML Document কে Document type এর doc নামক ভেরিয়েবল এ স্টোর করেছি।

আমাদের প্রোগ্রাম এইপর্যন্ত কাজ করতেছে কিনা সেটা দেখতে আমরা document টির টাইটেল প্রিন্ট করে দেখতে পারি।

String title = doc.title(); 
System.out.println(title);
Output webpage name

এখন আমাদের প্রথম আলো পেজ এর HTML স্ট্রাকচার দেখতে হবে।

দেখা যাচ্ছে যে, প্রত্যেকটি হেডলাইন <span class=”title”> </span> ট্যাগ এর মদ্ধে অবস্থিত। তাহলে, এখন আমাদের document থেকে যেসব span ট্যাগ এর class = “title” সেগু্লোকে আলাদা করতে হবে। HTML এর প্রত্যেকটা অব্জেক্ট কে Jsoup একেকটা Element হিসেবে দেখে। এ্কইভাবে অনেকগুলো Element কে Elements অব্জেক্ট হিসেবে দেখে।

তাহলে আমরা এখন এই দুইটা ক্লাস কে ইম্পোর্ট করিঃ

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

এখন document থেকে টাইটেল গুলোকে আলাদা করি।

Elements headlines = doc.select("span.title");     
// span with class=title

এখানে select() মেথড টি css query বা jQuery ইনপুট হিসেবে নিয়ে কাজ করে। এ সম্পর্কে বিস্তারিত এখানে দেয়া আছে। (https://jsoup.org/cookbook/extracting-data/selector-syntax)

এখন আমরা headlines ভেরিয়েবল এ থাকা টাইটেল গুলোকে একটি foreach loop দিয়ে প্রিন্ট করতে পারি।

for(Element headline : headlines){     
System.out.println(headline.text());
}

যারা foreach loop ব্যাবহার এ অভ্যস্ত না, তাদের জন্য এটার equivalent code

for(int i=0; i< headlines.size(); i++){     
System.out.println( headlines.eq(i).text() );
}

তাহলে আমাদের সম্পূর্ন প্রোগ্রামটি এরকমঃ

Conclusion

এখন চাইলেই আমরা এই ব্যাসিক টুকু ব্যবহার করে যেকোন webpage থেকে যেকোন information নিয়ে আসতে পারি। যেমন এই প্রোগ্রামটিকে আরেক্টু ইম্প্রুভ করে টাইটেল এর পাশাপাশি ঐ টাইটেল এর news url নিয়ে আসতে পারি যেন আপনি ঐ টাইটেল এর নাম্বার ইনপুট দিলে প্রোগ্রামটি সরাসরি আপনাকে ঐ বিস্তারিত নিউজ পেজ এ নিয়ে যাবে।

Please note that people create online contents at the cost of money and effort and everyone should respect their work. Thus you should not use Scraping in any illegal way. Also this post was written on educational purposes only. “Prothom Alo” was chosen for simplicity. You should follow these instructions at your own discretion.

--

--