در اینترنت اطلاعات زیادی وجود دارد که میتواند برای شما مفید باشد. ممکن است برای شما هم پیش آمده باشد که به دنبال اطلاعاتی بوده باشید و با جستجو در اینترنت به آن دسترسی پیدا کرده باشید. اما گاهی برای خود من به عنوان یک برنامهنویس وب پیش آمده است که سفارشاتی را داشته ام که از من خواسته شده بود که سیستمی طراحی کنم که اطلاعات را به طور اتوماتیک از روی یک یا چندین وب سایت بخواند و با استفاده از آن وب سایت مشتری را به طور اتوماتیک بروزرسانی کند. اینجاست که این سوال به وجود میآيد که چگونه میتوانیم به این اطلاعات بدون درخواست از تولیدکننده اصلی محتوا دسترسی داشته باشیم ؟ پاسخ استفاده از Crawler است.
در ایران هم سایتهایی وجود دارند که با عمل Crawling به اطلاعات وبسایت های معروف دسترسی پیدا می کنند و سپس با ترکیبی از خواسته ها و اهداف خود و همچنین اطلاعات بدست آمده از وب سایتهای دیگر سرویس خاصی را به کاربران خود ارائه می دهند. برای مثال سایت مالتینا با دسترسی به اطلاعات و قیمتهای محصولات سایت آمازون و محاسبه نرخ گمرک و حمل و نقل کالا از آمریکا به ایران، به فروش محصولات آمازون می پردازد و یا وب سایت ایمالز با خواندن قیمت محصولات در چندین فروشگاه آنلاین بهترین قیمت های یک محصول خاص را به شما پیشنهاد می دهد.
در این مقاله قصد داریم تا با هم به ساخت یک Crawler ساده در کمتر از ۱ ساعت بپردازیم. قطعا این پروژه یک Prototype ساده خواهد بود که نیازمند این است که سر فرصت به بهینه سازی آن برای رفع نیازهای خودتان بپردازید. زبان برنامه نویسی که این Crawler با آن نوشته شده است جاواست و من شخصا از Eclipse برای توسعه این نرم افزار استفاده کرده ام.
برای ساخت این Crawler به این موارد نیاز دارید:
هدف از انجام این پروژه :
دادن آدرس URL یک وب سایت دانشگاهی ( برای مثال در این پروژه من از وب سایت mit.edu استفاده کردهام) و پیدا کردن تمام صفحاتی که واژه "Research" در آن به کار رفته است.
یک Crawler معمولا به صورت زیر کار میکند:
اگر از سیستم عامل اوبونتو و یا سایر توزیعهای لینوکس استفاده می کنید می توانید با استفاده از این راهنما روش نصب Apache, MySQL, PHP, phpMyAdmin را به راحتی دنبال کنید. اگر کاربر ویندوز هستید به راحتی با نصب Wamp Server می توانید به تمام چیزهایی که در این بخش نیاز دارید دسترسی پیدا کنید. Wamp را می توانید از وب سایت wampserver.com دانلود کنید. بر روی سیستم عامل مکینتاش هم می توانید از Xampp استفاده کنید.
اما من از MySQLWorkbench در این آموزش استفاده کرده ام که رابط کاربری سادهای داره که شما میتوانید روش کار کردن با آن را پس از نصب در ادامه ببینید.
برای ساختن 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 ;
select "Build Path" --> "Configure Build Path" --> click "Libraries" tab --> click "Add External JARs"
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("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/Crawler" conn = DriverManager.getConnection(url, "root", "1234"); System.out.println("conn built"); } 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("TRUNCATE Record;"); processPage("http://www.mit.edu"); } public static void processPage(String URL) throws SQLException, IOException{ //check if the given URL is already in database String sql = "select * from Record where URL = '"+URL+"'" ResultSet rs = db.runSql(sql); if(rs.next()){ }else{ //store the URL to database to avoid parsing again sql = "INSERT INTO `Crawler`.`Record` " + "(`URL`) VALUES " + "(?);" PreparedStatement stmt = db.conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); stmt.setString(1, URL); stmt.execute(); //get useful information Document doc = Jsoup.connect("http://www.mit.edu/").get(); if(doc.text().contains("research")){ System.out.println(URL); } //get all links and recursively call the processPage method Elements questions = doc.select("a[href]"); for(Element link: questions){ if(link.attr("href").contains("mit.edu")) processPage(link.attr("abs:href")); } } } }
در این لحظه شما موفق به ساختن crawler خود شدید. بیاید با هم به خروجی اپلیکیشن خود نگاهی بیندازیم.
حال تلاش کنید که با استفاده از قطعه کدهای بالا Crawler های خود را بسازید و اطلاعاتی که علاقمند هستید از سایتهای مختلف استخراج کنید را بدست آورید. برای بحث و تبادل نظر در این رابطه هم میتوانید با کلیک بر روی این لینک در کانال تلگرامی من عضو شوید.