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

Поделиться
HTML-код
  • Опубликовано: 28 окт 2024

Комментарии • 41

  • @user-hn5km9bo2e
    @user-hn5km9bo2e  4 года назад +3

    Cookies на данном сайте значения не имеют, но для понимания процесса добавил их в ролик. В некоторых ;) случаях это важно

  • @ВасилийТёркин-ю3ц
    @ВасилийТёркин-ю3ц 2 года назад +1

    Парень!! Где ты взял взялся!!!! Ты спас мне жизнь!!! Спасибо, дружище!!!

  • @Diser2023
    @Diser2023 2 года назад +3

    Здорово с классами вышло. Студия сама сгенерировала. В ручную всегда писал, что очень муторно.

    • @user-hn5km9bo2e
      @user-hn5km9bo2e  2 года назад

      Я тоже поначалу руками писал, угу, муторно

  • @PlayGames2-h1e
    @PlayGames2-h1e 6 месяцев назад

    другой вопрос в отдельный коммент. А можете пояснить назначение handlera? Т.е. почему нельзя/не стоит сразу httpclient использовать?

    • @user-hn5km9bo2e
      @user-hn5km9bo2e  6 месяцев назад

      Можно и без него. Но если нужны куки, то не обойтись. И тонкие настройки тоже в нём.

    • @PlayGames2-h1e
      @PlayGames2-h1e 6 месяцев назад

      @@user-hn5km9bo2e а есть у Вас видео подробнее об использовании, настройках кукисов?

  • @PlayGames2-h1e
    @PlayGames2-h1e 6 месяцев назад

    и еще ) для чего Вы заполняете header?

    • @user-hn5km9bo2e
      @user-hn5km9bo2e  6 месяцев назад

      некоторые сайты к этому чувствительны. Можно не получить данные из-за какой-то мелочи. Ведь это не реальный браузер спрашивает, а программа...

  • @HillBuilding
    @HillBuilding Год назад

    5:14 выращивание марихуаны :D

  • @PlayGames2-h1e
    @PlayGames2-h1e 6 месяцев назад

    пошаговая инструкция максимальными прыжками называется )) Что необходимо в самом проекте добавить, в смысле нугеты?..

    • @user-hn5km9bo2e
      @user-hn5km9bo2e  6 месяцев назад

      Так собственно саму библиотеку. Название в шапке

  • @ВячеславИгнатченко

    Добрый день.
    Установил фиддлер. Запускаю всё как на видео. У вас в нём полный экран строчек, у меня 10 -15 строк. И того что Вы ищете нет и в помине.
    Кроме Tunnel to ничего нет. Вроде фильтры никакие не стоят.
    Посмотрел несколько видео по фиддлеру, но так ничего и не понял, куда всё делось. Подскажите, пожалуйста.

  • @RuVl_13
    @RuVl_13 3 года назад +1

    Привет, а как проходить регистрацию с помощью HttpClient? Ну т.е. в первый раз можно отправить post запрос и использовать статичный HttpClient, но можно ли как-то получить куки, которые получили после post запроса и сохранить их в json, а потом использовать при новом запуске программы именно cookie

    • @RuVl_13
      @RuVl_13 3 года назад +1

      Я правда уже разобрался.
      Решение:
      Создаём экземпляр класса CookieContainer и HttpClientHandler.
      В первый с помощью функции setcookie вставляем строку в формате: "key1=value1, key2=value2".
      Во второй задаём первый экземпляр в качестве поля CookieContainer.
      После всего этого создаём экземпляр класса HttpClient и в конструктор передаём параметром наш экземпляр класса HttpClientHandler

    • @RuVl_13
      @RuVl_13 3 года назад +1

      Если же мы хотим получить куки, например после входа на сайт, то нам нужно проделать те же действия, но не задавать куки (т.е. экземпляр класса CookieContainer создавать но не взаимодействовать с ним), а после успешной регистрации в нашем экземпляре CookieContainer уже будут необходимые куки, которые можно получить методом GetCookie.
      Примечание: куки будут возвращены в формате key1=value1; key2=value2
      Поэтому прежде чем их сохранять для повторного использования при перезапуске программы надо применить к строке метод Replace(';', ',')

    • @user-hn5km9bo2e
      @user-hn5km9bo2e  3 года назад

      Можно сделать так
      ruclips.net/video/RvzC2lmJ3Bo/видео.html

  • @ВячеславИгнатченко

    Добрый день.
    При повторении урока столкнулся с тем, что :
    using (var resp = clnt.GetAsync(url).Result)
    Возвращает сообщение:
    "Произошла одна или несколько ошибок."
    Я проверил в отладчике структуру clnt, вроде она совпадает, за исключением того, что Upgrade-Insecure-Requests в структуре нет , есть только Upgrade, но может быть так и нужно?
    Что ещё можно проверить, чтобы заставить метод работать?

    • @user-hn5km9bo2e
      @user-hn5km9bo2e  2 года назад

      Поставить try-catch и посмотреть что в ошибках
      try { ... } catch(Exception ex){ тут перывание с помощью F9}

    • @ВячеславИгнатченко
      @ВячеславИгнатченко 2 года назад

      @@user-hn5km9bo2e Помогло следующее:
      ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
      добавленное перед вызовом GetAsync.

    • @user-hn5km9bo2e
      @user-hn5km9bo2e  2 года назад

      @@ВячеславИгнатченко да, это можно ставить при старте программы - нужно для некоторых сайтов и операционок. Помотрел в Git - там это уже есть в этом проекте. Позже добавил для другого ролика.
      github.com/sergshu/LearnTogether/blob/master/BankiRuJsonParsing/Program.cs

  • @ВячеславИгнатченко

    Доброй ночи.
    Нет ли у Вас ролика или ссылки, как объединить данные для класса.
    Сайт, который я пытаюсь обработать, во втором запросе, разбит на страницы.
    Поэтому его приходится обрабатывать в цикле несколько раз. Это не проблема. Данные получаю.
    Но как потом их объединить в одном result (или где-то ещё). Я честно искал в инете но так ничего стоящего не нашёл. Или нужно писать методы ("напишите методы и будет вам счастье") или примеры объединения простых линейных классов. Скорее всего, я просто не знаю, что искать.
    Сейчас , для тестирования, я просто вызываю GetData столько раз сколько нужно, но количество страниц указано во втором запросе. В дальнейшем надо получить его оттуда.
    Да и просто как-то не красиво так делать :).

    • @user-hn5km9bo2e
      @user-hn5km9bo2e  2 года назад

      Если правильно понял, Вам нужен список List
      Создаёте такой список и в него добавляете как по одному, так и пачками

  • @justorex
    @justorex Год назад

    А если Content-Type JavaScript а не JSON?

    • @user-hn5km9bo2e
      @user-hn5km9bo2e  Год назад

      Мы продаём или мы покупаем? :)

  • @ВячеславИгнатченко

    Ещё маленький момент:
    До инсталляции библиотеки JSON ( 13.13)
    using (HttpClient clnt = new HttpClient(hdl))
    Сразу после инсталяции (13.30):
    using (HttpClient clnt = new HttpClient(hdl,false))
    Без этого false, первый объект, насколько я понимаю, удаляется и к нему нет доступа при обращении по второй ссылке.
    А так , большое спасибо. Всё получилось.

    • @user-hn5km9bo2e
      @user-hn5km9bo2e  2 года назад

      точно подмечено. Наверное на монтаже попустил

  • @alangonzalez2869
    @alangonzalez2869 2 года назад

    Автору спасибо за интересный способ реализации. Немного не понравился стиль, иногда автор не объясняет внятно причины по которым он меняет способы, реализации, например в начале пишет код так, а потом озвучивает " а нет, давай так" и в такие моменты не понятен ход его мыслей. В жизни использую для парсинга Python, очень удобно на слабом тонком клиенте, который тихо (абсолютно без вентиляторов) пылится где-то рядом с роутером в кладовке запускать скрипты удалённо по SSH и парсить на диск который к нему подключен через карман по USB. Но вот написать парсер для друзей и передать им по почте, увы такая схема менее удобна чем скомпилированный файл написанный на С#, хоть мне уже далеко за 45, тем не менее я упорно изучаю этот новый для себя язык, просто мне это нравится, это точно никогда не станет тем что мне принесёт денег, но это точно, то чему буду ещё много лет посвящать свободное время. Это я отвлёкся, а теперь по сути. У данного парсера есть проблема, он не работает с старыми русскоязычными форумами, которые отдают страницу в кодировке "ср1251", я нашёл несколько решений в сети, в частности использовать вместо метода "ReadAsStringAsync" метод "readAsBinaryString" с последующей преобразованием кодировки, но вот эту кодировку ещё нужно правильно определить (сайт как защита может отдавать в разной кодировке), поэтому очень интересно мнение автора как он реализует такое в этом коде, для примера можно взять популярный rutracker (точечка) org, не реклама, либо любой другой который тоже родом из 2000х. Также интересно чуть подробнее о "System.Net.ServicePointManager.SecurityProtocol", о котором автор вскользь упомянул в ответе под видео.

    • @alangonzalez2869
      @alangonzalez2869 2 года назад

      Дабы уточнить . Первый запрос, ответ сайта "Content-Type: text/html; charset=Windows-1251", второй запрос через 1 секунду, ответ сайта "content-type: text/html; charset=cp1251"

    • @user-hn5km9bo2e
      @user-hn5km9bo2e  2 года назад

      Поддерживаю ваше желание разобраться во всём до конца, только лучше не делать этого сейчас и сразу :)
      Обычно большой объём куда хуже усваивается, лучше принять по-первой "как есть" и впоследствии при необходимости можно разобраться - зачем думать сегодня как устроен велосипед, если тебе нет нужды его завтра производить.

    • @user-hn5km9bo2e
      @user-hn5km9bo2e  2 года назад

      @@alangonzalez2869 по поводу кодировки - обычно парсер делается под конкретный сайт и кодировка обычно определяется на этапе программирования. Вообще-то был автоопределитель кодировок, но с ходу не скажу.

    • @alangonzalez2869
      @alangonzalez2869 Год назад

      @@user-hn5km9bo2e Это как раз и есть защита от парсинга, когда каждый последующий запрос с одного ip адреса отдаётся в кодировке "cp1251", которую эта конкретно библиотека не определяет.

    • @sergeyshushert
      @sergeyshushert Год назад

      @@alangonzalez2869 скорее всего это просто другой сервер отдаёт. Можно сделать сопоставление кодировок типа "cp1251= "Windows-1251"