Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.96/47: Рейтинг темы: голосов - 47, средняя оценка - 4.96
1 / 1 / 0
Регистрация: 14.12.2014
Сообщений: 123
.NET 4.x

Парсинг КиноПоиска и защита от роботов

25.12.2016, 02:23. Показов 10048. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В процессе написания программы для парсинга Кинопоиска столкнулся со следующей проблемой: запросы программы распознаются Кинопоиском как робот и вместо целевой страницы в программу возвращается страница со скриншота ниже. Посоветуйте, как обойти это ограничение. Желательно, как можно подробнее, т.к. ранее не сталкивался с работой с html-страницами
Миниатюры
Парсинг КиноПоиска и защита от роботов  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.12.2016, 02:23
Ответы с готовыми решениями:

Парсинг кинопоиска
Всем здравствуйте! Передо мной стоит задача вытащить с сайта Кинопоиск имя пользователя и все названия фильмов и соответственно все оценки...

Парсинг информации о фильме с кинопоиска
Здравствуйте! Столкнулся с проблемой при создании приложения на android studio. Я хочу, чтобы приложение получало название фильма и с...

Защита от роботов
Как защитить гостевую от роботов-спамеров? Или форму регистрации на сайте? Например, чтобы картинка выдавалась с захламленным изображением...

35
1 / 1 / 0
Регистрация: 14.12.2014
Сообщений: 123
27.12.2016, 23:35  [ТС]
Студворк — интернет-сервис помощи студентам
а то, что пустая строка возвращается - это ничего?
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
27.12.2016, 23:51
Цитата Сообщение от igor_m Посмотреть сообщение
а то, что пустая строка возвращается - это ничего?
Я(как и остальные тут) не обладаю экстрасенсорными способностями. Я не могу знать, правильно вы шлете запрос или нет. Ответ на этот впорос виден в сниффере.
0
1 / 1 / 0
Регистрация: 14.12.2014
Сообщений: 123
28.12.2016, 00:38  [ТС]
вот весь код, связанный с запросом
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
using System.Net;
using HtmlAgilityPack;
using System.Net.Http;
using System.Threading.Tasks;
 
namespace KinopoiskParserLib
{
    public sealed class KinopoiskParser
    {
        private const string BaseUrl = "https://www.kinopoisk.ru/film/";
 
        public Movie Parse(uint id)
        {
            string htmlCode = GetHtml(id.ToString());
            HtmlDocument doc = new HtmlDocument();
            doc.LoadHtml(htmlCode);
            var headerFilm = doc.GetElementbyId("headerFilm");
            var infoTableNode = doc.GetElementbyId("infoTable");
            string rusName = Trim(headerFilm.SelectSingleNode("h1").InnerText);
            string engName = Trim(headerFilm.SelectSingleNode("span").InnerText);
            uint year = uint.Parse(infoTableNode.SelectSingleNode("table/tr[1]/td[2]/div/a").InnerText);
            string country = Trim(infoTableNode.SelectSingleNode("table/tr[2]/td[2]/div").InnerText);
            string slogan = ValidateAndCorrect(Trim(infoTableNode.SelectSingleNode("table/tr[3]/td[2]").InnerText));
            string director = Trim(infoTableNode.SelectSingleNode("table/tr[4]/td[2]/a").InnerText);
            return new Movie(rusName, engName, year, country, slogan, director, "");
        }
 
        private string ValidateAndCorrect(string value)
        {
            return WebUtility.HtmlDecode(value); //иногда вместо знака "<" попадается &lt; вот и конвертим в "<", аналогично с "«"
        }
 
        private string Trim(string text)
        {
            return text.Trim(new char[] { ' ', '\r', '\n' });
        }
 
        private string GetHtml(string id)
        {
            using (var client = new HttpClient())
            {
                client.DefaultRequestHeaders.Add("Accept-Language", "ru-Ru,ru;q=0.5");
                client.DefaultRequestHeaders.Add("Accept-Charset", "Windows-1252,utf-8;q=0.7,*;q=0.7");
                client.DefaultRequestHeaders.Add("UserAgent", "Opera/9.80 (Windows NT 6.1; WOW64; MRA 8.2 (build 6870)) Presto/2.12.388 Version/12.16");
 
                Task<string> task = client.GetStringAsync(BaseUrl + id);
                task.Wait();
                return task.Result;
            }
        }
    }
}
через какой сниффер лучше смотреть?
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
28.12.2016, 00:50
igor_m, я уже в данной теме упоминал про сниффер Fiddler, каким пользуюсь сам. Так же существуют и другие, например Charles и тд.
0
18 / 18 / 15
Регистрация: 27.11.2013
Сообщений: 470
28.12.2016, 01:58
Тоже недавно столкнулся с этой проблемой, когда кинопоиск стал считать меня "роботом". В этом случае советую просто определять содержимое получаемого ответа от запроса. Если там есть что-то указывающее на капчу - выводите где-нибудь отдельно тот же веббраузер, вводите капчу и работайте дальше. По крайне мере, мне такой способ помог.
Еще, как вариант, можно все передаваемые данные выбрать из веббраузера и подставлять их в запрос.
Ну и самый нерациональный, но 100% способ - каждую новую страничку полностью загружать в вебраузере, получать исходный код страницы и парсить его с помощью html agility pack. Например, так:
C#
1
2
3
HtmlAgilityPack.HtmlDocument HD = new HtmlAgilityPack.HtmlDocument();
HD.LoadHtml(webBrowser1.Document.Body.OuterHtml);
//дальше ваш запрос на выборку
Если же не хотите использовать компонент, можно, как писали вам ранее в теме, передавать все необходимые данные, узнав их с помощью того же fiddler. Плюс не забывайте о тайминге. Если у вас много запросов, то не стоит их слать друг за другом без остановки, рано или поздно все равно робот вас "спалит".
0
 Аватар для 1231231ghacking
