Google search from code

17 בפברואר 2012

תגיות: , , , ,
3 תגובות


 


הגיעה אלי בקשה מעניינת.

 


"יש לנו בסיס נתונים המכיל ספקים, לכל ספק יש עשרות מוצרים ואנחנו לא מעוניינים להכניס לבסיס הנתונים את הקשר בין מוצרים לספקים מכיוון שיש יותר מידי, מה ניתן לעשות כדי לחסוך את הצורך להכניס ידנית את המידע."

 

הפיתרון שהצעתי להם הוא אמנם לא מושלם אבל בהחלט מספק אותם.

 

כידוע לגוגל יש אפשרות חיפוש בתוך אתר, לדוגמא: shlomo goldberg site:sela.co.il יחפש את השם shlomo goldberg בתוך האתר של סלע.

 

הרעיון היה להכניס לבסיס הנתונים רק את כתובת האתר של כל ספק, ובזמן שהמשתמש יחפש את המוצר, מקוד נבצע פנייה לגוגל עבור כל אחד מהספקים ונחזיר את התוצאה הראשונה (כשכמובן מודעים לכך שייתכן שתחזור תשובה לא רלוונטית).

 

 

אז איך מחפשים בגוגל מקוד, הקוד עצמו והדרך לבצע אותו הגיע מכאן.

ותודה ליהלום המוכשר עידן לנגר על העזרה בכתיבת הפיתרון.

 

 

הקוד המלא ניתן להורדה מכאן, (בפוסט אני מציג רק חלק מהקוד הרלוונטי)

 

 

כשנפנה לגוגל מקוד נקבל תוצאה בפורמט json, כדי שנוכל לעבוד בקלות נגדיר אובייקטים עובר התוצאה.

 

האובייקט העיקרי נראה כך:

 



[DataContract]


public class Result


{


    [DataMember(Order = 0)]


    public string GsearchResultClass { get; set; }


 


    [DataMember(Order = 1, Name = "unescapedUrl")]


    public string UnescapedUrl { get; set; }


 


    [DataMember(Order = 2, Name = "url")]


    public string Url { get; set; }


 


    [DataMember(Order = 3, Name = "visibleUrl")]


    public string VisibleUrl { get; set; }


 


    [DataMember(Order = 4, Name = "cacheUrl")]


    public string CacheUrl { get; set; }


 


    [DataMember(Order = 5, Name = "title")]


    public string Title { get; set; }


 


    [DataMember(Order = 6, Name = "titleNoFormatting")]


    public string TitleNoFormatting { get; set; }


 


    [DataMember(Order = 7, Name = "content")]


    public string Content { get; set; }


}


 

 

מתוך כל המאפיינים, החשובים ביותר הם ה – Title המכיל את הכותרת כפי שמופיע בגוגל, וה – UnescapeUrl המכיל את הכתובת לדף, ומאפיין ה – Content המכיל את התוכן מתוך החיפוש.

 

יש עוד מחלקות שעטופות את המחלקה הזו (כדי לראות אותם הורידו את הקוד המלא).

 

כעת נכתוב את המחלקה הבאה:

 



public static class Search


{


    private const string URL_TEMPLATE = "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q={0}";


    private static WebClient _client;


    private static DataContractJsonSerializer _jsonSerializer;


 


    static Search()


    {


        _client = new WebClient();


        _jsonSerializer = new DataContractJsonSerializer(typeof(GoogleResponseWrapper));


    }


 


    public static GoogleResponseWrapper GetSearchResults(string query, string webSite = null)


    {


        AddWebSiteIfNeeded(ref query, ref webSite);


        string searchUrl = string.Format(URL_TEMPLATE, query);


 


        byte[] answer = _client.DownloadData(searchUrl);


 


        using (MemoryStream ms = new MemoryStream(answer))


        {


            GoogleResponseWrapper results = (GoogleResponseWrapper)_jsonSerializer.ReadObject(ms);


            return results;


        }


    }


 


    private static void AddWebSiteIfNeeded(ref string query, ref string webSite)


    {


        if (!string.IsNullOrEmpty(webSite))


        {


            webSite = webSite.Replace("http://www.", string.Empty).Replace("www.", string.Empty);


            query += " site:" + webSite;


        }


    }


}


 

 

המתודה העיקרית GetSearchResult מקבלת מחרוזת ואתר לחפש בו (פרמטר לא חובה) מורידה את ה – json מגוגל, ומפרססת אותו לאובייקטים.

 

כעת ניתן לכתוב את קוד ה – aspx הבא:

 



<asp:Repeater ID="rpt" runat="server">


    <HeaderTemplate>


        <dl>


    </HeaderTemplate>


    <ItemTemplate>


        <dt>


            <a href='<%#Eval("UnescapedUrl") %>'><%#Eval("Title") %></a>       


        </dt>


        <dd>


            <%#Eval("Content") %>


        </dd>


        <br />


    </ItemTemplate>


    <FooterTemplate>


        </ul>


    </FooterTemplate>


</asp:Repeater>


 

ובצד השרת:

 



var res = Search.GetSearchResults(txtSearch.Text, txtSite.Text);


rpt.DataSource = res.ResponseData.Results;


rpt.DataBind();


 

 

אם לדוגמא נחפש "שלמה" באתר של סלע, נקבל תוצאה כזו:

 

shlomo in sela

 

 

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *

3 תגובות

  1. שמואל19 בפברואר 2012 ב 8:41

    למעשה אתה חושף כאן מנוע שקיים בכמה מאתרי ה SEO, אם כי בצורה מעט שונה.
    הנקרא "בודק מיקומים בגוגל"
    המנוע הזה מקבל מילת מפתח ושם אתר, ובוחן האם ובאיזה מיקום האתר הספציפי מופיע כתוצאת חיפוש למילת המפתח.
    תוך שינויים קטנים, ניתן להמיר את הקוד לקוד זה המשמש רבות את מקדמי האתרים [ולקוחותיהם]

    הגב
  2. Johnd4530 באפריל 2014 ב 16:28

    on the other hand, you could find inexpensive features allow me to explain allow a topline model and you desire to create quilts just for your special Hermes Evelyne travelling bag include. cbddebagffbk

    הגב
  3. Johnd7572 במאי 2014 ב 1:49

    Good writeup, I am normal visitor of one's site, maintain up the excellent operate, and It's going to be a regular visitor for a long time. kadabfdkeggd

    הגב