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
Cookies на данном сайте значения не имеют, но для понимания процесса добавил их в ролик. В некоторых ;) случаях это важно
Спасибо.
@@user-gk5vv2vx8z Удачи!
Здорово с классами вышло. Студия сама сгенерировала. В ручную всегда писал, что очень муторно.
Я тоже поначалу руками писал, угу, муторно
Парень!! Где ты взял взялся!!!! Ты спас мне жизнь!!! Спасибо, дружище!!!
Всегда рад помочь
5:14 выращивание марихуаны :D
Ещё маленький момент:
До инсталляции библиотеки JSON ( 13.13)
using (HttpClient clnt = new HttpClient(hdl))
Сразу после инсталяции (13.30):
using (HttpClient clnt = new HttpClient(hdl,false))
Без этого false, первый объект, насколько я понимаю, удаляется и к нему нет доступа при обращении по второй ссылке.
А так , большое спасибо. Всё получилось.
точно подмечено. Наверное на монтаже попустил
Привет, а как проходить регистрацию с помощью HttpClient? Ну т.е. в первый раз можно отправить post запрос и использовать статичный HttpClient, но можно ли как-то получить куки, которые получили после post запроса и сохранить их в json, а потом использовать при новом запуске программы именно cookie
Я правда уже разобрался.
Решение:
Создаём экземпляр класса CookieContainer и HttpClientHandler.
В первый с помощью функции setcookie вставляем строку в формате: "key1=value1, key2=value2".
Во второй задаём первый экземпляр в качестве поля CookieContainer.
После всего этого создаём экземпляр класса HttpClient и в конструктор передаём параметром наш экземпляр класса HttpClientHandler
Если же мы хотим получить куки, например после входа на сайт, то нам нужно проделать те же действия, но не задавать куки (т.е. экземпляр класса CookieContainer создавать но не взаимодействовать с ним), а после успешной регистрации в нашем экземпляре CookieContainer уже будут необходимые куки, которые можно получить методом GetCookie.
Примечание: куки будут возвращены в формате key1=value1; key2=value2
Поэтому прежде чем их сохранять для повторного использования при перезапуске программы надо применить к строке метод Replace(';', ',')
Можно сделать так
ua-cam.com/video/RvzC2lmJ3Bo/v-deo.html
Добрый день.
Установил фиддлер. Запускаю всё как на видео. У вас в нём полный экран строчек, у меня 10 -15 строк. И того что Вы ищете нет и в помине.
Кроме Tunnel to ничего нет. Вроде фильтры никакие не стоят.
Посмотрел несколько видео по фиддлеру, но так ничего и не понял, куда всё делось. Подскажите, пожалуйста.
Вопрос снимается... Оно заработало... Само...
@@user-qj4jv4mf2o бывает. Удачи!
Доброй ночи.
Нет ли у Вас ролика или ссылки, как объединить данные для класса.
Сайт, который я пытаюсь обработать, во втором запросе, разбит на страницы.
Поэтому его приходится обрабатывать в цикле несколько раз. Это не проблема. Данные получаю.
Но как потом их объединить в одном result (или где-то ещё). Я честно искал в инете но так ничего стоящего не нашёл. Или нужно писать методы ("напишите методы и будет вам счастье") или примеры объединения простых линейных классов. Скорее всего, я просто не знаю, что искать.
Сейчас , для тестирования, я просто вызываю GetData столько раз сколько нужно, но количество страниц указано во втором запросе. В дальнейшем надо получить его оттуда.
Да и просто как-то не красиво так делать :).
Если правильно понял, Вам нужен список List
Создаёте такой список и в него добавляете как по одному, так и пачками
Добрый день.
При повторении урока столкнулся с тем, что :
using (var resp = clnt.GetAsync(url).Result)
Возвращает сообщение:
"Произошла одна или несколько ошибок."
Я проверил в отладчике структуру clnt, вроде она совпадает, за исключением того, что Upgrade-Insecure-Requests в структуре нет , есть только Upgrade, но может быть так и нужно?
Что ещё можно проверить, чтобы заставить метод работать?
Поставить try-catch и посмотреть что в ошибках
try { ... } catch(Exception ex){ тут перывание с помощью F9}
@@user-hn5km9bo2e Помогло следующее:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
добавленное перед вызовом GetAsync.
@@user-qj4jv4mf2o да, это можно ставить при старте программы - нужно для некоторых сайтов и операционок. Помотрел в Git - там это уже есть в этом проекте. Позже добавил для другого ролика.
github.com/sergshu/LearnTogether/blob/master/BankiRuJsonParsing/Program.cs
и еще ) для чего Вы заполняете header?
некоторые сайты к этому чувствительны. Можно не получить данные из-за какой-то мелочи. Ведь это не реальный браузер спрашивает, а программа...
другой вопрос в отдельный коммент. А можете пояснить назначение handlera? Т.е. почему нельзя/не стоит сразу httpclient использовать?
Можно и без него. Но если нужны куки, то не обойтись. И тонкие настройки тоже в нём.
@@user-hn5km9bo2e а есть у Вас видео подробнее об использовании, настройках кукисов?
пошаговая инструкция максимальными прыжками называется )) Что необходимо в самом проекте добавить, в смысле нугеты?..
Так собственно саму библиотеку. Название в шапке
Автору спасибо за интересный способ реализации. Немного не понравился стиль, иногда автор не объясняет внятно причины по которым он меняет способы, реализации, например в начале пишет код так, а потом озвучивает " а нет, давай так" и в такие моменты не понятен ход его мыслей. В жизни использую для парсинга Python, очень удобно на слабом тонком клиенте, который тихо (абсолютно без вентиляторов) пылится где-то рядом с роутером в кладовке запускать скрипты удалённо по SSH и парсить на диск который к нему подключен через карман по USB. Но вот написать парсер для друзей и передать им по почте, увы такая схема менее удобна чем скомпилированный файл написанный на С#, хоть мне уже далеко за 45, тем не менее я упорно изучаю этот новый для себя язык, просто мне это нравится, это точно никогда не станет тем что мне принесёт денег, но это точно, то чему буду ещё много лет посвящать свободное время. Это я отвлёкся, а теперь по сути. У данного парсера есть проблема, он не работает с старыми русскоязычными форумами, которые отдают страницу в кодировке "ср1251", я нашёл несколько решений в сети, в частности использовать вместо метода "ReadAsStringAsync" метод "readAsBinaryString" с последующей преобразованием кодировки, но вот эту кодировку ещё нужно правильно определить (сайт как защита может отдавать в разной кодировке), поэтому очень интересно мнение автора как он реализует такое в этом коде, для примера можно взять популярный rutracker (точечка) org, не реклама, либо любой другой который тоже родом из 2000х. Также интересно чуть подробнее о "System.Net.ServicePointManager.SecurityProtocol", о котором автор вскользь упомянул в ответе под видео.
Дабы уточнить . Первый запрос, ответ сайта "Content-Type: text/html; charset=Windows-1251", второй запрос через 1 секунду, ответ сайта "content-type: text/html; charset=cp1251"
Поддерживаю ваше желание разобраться во всём до конца, только лучше не делать этого сейчас и сразу :)
Обычно большой объём куда хуже усваивается, лучше принять по-первой "как есть" и впоследствии при необходимости можно разобраться - зачем думать сегодня как устроен велосипед, если тебе нет нужды его завтра производить.
@@alangonzalez2869 по поводу кодировки - обычно парсер делается под конкретный сайт и кодировка обычно определяется на этапе программирования. Вообще-то был автоопределитель кодировок, но с ходу не скажу.
@@user-hn5km9bo2e Это как раз и есть защита от парсинга, когда каждый последующий запрос с одного ip адреса отдаётся в кодировке "cp1251", которую эта конкретно библиотека не определяет.
@@alangonzalez2869 скорее всего это просто другой сервер отдаёт. Можно сделать сопоставление кодировок типа "cp1251= "Windows-1251"
А если Content-Type JavaScript а не JSON?
Мы продаём или мы покупаем? :)