Как брать информацию с сайта с

Как брать информацию с сайта с

Добавлено: 19/11/2019 13:05 | Обновлено: 19/11/2019 14:25 | Добавил: nick | Просмотры: 10813 Комментарии: 1

В этом материале вы познакомитесь с основами парсинга сайтов с использованием языка программирования С#.

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

1. Поиск текста с помощью встроенных в класс String методов
Самый быстрый и понятный для новичков в программировании на С# способ.

Представим, что нам нужен только заголовок страницы, который лежит в теге . HTML код будет выглядеть таким образом: Задача сводится к поиска позиции фраз «» и «», и вырезанию текста между ними. Такой код хорошо оформить в виде функции: Использовать такой код можно так: Такой способ хорошо подходит для одиночного поиска и когда искомый текст окружен уникальными последовательностями (в данном случае — тегами и ).

c# Парсинг сайтов с использованием HttpClientHandler/HttpClient и библиотеки HtmlAgilityPack

2. Поиск текста с помощью регулярных выражений
Предыдущий способ плохо работает, если prefix и suffix имеют сложный вид, или вообще неизвестны, но известна структура искомого текста.

Например, нам нужны все ссылки со страницы. Тогда поиск можно организовать так: В результате выполнения кода в переменной links будет список уникальных ссылок, отсортированных в алфавитном порядке.

Подобный способ подразумевает умение составлять регулярные выражения. Протестировать ваши регулярные выражения удобно на сайте regex101.com.

3. Использование библиотеки HtmlAgilityPack (https://html-agility-pack.net/)
Следующая степень удобства — использование сторонних библиотек, например HtmlAgilityPack. Данная библиотека умеет строить DOM дерево по HTML коду. При этом сам код нужно получить заранее: Тогда получить страницу можно так (для примера — каталог вакансий): Анализируя код, нужно понять:

1) По какому принципу формируются URL страниц со списком вакансий (их обычно несколько).

https://joblab.ru/search.php?r=vacmaxThread=100page=2
https://joblab.ru/search.php?r=vacmaxThread=100page=3 . 2) Как узнать номер последней подобной страницы?

(Клик правой кнопкой по элементу в Chrome — просмотреть код) Все кнопки навигации имеют класс «pager», притом последняя из таких кнопок — содержит номер последней страницы 3) Какого вида ссылки на страницы с данными?

Сылки начинаются с «/vac»: 4) Открыв страницу с вакансией, подобным образом ищем интересующие поля — название, телефон, email, описания и т.п.

Новый браузер для windows xp

Чтобы не делать множество запросов к серверу, можно получить код страницы однократно, и сохранить его. //Получение HTML кода страниц с товарами Тогда код парсера будет такой: После парсинга данные сохраняются любым удобным способом. Чаще всего это csv файл.

Ниже представлен простейший код для формирования небольшого по размеру csv файла (для больших файлов желательно использовать StreamWriter) в каждом значении кавычки заменяются на двойные кавычки, переводы строк заменяются на пробел и значение обрамляется двойными кавычками. Каждая запись отделяется от другой переводом строки.

Парсинг сайта в эксель

Здесь ключ словаря — url, значение словаря — кортеж из 7 string(хотя тут можно применить и List и массив строк и т.п.) Все эти способы подойдут для парсинга большинства простых сайтов. Напоследок, подскажу как улучшить ваш парсер.

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

Многие сайты активно сопротивляются, если заподозрят вас в парсинге, поэтому есть смысл продумать использование прокси-серверов.

Источник

Парсинг веб-страниц на С#

Написать данную статью мне захотелось после прочтения статьи «Учимся бороться с ëÒÁËÏÚÑÂÒÙ».

Мне тоже как-то понадобилось выкачивать много веб-страниц из сети. Сначала начал использовать для этого PHP, позже Python. Потом мой выбор пал на С#. Собственно про получении страниц я столкнулся с той же проблемой, что описана в вышеуказанной статье.

Обратившись к интернету с вопросом о кодировках, я наткнулся на одну мысль: «Если мы получаем страницу из сети, мы обязательно должны получить и информацию о кодировке этой страницы ». Думаю, тут все понятно, да и средства для этого сегодня уже разработаны и ждут лишь часа, когда мы сможем ими воспользоваться. Это касается и С#.

С помощью таких классов как HttpWebRequest и HttpWebResponse можно создать запрос и получить ответ от сервера. При этом ответ сервера, на первый взгляд, содержит всю необходимую информацию для определения кодировки получаемой страницы. Полученный объект типа HttpWebResponse содержит свойства CharacterSet и ContentType. Казалось бы, нет ничего проще, как взять и использовать данные параметры.

И тут возникают подводные камни(в результате парсинга разных страниц): 1)CharacterSet иногда не соответствует реальной кодировке страницы. 2) ContentType обычно содержащий строчку типа «text/html; charset=windows-1251», не содержит поля charset. Таким образом выяснить кодировку страницы не представляется возможным на основе анализа ответа сервера.

