Page Script

اسکریپت نویسی پایین ترین سطح استخراج اطلاعات می باشد و نیاز به دانش برنامه نویسی دارد. در نشونک معمولا نیازی به اسکریپت نویسی نمی باشد ولی گاها لازم می شود در صفحات داینامیک و پیچیده از قابلیت اسکریپت نویسی استفاده نمود. اسکریپت ها به زبان C# بوده و با یک مجموعه قوی از پراپرتی ها و متد ها، پشتیبانی می شود. موتور استخراج نشونک بعداز دانلود محتوای صفحه، ابتدا List ها را استخراج نموده و بعد اسکریپت ها را در صورت وجود اجرا می کند.

در ادامه موضوعات زیر را مطالعه خواهید کرد:


API استخراج اطلاعات

نشونک به منظور ایجاد ارتباط بین محیط اسکریپت نویسی و محیط استخراج اطلاعات، مجموعه متد ها و پراپرتی هایی را به عنوان واسط برنامه نویسی به اشتراک می گذارد.


پراپرتی های مشترک

نشونک به منظور ایجاد ارتباط بین محیط اسکریپت نویسی و محیط استخراج اطلاعات، مجموعه متد ها و پراپرتی هایی را به عنوان واسط برنامه نویسی به اشتراک می گذارد.

نوع داده نام پراپرتی توضیحات
NameValueCollection args جهت ارسال آرگومان (از جنس string) به یک صفحه وب و یا دریافت آرگومان از یک صفحه وب استفاده می شود. مثال جهت خواندن آرگومان level:
var received_level = args["level"].ToInt(0);
مثال جهت مقدار دهی آرگومان:
var new_level = received_level + 1; args["level"] = new_level.ToString();
جهت ارسال آرگومان های مقدار دهی شده به صفحه وب از متدهای GET و POST استفاده می گردد.
Uri Uri آدرس صفحه وب
Element Root جهت دسترسی به المان ریشه ساختار درختی HTML
QueryString QueryString دسترسی به پارامترهای QueryString را فراهم می کند. مثال :
QueryString[0] مقدار اولین پارامتر
QueryString[1] مقدار دومین پارامتر
QueryString[-1] مقدار آخرین پارامتر
QueryString["id"] مقدار پارامتر id
string PageName نام الگوی استخراج
string Title عنوان صفحه وب استخراج شده
string DocumentText محتوای دانلود شده صفحه وب
string ExtractionDate تاریخ میلادی زمان استخراج به فرمت yyyy/MM/dd HH:mm:ss
string ExtractionDateShamsi تاریخ شمسی زمان استخراج به فرمت yyyy/MM/dd HH:mm:ss

متد های مشترک

با استفاده از متدهای زیر می توانید به ساختار درختی html دسترسی داشته باشید، یک لینک را در مسیر مشخص دانلود کنید و یا یک الگوی استخراج را بر روی یک صفحه وب اعمال نمایید

int GET(string pageName, IEnumerable<string> urls, NameValueCollection args);
int GET(string pageName, string url, NameValueCollection args);
int GET(string pageName, string url, NameValueCollection args, string headers, bool enforce, string destFolder = null);
int POST(string pageName, string url, NameValueCollection args, string headers, string postData);
int POST(string pageName, string url, NameValueCollection args, string headers, string postData, Cookie[] cookies = null);
لینک به سایر الگو ها از طریق متد GET و POST امکان پذیر می باشد.
  • pageName: نام الگو
  • urls: لیست آدرس صفحات وب جهت دانلود و استخراج اطلاعات براساس الگوی اعلام شده
  • args: لیست آرگومانهای ارسالی به فرایند استخراج از صفحه مورد نظر
  • enforce: در صورتیکه صفحه مذکور قبلا دانلود و استخراج شده بود بار دیگر عملیات استخراج اجرا شود
  • destFolder: نام پارامتری که در صورت نیاز، محل ذخیره سازی محتوای دانلود شده را نشان می دهد
  • headers: شامل چندین خط می باشد که هر خط آن شامل نام فیلد هدر و مقدار آن می باشد که با : جداشده اند.
  • postData: جهت دانلود صفحه وب از طریق متد POST استفاده می گردد
  • cookies: لیست کوکی ها - هنگام فراخوانی دستور request و دانلود صفحه وب استفاده می گردد
