Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.07.2012, 11:33   #1
SnaiperArts
Пользователь
 
Регистрация: 12.07.2012
Сообщений: 15
По умолчанию Парсинг сайта

Здравствуйте. Пытаюсь сделать парсер для целого сайта:
1. Спарсить ссылки на необходимые страницы со всего сайта
2. Пройтись по данным страницам и выдрать необходимую информацию с них (текст, и картинки).
3. Сделать локальную БД по этому сайт( с БД все сделано уже, написал добавление данных и вывод).

Посоветуйте пожалуйста статьи по парсингу с примерами кода. Самое главное, чтобы было хорошо разъяснено.

Буду премного благодарен.

Последний раз редактировалось SnaiperArts; 17.07.2012 в 11:36.
SnaiperArts вне форума Ответить с цитированием
Старый 17.07.2012, 11:51   #2
Reskov
Форумчанин
 
Аватар для Reskov
 
Регистрация: 17.12.2008
Сообщений: 250
По умолчанию

1. Спарсить ссылки на необходимые страницы со всего сайта
для этого я в свое время использовал YQL , xpath там очень просто получать ссылки. вы будите получать их ввиде json или xml
2. затем опять же тем YQL или чем-то сторонним .net ным выдираем текст картинки, качаем их либо с помощью HttpWebRequest, либо с помощью Bits
http://developer.yahoo.com/yql/
http://www.cypressnorth.com/blog/pro...safari-jquery/

так примерно выглядит запрос выбираем все ссылки с programmersforum
Код:
http://query.yahooapis.com/v1/public/yql?q=select href from html where url='http://programmersforum.ru' and xpath='//a'
test

Последний раз редактировалось Reskov; 17.07.2012 в 12:00.
Reskov вне форума Ответить с цитированием
Старый 17.07.2012, 14:24   #3
SnaiperArts
Пользователь
 
Регистрация: 12.07.2012
Сообщений: 15
По умолчанию

К сожалению не получается ссылки таким образом получить

Код:
http://query.yahooapis.com/v1/public/yql?q=select href from html where url='http://www.alleng.ru' and xpath='//a'
может выдерать из html?
Посоветовать что-нибудь стоящее почитать? Желательно на русском.
SnaiperArts вне форума Ответить с цитированием
Старый 17.07.2012, 15:09   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

HtmlAgilityPack
Код по извлечению всех ссылок (тэг a с аттрибутом href) будет примерно таким:
http://programmersforum.ru/showthread.php?t=130225

Последний раз редактировалось pu4koff; 17.07.2012 в 15:42.
pu4koff вне форума Ответить с цитированием
Старый 17.07.2012, 15:23   #5
Reskov
Форумчанин
 
Аватар для Reskov
 
Регистрация: 17.12.2008
Сообщений: 250
По умолчанию

Цитата:
К сожалению не получается ссылки таким образом получить
Добавьте and compat="html5"
Код:
http://query.yahooapis.com/v1/public/yql?q=select href from html where url='http://www.alleng.ru' and xpath='//a' and compat="html5"
Reskov вне форума Ответить с цитированием
Старый 17.07.2012, 21:16   #6
SnaiperArts
Пользователь
 
Регистрация: 12.07.2012
Сообщений: 15
По умолчанию

Спасибо за наводки.
Воспользовался HtmlAgilityPack.

Тут другая проблемка возникла: сайт в кодировке windows-1251, и во время вывода получаются "каракули"
Кять как можно менять кодировку подскажите? (пробовал сохранять в файл, а уже в нем поменять кодировку, но это к положительному результату не привело).

Код на котором бы хотелось увидеть как сменить кодировку:
Код:
            HtmlWeb web = new HtmlWeb();
            HtmlAgilityPack.HtmlDocument doc = web.Load(textBox1.Text);
            HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//p[@style='margin:0 20px; text-indent:50px; ']");
            if (doc != null)
            {
                foreach (HtmlNode node in nodes)
                {
                    
                    richTextBox1.Text = richTextBox1.Text +node.InnerText.Trim(); //использую для отладки...
                  }
            }