102 / 106 / 62
Регистрация: 19.11.2015
Сообщений: 380
28.12.2016, 12:00
Этот метод, который вы используете:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
private string GetHtml(string id)
        {
            using (var client = new HttpClient())
            {
                client.DefaultRequestHeaders.Add("Accept-Language", "ru-Ru,ru;q=0.5");
                client.DefaultRequestHeaders.Add("Accept-Charset", "Windows-1252,utf-8;q=0.7,*;q=0.7");
                client.DefaultRequestHeaders.Add("UserAgent", "Opera/9.80 (Windows NT 6.1; WOW64; MRA 8.2 (build 6870)) Presto/2.12.388 Version/12.16");
 
                Task<string> task = client.GetStringAsync(BaseUrl + id);
                task.Wait();
                return task.Result;
            }
        }
равносилен по возвращаемому значению с этим методом:
C#
1
2
3
4
5
6
7
8
9
10
private string GetHtml(string id)
        {
            using (var client = new HttpClient())
            {
                client.DefaultRequestHeaders.Add("Accept-Language", "ru-Ru,ru;q=0.5");
                client.DefaultRequestHeaders.Add("Accept-Charset", "Windows-1252,utf-8;q=0.7,*;q=0.7");
                client.DefaultRequestHeaders.Add("UserAgent", "Opera/9.80 (Windows NT 6.1; WOW64; MRA 8.2 (build 6870)) Presto/2.12.388 Version/12.16");
                return client.GetStringAsync(BaseUrl + id).Result;
            }
        }
Т.е. не нужно делать лишний раз новый task и вызывать на нем Wait.
И еще, я использовал тот метод, который я вам скидывал и задержки никакой не было, ответ приходит моментально и кинопоиск не считает меня роботом.Не знаю, что конкретно, но что-то точно вы делаете не так
0
1 / 1 / 0
Регистрация: 14.12.2014
Сообщений: 123
28.12.2016, 15:20  [ТС]
Цитата Сообщение от 1231231ghacking Посмотреть сообщение
Что-то на подобии этого должно быть:
C#Выделить код
1
2
client.DefaultRequestHeaders.Add("Accept ", "application/*+xml;version=5.1");
client.DefaultRequestHeaders.Add("Author ization", "Basic " + authstring);
что подразумевается под authstring?
у меня тоже моментально возвращается, но возвращает пустую строку.
задержка начинается примерно после 160й итерации
0
 Аватар для 1231231ghacking
102 / 106 / 62
Регистрация: 19.11.2015
Сообщений: 380
28.12.2016, 15:25
это код не должен быть у вас, у вас должен быть метод такой:
C#
1
2
3
4
5
6
7
8
9
10
private string GetHtml(string id)
        {
            using (var client = new HttpClient())
            {
                client.DefaultRequestHeaders.Add("Accept-Language", "ru-Ru,ru;q=0.5");
                client.DefaultRequestHeaders.Add("Accept-Charset", "Windows-1252,utf-8;q=0.7,*;q=0.7");
                client.DefaultRequestHeaders.Add("UserAgent", "Opera/9.80 (Windows NT 6.1; WOW64; MRA 8.2 (build 6870)) Presto/2.12.388 Version/12.16");
                return client.GetStringAsync(BaseUrl + id).Result;
            }
        }
Зачем вы еще что-либо придумываете?

C#
1
2
client.DefaultRequestHeaders.Add("Accept", "application/*+xml;version=5.1");
client.DefaultRequestHeaders.Add("Authorization", "Basic " + authstring);
Это я скинул лишь пример того, как может быть.Не обязательно, что у вас так же должно быть.Каждый пишет те Хедеры, которые нужно ему.
0
1 / 1 / 0
Регистрация: 14.12.2014
Сообщений: 123
28.12.2016, 15:47  [ТС]
вот, что выдает сниффер

17:44:27:6910 HTTPSLint> Warning: ClientHello record was 317 bytes long. Some servers have problems with ClientHello's greater than 255 bytes. https://github.com/ssllabs/res... ntolerance

A SSLv3-compatible ClientHello handshake was found. Fiddler extracted the parameters below.