void PostForm(string pageName, Element formElement, NameValueCollection namevalues, NameValueCollection args, string heade);
یک راه میانبر برای اجرای دستور POST با توجه به تگ Form موجود در صفحه که با formElement مشخص می گردد. مقدار Content-Type در هدر و نیز مقادیر مورد نیاز در post data بصورت اتوماتیک تنظیم می شوند.
string GetAttachment(string url, string destFolder, string headers);
string PostAttachment(string url, string destFolder, string headers, string postData, Cookie[] cookies = null);
جهت دانلود آدرس صفحه وب و ذخیره آن در کامپیوتر کاربر با متدهای GET و POST
void SaveHtml(string destinationFolder, bool downloadExternalLinks, bool localizeLinksAndScripts, bool localizeHyperLinks, bool localizeImages);
void SaveHtml(string html, string destinationFolder, bool downloadExternalLinks, bool localizeLinksAndScripts, bool localizeHyperLinks, bool localizeImages);
ذخیره صفحه وب جاری برروی کامپیوتر کاربر
string param(string parameterName);
دریافت مقدار پارامتر پروژه استخراج که توسط کاربر در WebScraper تنظیم شده است
string DownloadText(string url, string requestHeaders = null, string method = "GET", string postData);
Image DownloadImage(string url, string requestHeaders = null, string method = "GET", string postData);
جهت دانلود محتوای صفحه وب بصورت متن یا تصویر استفاده می گردد
ElementCollection dom(string selectorText);
ElementCollection dom(Element root, string selectorText, string capture);
جهت دسترسی به المان های صفحه وب استفاده می گردد. در صورت عدم تعریف root از Root صفحه وب جاری استفاده می گردد
dynamic NewRecord();
void Insert(string tableName, object r, string keyFields);
جهت استخراج اطلاعات و درج در خروجی اجرای فرایند استخراج استفاده می شود. متد NewRecord یک ردیف جدید ایجاد می کند و پس از مقدار دهی ستون های آن، متد Insert رکورد مذکور را در جدول اعلام شده درج می کند.
  • tableName: نام جدول (خروجی فرایند استخراج)
  • keyFields: شامل لیست فیلدهای اجباری جدول می باشند که با کاما جداشده اند. در صورتیکه هریک از این فیلدها در رکورد مذکور مقدار نداشته باشند عملیات درج صورت نمی گیرد.
string GetResponseCookieText(string cookieName = null);
مقدار کوکی مورد نظر را بر می گرداند.
Parser parser(string inputText);
جهت پردازش متن ورودی استفاده می شود
string MakeAbsoluteUrl(string relativeUri);
آدرس نسبی ورودی را با توجه به آدرس صفحه جاری به آدرس کامل تبدیل می کند.
void NothingFound();
یک exception با شرح Nothing found to extract! ایجاد می کند.
int GetTotalWebpageCount();
تعداد کل صفحات وب را بر می گرداند. شامل صفحات پردازش شده و صفحات در انتظار پردازش.
int RecordCount(string tableName);
تعداد رکورد هایی که تاکنون استخراج شده است را بر می گرداند
string SerializeJson(object obj);
T DeserializeJson<T>(string json);
مقدار یک آبجکت را به رشته json و یا بالعکس تبدیل می کند
Element GetXmlRoot(string xml);
متن xml را به ساختار درختی تدیل کرده و امکان دسترسی به المان ریشه در را فراهم می کند. دسترسی به سایر المان ها از طریق اعمال سلکتور برروی المان ریشه فراهم می گردد
string gstr(string globalVariableName);
long gint(string globalVariableName);
جهت ذخیره یک مقدار رشته ای یا عددی در یک متغیر global استفاده می گردد. متغیرهای global هنگام استخراج از هر یک از صفحات وب در یک پروژه استخراج، در دسترس می باشند
void gstr(string globalVariableName, string value);
void gint(string globalVariableName, long value);
جهت خواندن یک مقدار رشته ای یا عددی در یک متغیر global استفاده می گردد. متغیرهای global هنگام استخراج از هر یک از صفحات وب در یک پروژه استخراج، در دسترس می باشند

کلاس Element

کلاس Element یکی از پرکاربردترین کلاس ها جهت دسترسی به المان های صفحه وب می باشد. کد زیر پروتوتایپ این کلاس را نشان می دهد:


    
public class Element
{
    static Element Empty { get; }


    string  this [string attributeName] { get; }

    string Id { get; }
    string Name { get; }
    string Value { get; }
    string Text { get; }
    string PlainText { get; }
    string Html { get; }
    string InnerHtml { get; }
    string Url { get; }
    string Title { get; }
    string Alt { get; }
    string TitleOrAlt { get; }
    string CssClass { get; }

    object Body { get; }
    bool IsEmpty { get; }
    string SelectorText { get; }

    ElementCollection Children { get; }


    ElementCollection dom(string selectorText);
    string GetRelativeSelector(string parentSelector);
    Element GetParentByTagName(string tagName);
    Element GetParentByClassName(string className);
    Element GetParentByAttribute(string attributeName, string attributeValue);
    Element Child(int index);
    Element Child(int index, string tag);
    ElementCollection GetSiblings(bool next, bool includeMe, string tagName)