Как зайти в Яндекс диск по логину и паролю чужой

Как известно, информацию о кодировке страницы также включают и в саму страницу в виде тега типа />. Таким образом информацию о кодировке можно попробовать получить отсюда. Тут все просто, получаем поток ответа сервера и пытаемся преобразовать его в строку. Для этого я создавал объект типа StreamReader и вызывал метод ReadToEnd(). Казалось бы все логично, но опять возникла проблема.

При создании объект типа StreamReader можно указать или не указывать кодировку получаемых данных. По умолчанию установлена кодировка(насколько я понял) UTF-8. То есть если получаешь страницу в данной кодировке, то все работает и отображается как надо, страницы в отличной кодировке отображаются криво.

В принципе, проблема решаема, найти в этом кривом тексте строку типа /> взять из нее информацию о кодировке и по новой запросить страницу. Однако, это двойная работа. Поэтому был выбран другой путь. Я решил получать массив байтов, благо на глаза попался сайт где уже был реализованный класс StreamHelper:

class StreamHelper
public static byte[] ReadToEnd(System.IO.Stream stream)
long originalPosition = 0;

if (stream.CanSeek)
originalPosition = stream.Position;
stream.Position = 0;
>

try
byte[] readBuffer = new byte[4096];

int totalBytesRead = 0;
int bytesRead;

while ((bytesRead = stream.Read(readBuffer, totalBytesRead, readBuffer.Length — totalBytesRead)) > 0)
totalBytesRead += bytesRead;

if (totalBytesRead == readBuffer.Length)
int nextByte = stream.ReadByte();
if (nextByte != -1)
byte[] temp = new byte[readBuffer.Length * 2];
Buffer.BlockCopy(readBuffer, 0, temp, 0, readBuffer.Length);
Buffer.SetByte(temp, totalBytesRead, (byte)nextByte);
readBuffer = temp;
totalBytesRead++;
>
>
>

byte[] buffer = readBuffer;
if (readBuffer.Length != totalBytesRead)
buffer = new byte[totalBytesRead];
Buffer.BlockCopy(readBuffer, 0, buffer, 0, totalBytesRead);
>
return buffer;
>
finally
if (stream.CanSeek)
stream.Position = originalPosition;
>
>
>
>

Собственно от него лишь требуется перевести поток в массив байтов. Для анализа этого массива байт реализовал следующий класс:

class PageConverter
public static void convert(Stream responseStream, ref StringBuilder responseData, string ContentType)
byte[] bt = StreamHelper.ReadToEnd(responseStream);

После работы метода convert в responseData сохраняется страница в виде строки с правильной кодировкой.
Собственно на этом и все. Это мой первый опыт программирования на С#, поэтому чего-то могу не знать, в силу отсутствия опыта. Буду рад советам, более опытных коллег.

Как закрыть дзен на странице Яндекса
Источник

Пусть за нас все делают боты. Парсинг сайтов на C# и Anglesharp

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

Начало третьего семестра, и новый предмет «Алгоритмы и структуры данных» ведет тот же препод что прошлые два семестра вел у нас предмет «Алгоритмизация и программирование». Так как название последнего не предполагает чего либо конкретного то на нем нас вводили в специальность с помощью паскаля и лабораторных работ на чтение файлов, сортировок и вывода математических графиков на экран. Алгоритмы и структуры данных звучит более конкретно, нас будут учить различным алгоритмам и ничего лишнего быть не должно верно? Почти верно.

На первой лабораторной работе мы изучаем методы сортировки, входные данные даются нам в файле мы должны его отсортировать разными методами и сравнить их, все логично. И тут есть маленькое «но», мы сортируем два вида данных, числа и массив записей, в моем варианте это были фильмы с полями «Название» «Режиссер» «Жанр» «Год выпуска». Препод не понятно по какой причине заставляет нас выполнять дополнительную работу по реализации этих записей и потом их парсинг из файла по не совсем понятной мне причине. К сожалению, задание дано — нужно делать.

Это было небольшое вступление и ворчание о жизни, теперь то из за чего я на самом деле благодарен этому дополнительному геморрою с записями. Нам нужно заполнять файлы самостоятельно. Файл на 5000 тысяч чисел создать не сложно, а файл из 100 записей? Можно было бы написать скрипт и поля будут содержать значения «gdheno», но я решил сделать свою жизнь чуть интересней и заодно выучить полезную технологию. «А что если написать парсер который будет брать эти данные с imdb?»

Так как у меня есть год опыта работы на C# делать парсер я решил на нем. Небольшой гугл поиск и я понял что есть два способа сделать это. Первый — ничего кроме встроенных фич .Net, достать нужную инфу с помощью регулярных выражений и методов System.LINQ. И второй — использовать AngleSharp.