Version: 3.1 (TLS/1.0)
Random: 58 63 B3 6A D8 1F A7 61 43 A1 81 BA D1 21 D2 19 91 1A E4 8E CC 6D D0 7D E0 26 DC 18 B3 7A B3 94
"Time": 23.09.2026 10:27:52
SessionID: empty
Extensions:
server_name www.kinopoisk.ru
elliptic_curves unknown [0x1D), secp256r1 [0x17], secp384r1 [0x18]
ec_point_formats uncompressed [0x0]
SessionTicket empty
extended_master_secret empty
renegotiation_info 00
Ciphers:
[C00A] TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
[C009] TLS1_CK_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
[C014] TLS1_CK_ECDHE_RSA_WITH_AES_256_CBC_SHA
[C013] TLS1_CK_ECDHE_RSA_WITH_AES_128_CBC_SHA
[0039] TLS_DHE_RSA_WITH_AES_256_SHA
[0033] TLS_DHE_RSA_WITH_AES_128_SHA
[0035] TLS_RSA_AES_256_SHA
[002F] TLS_RSA_AES_128_SHA
[000A] SSL_RSA_WITH_3DES_EDE_SHA
[0038] TLS_DHE_DSS_WITH_AES_256_SHA
[0032] TLS_DHE_DSS_WITH_AES_128_SHA
[0013] SSL_DHE_DSS_WITH_3DES_EDE_SHA
[0005] SSL_RSA_WITH_RC4_128_SHA
[0004] SSL_RSA_WITH_RC4_128_MD5

Compression:
[00] NO_COMPRESSION
0
 Аватар для 1231231ghacking
102 / 106 / 62
Регистрация: 19.11.2015
Сообщений: 380
29.12.2016, 12:44
Вы не то скидываете, что нужно...
0
 Аватар для 1231231ghacking
102 / 106 / 62
Регистрация: 19.11.2015
Сообщений: 380
29.12.2016, 12:47
Примерно вот такие хедеры вам нужно отправлять в запросе
Миниатюры
Парсинг КиноПоиска и защита от роботов  
0
1 / 1 / 1
Регистрация: 11.06.2015
Сообщений: 37
25.10.2017, 12:32
igor_m, Подскажите, пожалуйста, вам удалось решить эту проблему?
0
1 / 1 / 0
Регистрация: 14.12.2014
Сообщений: 123
25.10.2017, 12:39  [ТС]
да, вот, что я использовал
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
private string GetHtml(string id)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(BaseUrl + id);
            request.UserAgent = "Opera/9.80 (Windows NT 6.1; WOW64; MRA 8.2 (build 6870)) Presto/2.12.388 Version/12.16";
            request.Headers.Add("Accept-Language: ru-Ru,ru;q=0.5");
            request.Headers.Add("Accept-Charset: Windows-1252,utf-8;q=0.7,*;q=0.7");
            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            {
                string encoding = response.Headers["Content-Type"].ToString().Split(new string[] { "charset=" }, StringSplitOptions.RemoveEmptyEntries)[1];
                byte[] buffer = new byte[0];
                int b;
                do
                {
                    b = response.GetResponseStream().ReadByte();
                    if (b != -1)
                    {
                        Array.Resize(ref buffer, buffer.Length + 1);
                        buffer[buffer.Length - 1] = (byte)b;
                    }
                } while (b != -1);
                return Encoding.GetEncoding(encoding).GetString(buffer);
            }
        }
0
1 / 1 / 1
Регистрация: 11.06.2015
Сообщений: 37
25.10.2017, 12:48
igor_m, но этот код же никак не отличается от того, который вы использовали в начале, где у вас как раз и возникала проблема. Или я чего-то не понимаю?
0
1 / 1 / 0
Регистрация: 14.12.2014
Сообщений: 123
25.10.2017, 12:54  [ТС]
не совсем понимаю, о чем вы. между запросами я делал паузу примерно 4-5 секунд и все получалось
0
1 / 1 / 1
Регистрация: 11.06.2015
Сообщений: 37
25.10.2017, 14:19
igor_m, ааа поняла. А можете показать код, пожалуйста?

Добавлено через 1 час 7 минут
igor_m,
вот на этой строке
Цитата Сообщение от igor_m Посмотреть сообщение
string encoding = response.Headers["Content-Type"].ToString().Split(new string[] { "charset=" }, StringSplitOptions.RemoveEmptyEntries)[1];
выдает ошибку: Индекс находился вне границ массива
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.10.2017, 14:19

Защита гостевой от роботов
Нужен скрипт, выводящий стандартную картинку против роботов для защиты гостевой. Подскажите бесплатный, или уж веб-сервис...

Сообщество роботов. Сколько роботов будет через N лет
Надо решить эту задачу: Сообщество роботов живет по следующим законам: - один раз в начале года они объединяются в группы по 3 или 5...

Парсер с кинопоиска
Всем привет... Столкнулся с проблемой... не могу взять данный с кинопоиска.ру - выскакивает приглашение ввести капу... Не знаю как...

Обход капчи кинопоиска
Здравствуйте. Есть парсер, который получает продолжительность фильма со страницы на кинопоиске. Раньше все было нормально, но теперь, после...

Парсер фильмов с кинопоиска
Здраствуйте, начал давно писать программу для парсера фильмов с кинопоиска, сейчас появилось время и желание, хочу поместить программу на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru