18-04-2007, 09:21
|
|
|
חבר מתאריך: 21.01.07
הודעות: 58
|
|
כתבתי משהו פשוט, שיודע לבדוק מספר אתרים ולהפסיק ברגע שמצא כתובת.
הרעיון פשוט - לכל אתר כזה יש CLASS משלו, שיודע גם את כתובת האתר וגם איך לשלוף את הכתובת מתוך הטקסט של האתר. אנחנו יוצרים מופעים של כל CLASS כזה ושמים במערך. עכשיו רצים על המערך, קוראים לכל Class כזה לפי Interface מוגדר מראש, ומחכים שאחד האתרים יחזיר תשובה. אם קיבלנו - אנחנו מדפיסים ועוצרים. אם לא - ממשיכים לאתר הבא.
הלוגיקה לכל אתר נמצאת ב-CLASS המתאים לו, כך שאפשר גם לכתוב כמה CLASS-ים לאותו אתר, אבל כל CLASS ינסה שיטה אחרת לניתוח הטקסט.
כרגיל, לא ממש בדקתי לעומק ולא השקעתי בשיפור ביצועים.
בהצלחה.
JAM
קוד:
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
namespace IPRetrieve
{
///<summary>
/// Interface for a web page supplying the client's IP address
///</summary>
interfaceWebDataProvider
{
///<summary>
/// Getter for provider's URL (i.e., http://myprovider.com)
///</summary>
string URL
{
get;
}
///<summary>
/// Parser method for scraping IP address
///</summary>
///<param name="data">String containing the text of the web page</param>
///<returns>IP address if parsing successfull, String.Empty otherwise</returns>
string ParseIP(string data);
};
///<summary>
/// WebDataProvider implementation for http://www.whatismyip.com
///</summary>
classWhatIsMyIPProvider : WebDataProvider
{
publicstring URL
{
get
{
return"http://www.whatismyip.com";
}
}
publicstring ParseIP(string data)
{
// Look for the <TITLE> tag in the HTML, that contains the IP address
Regex expr = newRegex("<TITLE>WhatIsMyIP.com - ([0-9.]+)</TITLE>");
Match match = expr.Match(data);
if (!match.Success)
returnString.Empty;
return match.Groups[1].Value;
}
}
classProgram
{
staticvoid Main(string[] args)
{
// Array of providers to check
WebDataProvider[] providers = newWebDataProvider[]
{ newWhatIsMyIPProvider(),
// Add any new providers here
};
for(int i=0; i<providers.Length; i++)
{
// Get the next provider available
WebDataProvider thisProvider = providers[i];
Console.WriteLine("Provider: {0}", thisProvider.URL);
try
{
// Try calling the provider's URL and retrieving the HTML text
WebResponse response = WebRequest.Create(thisProvider.URL).GetResponse();
StreamReader reader = newStreamReader(response.GetResponseStream());
// Try parsing (screen-scraping) the provider's data
string result = thisProvider.ParseIP(reader.ReadToEnd());
if(!result.Equals(String.Empty))
{
// If address available, quit here
Console.WriteLine(result);
break;
}
}
catch (Exception ex)
{
Console.WriteLine("Error: {0}", ex.Message);
}
}
}
}
}
|