Насмотревшись мемов про регулярные выражения и имея нежелание точить колесо и потом собирать велосипеды я остановился на Anglesharp’е. Работать с этой библиотекой оказалось очень просто, я думал что начав работу над проектом я буду изучать технологию дня 3, и потом засяду с кодом еще на 5 так как с вебом раньше я не работал. Но вышло так что сохранение данных в .json файл отняло у меня больше сил.

Как установить браузер tor в kali linux

Приложение в итоге выглядит так:

В этом окне видно текст бокс с превью тех данных что мы достанем с imdb, дроп даун с количеством фильмов которые мы хотим достать, кнопку «Get» по нажатии которой происходит парсинг, и кнопку «Save» которая сохранит это в файл. Я согласен что создавать графический интерфейс для проги которая нужна только для одной простой задачи это лишнее усложнение, но Windows Forms Designer встроенный в Visual Studio делает этот процесс намного проще. К тому же, я решил делать лабораторную с графическим окном, почему бы немного не потренироваться? Итак, я хочу запарсить данные с сайта на Anglesharp, с чего мне начать?

Чтобы запарсить страницу, необходимо ее получить, скачать html код этой страницы. В Anglesharp веб страницу представляет интерфейс IDocument который реализует методы необходимые нам для парсинга этой страницы. Чтобы скачать страницу с нужного url в формате этого интерфейса нужно действовать как предлагает нам этот туториал:

using var context = BrowsingContext.New(Configuration.Default); using var doc = await context.OpenAsync(url);

Теперь перейдем к самому вкусному мясу — парсинг этого html кода. Сейчас у нас есть переменная doc реализующая интерфейс IDocument и представляющая веб страницу которую мы только что достали. В этом интерфейсе есть много чего интересного, мы можем достать всю информацию о веб странице, включая head, body, title, url, cookie, мы можем добавить элементы или выполнить команды, это все очень круто, но нас сейчас интересуют методы GetElementsByClassName , GetElementsByName и GetElementsByTagName возвращающие коллекцию html элементов которые содержат переданный класс, имя или тег. Класс имя и тег нужны чтобы идентифицировать элемент на странице и показать его как то по особенному. Я уверен что на веб странице которую вы хотите запарсить практически каждый html элемент будет иметь какой либо из этих атрибутов.

Теперь давайте сделаем шаг назад и поговорим о том как вообще html элементы представлены в Anglesharp. Здесь классические отношения Parent и Child, у каждого элемента страницы который представлен интерфейсом IElement есть свои поля с Id, ClassName, Html и прочим, и также знакомые методы GetElementsByClassName и GetElementsByTagName которые дают нам доступ к детям этого элемента.

Не запускается Яндекс на ноутбуке что делать

Давайте теперь применим эти знания на практике, на том что делал я. Заходим на страницу релизов imdb, нажимаем F12 и высматриваем способ получить список фильмов на этой странице. Замечаем что все фильмы находятся в элементе с классом list detail и в нем у каждый код принадлежит классу list_item odd или list_item even . То есть чтобы иметь лист из фильмов нам достаточно сделать так:

Хочу заметить что когда мы вызываем например метод GetElementsByClassName , то он вернет лист html элементов и они будут отсортированы в порядке «Кого я нашел первым». В моем примере я достаю лист элементов с классом list detail и потом беру детей первого элемента в этом листе, того элемента который в html странице расположен выше.

У нас есть список фильмов, нам нужно достать название, жанр, режиссера и год каждого элемента. Достать имя просто, оно находится внутри h4 атрибута в таблице и его можно достать с помощью метода QuerySelector :

Замечу что в атрибуте h4 у нас джек пот, мы имеем и имя и год выпуска. Делить их будем чуть позже, сейчас у нас чуть более интересная ситуация с жанром. Они раскиданы в span атрибутах класса cert-runtime-genre и в них замешаны разделители |, избавиться от них не сложно:

var genres = films[i].GetElementsByClassName(«cert-runtime-genre»)[0].QuerySelectorAll(«span») .Where(element => element.TextContent != «|»);

Достаем все span атрибуты и затем из них отбираем те чей текст не равен |, изи. И тут есть но, может проблема только моя, но мой браузер не показывает мне что там есть возрастной рейтинг и моя строка жанров выглядит как «Sci-Fi Action 13+». Пришлось идти на костыли:

string genre = «»; foreach (var g in genres) genre += g.TextContent + ‘ ‘; // filtering out age limit genre = new string(genre.Where(c => c != ‘+’ (c < ‘0’ || c >’9′)).ToArray()).Trim();

До тех пока не появится жанр содержащий в себе плюсы или цифры я в безопасности. С режиссером полегче, это первая ссылка внутри блока с классом txt-block . Можно сказать мы закончили, осталось заполнить наш массив с фильмами:

Film это моя структура содержащая поля для названия, режиссера, жанра и года выпуска фильма. Ее я и записывал в .json и позже читал из него, но это не тема данной статьи так что говорить об этом не буду.

Источник
Рейтинг
Загрузка ...