Extraction Service

بعد از تهیه الگوی استخراج، نوبت به اعمال این الگو بر روی صفحات وب و واکشی اطلاعات می رسد. برای استخراج اطلاعات 2 راه ذیل وجود دارد:

  1. WebAPI استخراج اطلاعات
  2. نرم افزار Neshoonak.WebScraper

در این مقاله به بررسی مشخصات فنی WebAPI منتشر شده توسط نشونک و تشریح برنامه سی شارپ نمونه جهت فراخوانی این WebAPI می پردازیم. در ادامه، مطالب زیر را خواهید خواند:



مشخصات سرویس

با استفاده از این سرویس می توانید در برنامه های کاربردی به آخرین اطلاعات موجود در صفحات وب دسترسی داشته باشید. جدول ذیر مشخصات این سرویس را در نشان می دهد:

آدرس http://neshoonak.ir/api/ExtractionService/extract
متد POST
پارامترهای ورودی
  • ApiKey
  • Session: جهت نگهداری آخرین وضعیت فراخوانی صفحات وب (optional)
  • ProjectId: کد پروژه استخراج (جهت ایجاد پروژه استخراج به صفحه ایجاد الگوی استخراج بروید)
  • Parameters: لیست مقادیر پارامترهای پروژه استخراج
  • Webpage: مشخصات صفحه وب جهت استخراج که دارای ساختار ذیل می باشد:
    • Url: آدرس صفحه وب
    • PagePatternName: مشخص می کند آدرس صفحه وب مربوط به کدام الگوی تعریف شده در پروژه استخراج می باشد
پارامترهای خروجی
  • Data: یک dataset شامل لیست کلیه جداول استخراج شده
  • Links: لیستی از صفحات وب که باید استخراج گردند. (این صفحات دارای ساختاری مشابه با Webpage فوق دارند)
  • error: در صورتیکه سمت سرور خطایی رخ دهد این پارامتر شامل شرح خطا خواهد بود

ApiKey

اولین قدم جهت فراخوانی سرویس، تولید ApiKey می باشد. از این کلید جهت شناسایی کاربر و کنترل سطح دسترسی وی استفاده می شود. بدین منظور در وب سایت نشونک وارد صفحه پروفایل شده و در بخش ApiKey گزینه Generate را انتخاب نماید

ApiKey تولید شده را نگهداری نمایید. برای فراخوانی سرویس به آن نیاز دارید.


نمونه برنامه تست سرویس

این سرویس با ASP.NET Web API پیاده سازی شده است. برای آشنایی بیشتر با نحوه فراخوانی سرویس های Web API می توانید به مستندات وب سایت میکروسافت مراجعه کنید.

فراخوانی سرویس از طریق کلاس HttpClient انجام می شود. برای استفاده از این کلاس باید در ویژوال استودیو پکیج System.Net.Http نسخه 4.3.3 را از طریق nuget نصب نمایید. فانکشن GetClient جهت ایجاد یک نمونه از کلاس HttpClient و اعمال تنظیمات اولیه استفاده می گردد.


    public HttpClient GetClient()
    {
        var clientHandler = new HttpClientHandler();
        clientHandler.Proxy = WebRequest.DefaultWebProxy;
        clientHandler.UseProxy = WebRequest.DefaultWebProxy != null;
        var client = new HttpClient(clientHandler, true);
        client.BaseAddress = new Uri("http://neshoonak.ir/");
        return client;
    }

جهت فراخوانی سرویس، پس از ایجاد یک نمونه از کلاس HttpClient باید پارامتر ورودی args را از طریق متد POST برای سرویس ارسال نماییم. در صورت عدم بروز خطا، در فراخوانی سرویس، نتیجه اجرای آن در متغیر result ذخیره می شود. اگر هنگام اجرای سرویس خطایی در سمت سرور رخ دهد، مقدار فیلد error در خروجی سرویس با شرح خطا پر می شود لذا در صورت وجود مقدار در این فیلد مجددا خطایی با شرح SERVER ERROR منتشر می شود.


    public ServiceResponse Extract(ExtractionServiceArgs args)
    {
        using (var client = GetClient())
        {
            var task = client.PostAsync("api/extractionservice/extract", args, new JsonMediaTypeFormatter());
            task.Wait();
            using (HttpResponseMessage resp = task.Result)
            {
                if (resp.StatusCode != System.Net.HttpStatusCode.OK)
                {
                    if (resp.StatusCode != System.Net.HttpStatusCode.InternalServerError)
                        throw new Exception(resp.StatusCode.ToString());
                    var bt = resp.Content.ReadAsStringAsync();
                    bt.Wait();
                    throw new Exception(resp.StatusCode.ToString(), new Exception(bt.Result));
                }
                var bodyTask = resp.Content.ReadAsAsync<ServiceResponse>();
                bodyTask.Wait();
                var result = bodyTask.Result;
                if (!string.IsNullOrEmpty(result.error))
                {
                    throw new Exception("SERVER ERROR: " + result.error);
                }
                return result;
            }
        }
    }

در کد فوق پارامتر args از نوع کلاس ExtractionServiceArgs است که پارامتر ورودی سرویس را مشخص می کند پارامتر خروجی نیز از نوع کلاس ServiceResponse می باشد. کد ذیل ساختار کلاسهای مذکور را تعریف می کند.


    public class ExtractionServiceArgs
    {
        public string ApiKey { get; set; }
        public string ProjectId { get; set; }
        public string[] Parameters { get; set; }
        public string Session { get; set; }
        
        public WebpageInfo Webpage { get; set; }
    }
  
    public class WebpageInfo
    {
        public string PagePatternName { get; set; }
        public string Url { get; set; }
        public string Method { get; set; }
        public string PostData { get; set; }
        public string ExtendedData { get; set; }    }
        public bool IsAttachment { get; set; }
    }
  
    public class ServiceResponse
    {
        public string Session { get; set; }
        public DataSet Data { get; set; }
        public WebpageInfo[] Links { get; set; }
        public string error { get; set; }
    }
    

تست برنامه

برای تست این برنامه، پروژه استخراج "قیمت جهانی طلا" را انتخاب می کنیم. در این پروژه قیمت یک اونس طلا و نقره (برحسب دلار آمریکا) از وب سایت goldprice.org استخراج و در جدولی به نامه GoldPrice ذخیره می گردد.

در برنامه تست، پارامترهای ورودی را بشکل زیر تغییر دهید:

ProjectId GoldPrice
PagePatternName main
Url https://data-asg.goldprice.org/dbXRates/USD,USD,USD,USD,USD,USD

شکل زیر نتیجه اجرای سرویس را نشان می دهد:


دانلود سورس برنامه

اکنون می توانید نسخه کامل برنامه تست سرویس استخراج را دانلود کنید: سورس برنامه | برنامه کامپایل شده (exe)



  Loading...