    string GetAttribute(string attributeName);
    string Capture(CaptureType captureType, string attr = "");
    string GetAttribute(string attributeName);
    string GetValueOrText(object option);
    void SetValue(string value);

    void Remove(Element item);
    void Remove(ElementCollection list);
    void Clear();
    void AddHtml(string html);
}


کلاس ElementCollection


    
public class ElementCollection
{
    Element this[int index] { get; }
	
    string[] Url { get; }
    string[] Text { get; }
    string FirstText { get; }
    string FirstUrl  { get; }
    int Count { get; }
    
    void Insert(int index, Element elem);
    void Add(Element elem);
    void Add(ElementCollection elements);
    void Remove(Element item);
    void Remove(ElementCollection elements);

    ICollection<string> GetAttribute(string attributeName);
    
    Element First();
    Element Last();
}


کلاس Parser

کلاس Parser جهت سهولت در پردازش یک متن مورد استفاده قرار می گیرد.


    
public class Parser
{
    string InputText { get; set;}
    List<Token> Tokens { get; }
    
    int Position { get; }
    int Count { get; }
    bool EOF { get; }
    
    Parser(string inputText);
    Parser Remove(TokenType tokenType);
    Parser RemoveNumbers();
    Parser RemoveTexts();
    Parser RemoveSymbols();    
    
    int FirstInt(int defaultValue);
    int LastInt(int defaultValue);
    
    int[] ToIntArray();
    double[] ToNumberArray();
    
    string ToDateTime(string datePartsOrders);   //datePartsOrders:  YMD | DMY | MDY | DM_SHAMSI | DM_MILADI
    string ToDate(string datePartsOrders);       //datePartsOrders:  YMD | DMY | MDY | DM_SHAMSI | DM_MILADI
    string ToTime();
    
    bool CanRead(string text);
    Parser Read(string text);
    Parser Read(string text, string[] args);
    Parser SkipUntil(string text);
    Parser SkipUntil(string text, string[] args);
    
    string ReadUntil(string text, string separator);
    bool Contains(string text);
}


Common Script

گاها لازم می شود یک کد مشترک در page script های یک یا چند الگوی استخراج تکرار گردد. برای سهولت در نگهداری و مدیریت این کدها می توان آنها را بصورت فانکشن در Common Script تعریف نمود. کدهای مشترک در کلیه الگوهای استخراج یک پروژه، قابل استفاده می باشد.


نمونه کد ها


نمونه کد 1: دسترسی به المانهای صفحه وب

Page Script
  var menu_items = dom("A.menu-item");
  foreach( var elem  in  menu_items)
  {
      var menu_text = elem.Text;
      var menu_Url = elem.Url;
  }

نمونه کد 2: لینک به الگوی استخراج GET

Page Script
  var brands = dom(".brandmenu-v2 LI > A");
  foreach( var br  in  brands)
  {
      args.BrandName = br.Text;
      GET("target page pattern name", br.Url, args);
  }

نمونه کد 3: لینک به الگوی استخراج POST

Page Script
  var formElement = dom("FORM");
  var parameters = new NameValueCollection();
  parameters.Add("SearchText", "استخراج اطلاعات");
  PostForm("target page pattern name", formElement, parameters, args, null);   

نمونه کد 4: دانلود یک Url

Page Script
  var images = dom(".makers LI img");
  foreach( var img  in  images)
  {
      DownloadImage(img.Url);
  }

نمونه کد 5: درج اطلاعات در یک جدول

Page Script
  var list_items = dom(".makers LI");
  foreach( var item  in  list_items)
  {
      var r = NewRecord();
      r.BrandName = args.BrandName;
      r.ProductName = item.dom("span").Text;
      r.ImageUrl = item.dom("img").Url;
      r.ExtractionUrl = Url;
      r.ExtractionDate = ExtractionDateShamsi;
      Insert("Phones", r, "");
  }

نمونه کد 6: تعریف فانکشن در CommonScript و فراخوانی آن

Common Script
  function void InsertPhone(string productName, string imageUrl)
  {
      var r = NewRecord();
      r.BrandName = args.BrandName;
      r.ProductName = item.dom("span").Text;
      r.ImageUrl = item.dom("img").Url;
      r.ExtractionUrl = Url;
      r.ExtractionDate = ExtractionDateShamsi;
      Insert("Phones", r, "");
  }
Page Script
  var list_items = dom(".makers LI");
  foreach( var item  in  list_items)
  {
      InsertPhone(item.dom("span").Text, item.dom("img").Url);
  }


  Loading...