Посоветуйте где можно почитать по подробнее про HtmlAgilityPack на русском языке? С англ. не очень, а разобраться в его неплохом функционале охото.
SnaiperArts вне форума Ответить с цитированием
Старый 17.07.2012, 21:27   #7
Петррр
Форумчанин
 
Аватар для Петррр
 
Регистрация: 02.09.2011
Сообщений: 336
По умолчанию

Код:
using System;
using System.IO;
using System.Net;
using System.Text;

class Program
{
    static void Main(string[] args)
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.programmersforum.ru/");
        Stream stream = request.GetResponse().GetResponseStream();
        string html = null;
        using (stream)
        {
            // Указали, что из потока нужно читать в кодировке windows-1251
            using (StreamReader reader = new StreamReader(stream, Encoding.GetEncoding(1251)))
            {
                html = reader.ReadToEnd();
            }
        }
        // Вывод будет без каракулей.
        Console.WriteLine(html);
        /**
         * Дальнейший парсинг
         */ 
        Console.ReadKey(true);
    }
}
Если ты не можешь найти то, ради чего стоит жить, лучше найти то, за что стоит умереть
Петррр вне форума Ответить с цитированием
Старый 17.07.2012, 21:28   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

попробуйте использовать свойство OverrideEncoding у HtmlWeb
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 18.07.2012, 09:44   #9
SnaiperArts
Пользователь
 
Регистрация: 12.07.2012
Сообщений: 15
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
попробуйте использовать свойство OverrideEncoding у HtmlWeb
В версии 1.4.0 его нету.

Петррр, Ваш метод работает, но не могу толком связать с HtmlAgilityPack, чтобы работало через него.
Пытался сделать еще так, чтобы изменить спарсенный текст:
Код:
Encoding win1251 = Encoding.GetEncoding(1251);
                byte[] bytesStr = Encoding.Default.GetBytes(text);
                richTextBox1.Text = win1251.GetString(bytesStr);

Не подскажите как сделать правильно, не зависимо каким методом?
Посоветуйте статьи на русском пожалуйста по HttpAgilityPack, охото разобраться в функционале его.
SnaiperArts вне форума Ответить с цитированием
Старый 18.07.2012, 10:08   #10
SnaiperArts
Пользователь
 
Регистрация: 12.07.2012
Сообщений: 15
По умолчанию

Вроде как нашел способ связать, но выдается ошибка.

Код преобразования кодировки:
Код:
public string getRequest(string url)
        {

            try
            {
                var httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
                httpWebRequest.AllowAutoRedirect = false;
                httpWebRequest.Method = "GET"; 
                httpWebRequest.Referer = "http://google.com"; 
                using (var httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse())
                {
                    using (var stream = httpWebResponse.GetResponseStream())
                    {
                        using (var reader = new StreamReader(stream, Encoding.GetEncoding(1251)))
                        {
                            return reader.ReadToEnd();
                        }
                    }
                }
            }
            catch
            {
                return String.Empty;
            }
        }
В этом коде ошибка:
Код:
HtmlWeb web = new HtmlWeb();
HtmlAgilityPack.HtmlDocument doc = web.Load(getRequest(textBox1.Text)); //Недопустимый URI: Недопустимая схема URI.
SnaiperArts вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
парсинг сайта Jadson Работа с сетью в Delphi 0 14.05.2012 23:30
Парсинг ссылок сайта demiancz Общие вопросы Delphi 9 27.02.2012 01:00
парсинг сайта на bash Backo Помощь студентам 2 15.09.2011 17:24
парсинг сайта CodeNOT PHP 1 21.03.2011 09:48
Парсинг сайта AnToHa-KiLL Общие вопросы Delphi 3 30.06.2009 08:22