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

Поділитися
Вставка
  • Опубліковано 20 сер 2020
  • Пошаговое руководство по созданию программы c# для парсинга данных из JSON в Visual Studio 2019 с использованием HttpClientHandler/HttpClient и библиотеки Newtonsoft.Json.
    VK - public199628606
    FaceBook - / 358572395391013
    Ссылка на Git github.com/sergshu/LearnTogether

КОМЕНТАРІ • 41

  • @user-hn5km9bo2e
    @user-hn5km9bo2e  3 роки тому +3

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

  • @Diser2023
    @Diser2023 2 роки тому +3

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

    • @user-hn5km9bo2e
      @user-hn5km9bo2e  2 роки тому

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

  • @user-bd2lt6bc2o
    @user-bd2lt6bc2o Рік тому +1

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

  • @HillBuilding
    @HillBuilding Рік тому

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

  • @user-qj4jv4mf2o
    @user-qj4jv4mf2o 2 роки тому

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

    • @user-hn5km9bo2e
      @user-hn5km9bo2e  2 роки тому

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

  • @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 роки тому

      Можно сделать так
      ua-cam.com/video/RvzC2lmJ3Bo/v-deo.html

  • @user-qj4jv4mf2o
    @user-qj4jv4mf2o 2 роки тому

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

    • @user-qj4jv4mf2o
      @user-qj4jv4mf2o 2 роки тому

      Вопрос снимается... Оно заработало... Само...

    • @user-hn5km9bo2e
      @user-hn5km9bo2e  2 роки тому

      @@user-qj4jv4mf2o бывает. Удачи!

  • @user-qj4jv4mf2o
    @user-qj4jv4mf2o 2 роки тому

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

    • @user-hn5km9bo2e
      @user-hn5km9bo2e  2 роки тому

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

  • @user-qj4jv4mf2o
    @user-qj4jv4mf2o 2 роки тому

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

    • @user-hn5km9bo2e
      @user-hn5km9bo2e  2 роки тому

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

    • @user-qj4jv4mf2o
      @user-qj4jv4mf2o 2 роки тому

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

    • @user-hn5km9bo2e
      @user-hn5km9bo2e  2 роки тому

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

  • @user-zz8oz8ku8c
    @user-zz8oz8ku8c 3 місяці тому

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

    • @user-hn5km9bo2e
      @user-hn5km9bo2e  3 місяці тому

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

  • @user-zz8oz8ku8c
    @user-zz8oz8ku8c 3 місяці тому

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

    • @user-hn5km9bo2e
      @user-hn5km9bo2e  3 місяці тому

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

    • @user-zz8oz8ku8c
      @user-zz8oz8ku8c 2 місяці тому

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

  • @user-zz8oz8ku8c
    @user-zz8oz8ku8c 3 місяці тому

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

    • @user-hn5km9bo2e
      @user-hn5km9bo2e  3 місяці тому

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

  • @alangonzalez2869
    @alangonzalez2869 Рік тому

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

    • @alangonzalez2869
      @alangonzalez2869 Рік тому

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

    • @user-hn5km9bo2e
      @user-hn5km9bo2e  Рік тому

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

    • @user-hn5km9bo2e
      @user-hn5km9bo2e  Рік тому

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

    • @alangonzalez2869
      @alangonzalez2869 Рік тому

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

    • @sergeyshushert
      @sergeyshushert Рік тому

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

  • @justorex
    @justorex Рік тому

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

    • @user-hn5km9bo2e
      @user-hn5km9bo2e  Рік тому

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