Проведение внешнего поиска по сайту из кода - PullRequest
2 голосов
/ 28 июня 2011

У меня есть CSV-файл с фамилией, именем и почтовым индексом. Я хотел бы написать программу .NET для автоматического поиска почтового индекса и фамилии человека на сайте www.canada411.com и записи всех результатов в базу данных.

Я понятия не имею, как это сделать, но вот шаги, которые мне нужно сделать:

  1. Прочитать файл (я могу это сделать)
  2. Поиск www.canada411.com с информацией из файла (не знаю, как это сделать)
  3. Определить раздел результатов на странице (не знаю, как это сделать)
  4. Для каждого результата поиска прочитайте результат (не знаю, как это сделать) и сохраните в базе данных (я могу сделать этот последний бит).

Можете ли вы помочь направить меня в правильном направлении? Большое спасибо заранее

Ответы [ 3 ]

2 голосов
/ 28 июня 2011

То, что вы имеете в виду, это скриншот экрана, крайне ненадежный метод анализа результатов веб-страницы в значимую информацию.

Было бы гораздо лучше найти «службу поиска по почтовому индексу», которая предоставляетAPI для программного получения этой информации.Таким образом, ваш код не сломается только потому, что провайдер меняет дизайн своей веб-страницы.

Однако, чтобы достичь того, о чем вы просите, вы можете использовать WebClient или создать HttpWebRequest.Затем вы можете разобрать ответ на интересующую вас область html.

Пример использования HttpWebRequest - http://wiki.asp.net/page.aspx/285/httpwebrequest/
Лучший инструмент для разбора html - http://htmlagilitypack.codeplex.com/

0 голосов
/ 29 июня 2011

Мне было очень скучно так:

public class FourElevenLookup
{
    private const string URL = "http://www.canada411.ca/search/";
    private const string TYPE_PARAM = "?stype=si";
    private const string WHAT_PARAM = "&what=";
    private const string WHERE_PARAM = "&where=";

    public static List<SearchResult> GetResults(string lastName, string postalCode)
    {
        List<SearchResult> results = new List<SearchResult>();
        string fullUrl = URL + TYPE_PARAM + WHAT_PARAM + lastName +
            WHERE_PARAM + postalCode.Replace(" ", "+");
        string rawText = GetHtml(fullUrl);
        Regex getListings = new Regex("\\<\\!\\-\\- (listingDetail|listing) \\-\\-\\>(?<content>" + 
            "(.(?!(\\<\\!\\-\\- (\\/ listingDetail|listing) \\-\\-\\>)))*)", RegexOptions.Singleline);
        MatchCollection mc = getListings.Matches(rawText);
        List<string> rawListings = new List<string>();
        for (int i = 0; i < mc.Count; i++)
            rawListings.Add(mc[i].Groups["content"].Value);
        Regex parseListing = new Regex("\\<div class=\"c411ListingInfo\"\\>(.(?!a href=))*\\<a href\\=(.(?!\\>))*\">" + 
            "(?<name>[\\w- ]*)\\<\\/a\\>\\<br\\/\\>(.(?!span))*\\<span class\\=\"address\"\\>" + 
            "(?<address>(.(?!\\/span\\>))*)", RegexOptions.Singleline);            
        rawListings.ForEach(s =>
        {
            Match m = parseListing.Match(s);
            results.Add(new SearchResult()
            {
                Name = m.Groups["name"].Value,
                Address = m.Groups["address"].Value.Replace("<br/>", "")
            });
        });
        return results;
    }

    private static string GetHtml(string strURL)
    {
        string result;
        WebResponse objResponse;
        WebRequest objRequest = System.Net.HttpWebRequest.Create(strURL);
        objResponse = objRequest.GetResponse();
        using (StreamReader sr =
        new StreamReader(objResponse.GetResponseStream()))
        {
            result = sr.ReadToEnd();
            sr.Close();
        }
        return result;
    }
}

public struct SearchResult 
{
    public string Name { get; set; }
    public string Address { get; set; }
}
0 голосов
/ 28 июня 2011

Забавный вопрос.

1) Чтобы получить результаты страницы для имени человека Разнообразие способов, но я рекомендую WebClient на URL http://www.canada411.ca/search/?stype=si&what=Smith%2C+John, заменяя слова «Смит» и «Джон» соответствующимиЗначения в кодировке URL

2) С возвращенным результатом загрузить в объект XML Reader

3) Используя LINQ to XML или другой формат, такой как XPATH, собрать все элементы Div с class = "перечисление"

4) Для каждого элемента 3 выше используйте LINQ to XML или XDocument для чтения значений из узла и сохранения в переменных экземпляра соответственно.Потребуется некоторая логика синтаксического анализа.

5) Вставьте новую запись в вашу базу данных или обновите существующую запись

6) Повторите для всех узлов перечисления

Если вся информациявыше не имеет смысла для вас, то, боюсь, нет простого ответа.Самый простой способ - использовать бесплатный веб-сервис, спонсируемый правительством, если вы можете найти его и получить результаты согласованным образом.

Имейте в виду, что любые изменения в макете их страниц, именах классов и т. Д. Повредят ваш код.Очень ненадежный способ сбора информации, но может работать для начальной загрузки базы данных и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...