ساخت Crawler برای استخراج اطلاعات از سایت های دیگر

در اینترنت اطلاعات زیادی وجود دارد که می‌تواند برای شما مفید باشد. ممکن است برای شما هم پیش آمده باشد که به دنبال اطلاعاتی بوده باشید و با جستجو در اینترنت به آن دسترسی پیدا کرده باشید. اما گاهی برای خود من به عنوان یک برنامه‌نویس وب پیش آمده است که سفارشاتی را داشته ام که از من خواسته شده بود که سیستمی طراحی کنم که اطلاعات را به طور اتوماتیک از روی یک یا چندین وب سایت بخواند و با استفاده از آن وب سایت مشتری را به طور اتوماتیک بروز‌رسانی کند. اینجاست که این سوال به وجود می‌آيد که چگونه می‌توانیم به این اطلاعات بدون درخواست از تولید‌کننده اصلی محتوا دسترسی داشته باشیم ؟ پاسخ استفاده از Crawler است. در ایران هم سایت‌هایی وجود دارند که با عمل Crawling به اطلاعات وب‌سایت های معروف دسترسی پیدا می کنند و سپس با ترکیبی از خواسته ها و اهداف خود و همچنین اطلاعات بدست آمده از وب سایت‌های دیگر سرویس خاصی را به کاربران خود ارائه می دهند. برای مثال سایت مالتینا با دسترسی به اطلاعات و قیمت‌های محصولات سایت آمازون و محاسبه نرخ گمرک و حمل و نقل کالا از آمریکا به ایران، به فروش محصولات آمازون می پردازد و یا وب سایت ایمالز با خواندن قیمت محصولات در چندین فروشگاه آنلاین بهترین قیمت های یک محصول خاص را به شما پیشنهاد می دهد.در این مقاله قصد داریم تا با هم به ساخت یک Crawler ساده در کمتر از ۱ ساعت بپردازیم. قطعا این پروژه یک Prototype ساده خواهد بود که نیازمند این است که سر فرصت به بهینه سازی آن برای رفع نیازهای خودتان بپردازید. زبان برنامه نویسی که این Crawler با آن نوشته شده است جاواست و من شخصا از Eclipse برای توسعه این نرم افزار استفاده کرده ام.برای ساخت این Crawler به این موارد نیاز دارید:دانش سطحی از برنامه نویسی جاوادانش سطحی در مورد SQL و Mysqlهدفهدف از انجام این پروژه :دادن آدرس URL یک وب سایت دانشگاهی ( برای مثال در این پروژه من از وب سایت mit.edu استفاده کرده‌ام) و پیدا کردن تمام صفحاتی که واژه "Research" در آن به کار رفته است.یک Crawler معمولا به صورت زیر کار می‌کند:در ابتدا با دریافت URL صفحه نخست وب سایت به جستجو و تجزیه تحلیل لینک های موجود در آن ( در اصطلاح Parse کردن ) می پردازد. در اینجا من از jsoup برای این امر استفاده کرده‌ام که یک Parser خیلی خوب برای زبان برنامه نویسی جاوا است.در مرحله دوم به Parse کردن لینک های به دست آمده از فرایند قبلی می پردازد. در نهایت بررسی می کند که کدام یک از لینک ها قبلا پردازش شده‌اند، زیرا هر لینک تنها یکبار باید مورد پردازش قرار بگیرد، برای همین منظور است که ما از دیتابیس استفاده می کنیم.ساخت یک Mysql Database :اگر از سیستم عامل اوبونتو و یا سایر توزیع‌های لینوکس استفاده می کنید می توانید با استفاده از این راهنما روش نصب Apache, MySQL, PHP, phpMyAdmin را به راحتی دنبال کنید. اگر کاربر ویندوز هستید به راحتی با نصب Wamp Server می توانید به تمام چیزهایی که در این بخش نیاز دارید دسترسی پیدا کنید. Wamp را می توانید از وب سایت wampserver.com دانلود کنید. بر روی سیستم عامل مکینتاش هم می توانید از Xampp استفاده کنید.اما من از MySQLWorkbench در این آموزش استفاده کرده ام که رابط کاربری ساده‌ای داره که شما می‌توانید روش کار کردن با آن را پس از نصب در ادامه ببینید.ساختن database و table :برای ساختن database و table در MySQLWorkbench روی آیکون Create new Schema کلیک کنید و نام Schema خود را Crawler بگذارید. سپس روی دیتابیس ساخته شده کلیک کنید تا گزینه Tables را مشاهده کنید. بر روی Tables کلیک راست کنید و گزینه Create Table را انتخاب کنید.در پنجره باز شده دستورات زیر را وارد کنید: CREATE TABLE IF NOT EXISTS `Record` (`RecordID` int(11) NOT NULL AUTO_INCREMENT,`URL` text NOT NULL,PRIMARY KEY (`RecordID`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; شروع عملیات Crawling با استفاده از جاوا :دانلود jsoup core از وب سایت jsoupدانلود mysql-connector-java-xxxbin.jar از وب سایت mysql پروژه ای به نام Crawler در Eclipse بسازید و Jar فایل های مربوط به Jsoup و mysql connector را که دانلود کرده اید را به Build Path پروژه خود اضافه کنید. برای این منظور روی پروژه کلیک راست کنید و این مسیر را دنبال کنید :‌ select "Build Path" --> "Configure Build Path" --> click "Libraries" tab --> click "Add External JARs"کلاس DB را برای رسیدگی به امور database ایجاد کنید :import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class DB { public Connection conn = null; public DB() { try { Class.forName(&quotcom.mysql.jdbc.Driver&quot); String url = &quotjdbc:mysql://localhost:3306/Crawler&quot conn = DriverManager.getConnection(url, &quotroot&quot, &quot1234&quot); System.out.println(&quotconn built&quot); } catch (SQLException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public ResultSet runSql(String sql) throws SQLException { Statement sta = conn.createStatement(); return sta.executeQuery(sql); } public boolean runSql2(String sql) throws SQLException { Statement sta = conn.createStatement(); return sta.execute(sql); } @Override protected void finalize() throws Throwable { if (conn != null || !conn.isClosed()) { conn.close(); } } }۵. کلاسی با عنوان Main ایجاد کنید. این کلاس Crawler ما خواهد بود.import java.io.IOException; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; public class Main { public static DB db = new DB(); public static void main(String[] args) throws SQLException, IOException { db.runSql2(&quotTRUNCATE Record;&quot); processPage(&quothttp://www.mit.edu&quot); } public static void processPage(String URL) throws SQLException, IOException{ //check if the given URL is already in database String sql = &quotselect * from Record where URL = '&quot+URL+&quot'&quot ResultSet rs = db.runSql(sql); if(rs.next()){ }else{ //store the URL to database to avoid parsing again sql = &quotINSERT INTO `Crawler`.`Record` &quot + &quot(`URL`) VALUES &quot + &quot(?);&quot PreparedStatement stmt = db.conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); stmt.setString(1, URL); stmt.execute(); //get useful information Document doc = Jsoup.connect(&quothttp://www.mit.edu/&quot).get(); if(doc.text().contains(&quotresearch&quot)){ System.out.println(URL); } //get all links and recursively call the processPage method Elements questions = doc.select(&quota[href]&quot); for(Element link: questions){ if(link.attr(&quothref&quot).contains(&quotmit.edu&quot)) processPage(link.attr(&quotabs:href&quot)); } } } }در این لحظه شما موفق به ساختن crawler خود شدید. بیاید با هم به خروجی اپلیکیشن خود نگاهی بیندازیم.حال تلاش کنید که با استفاده از قطعه کدهای بالا Crawler های خود را بسازید و اطلاعاتی که علاقمند هستید از سایت‌های مختلف استخراج کنید را بدست آورید. برای بحث و تبادل نظر در این رابطه هم می‌توانید با کلیک بر روی این لینک در کانال تلگرامی من عضو شوید.