0

Кто имел дело с Selenium и/или с AngleSharp подскажите, как искать элементы правильно?

IWebElement element = driver.FindElement(By.ClassName("class1")

Данная строка находит элемент. Но вот как заставить его же искать элементы внутри найденного. Чтоб не приходилось по новой запускать поиск по всему документу. Есть ли способ сделать это через selenium?

Думал можно сделать так:

element.FindElement(By.ClassName("class2")

Но видимо это не так работает, так как выдает null.

С другой стороны может лучше просто сохранить html-код найденного элемента, а там уже обработать его через AngleSharp. Но вот как вытянуть "внутренности" найденного элемента? Кто уже сталкивал с этим - поделитесь опытом.

  • 3
    Подумайте на досуге, нужен ли вам вообще селениум, ведь в большинстве случаев ответ на данный вопрос будет "НЕТ", ибо хватит простых запросов (а зачастую и вовсе не нужен HTML...). Касательно вопроса - element.FindElement(By.ClassName("class2") - должно работать, выведите весь HTML этого элемента и посмотрите что там, есть ли вообще то, что вы хотите взять? И да, напомню не смотрите HTML через браузер!, ибо то, что вы получаете программно, может кардинально отличаться от того, что там! – EvgeniyZ Oct 05 '21 at 18:49
  • 1
    Я уже обдумывал и к сожалению да, нужен. Ибо те данные, что нужны подгружаются через ajax скрипты. Мне нужен сухой текст, а сформированная страница после загрузки и выполнения всех входящих в нее скриптов. И никаких json-файлов не перехватить. Единственное о чем я думал, так это о взаимодействии с nodejs. Но как через него прогнать html-страницу и обработать каждый скрипт в ней - я еще не придумал. Действительно, все работает. Из-за обновления сайта поменялись классы и я этого сразу не заметил. Вроде б все хорошо. – eugenelly Oct 05 '21 at 19:35
  • Но у меня чисто из интереса остаются вопросы. Может вы подскажите как реализовать или где внятно написано, как обработать страницу через nodejs. А так же, в случае необходимости возможно ли через selenium сохранить весь (со входящими блоками) найденный блок? Чтоб после обработать его через AngleSharp. И еще, каким образом можно скрыть графическую оболочку selenium? Пробовал прописывать options (--silent-launch, no-sandbox, headless). Но в процессе работы выбрасывается исключение. Возможно некоторые инструкции, наподобие "кликнуть по блоку" или "перемотать до него" все ж требуют граф. оболочку. – eugenelly Oct 05 '21 at 19:47
  • подгружаются через ajax скрипты - JS тоже нужно брать от куда-то данные (с сервера), вот этот запрос и ищите, я уверен на 90%, что он там есть. Хотите конкретику, давайте сайт и что надо достать, будем искать вместе. Сейчас мы с вами по разные стороны баррикад, где я по своему опыту говорю, что вам скорей всего вовсе не нужен JS, Selenium и прочее, а вы утверждаете обратное. – EvgeniyZ Oct 05 '21 at 20:02
  • Ну хорошо. Вот этот сайт: https://www.flashscore.ru/ Цель: собрать все ссылки лиг из выпадающих пунктов каждой страны. (я пытаюсь достать их из бокового меню) – eugenelly Oct 05 '21 at 20:11
  • 2
    Странно вы пытались найти. Вот все ваши данные, в виде обычного текста (немного закодированного). Сам запрос в виде простого GET на определенный (вроде динамический) адрес. Собственно, остается вам понять какие данные он требует, от куда берется этот адрес и брать нужное напрямую. Помните, JS не знает про данные, он их сначала должен получить от куда либо, вот первым делом ищите от куда все эти данные, а потом думайте как лучше их достать. – EvgeniyZ Oct 05 '21 at 21:28
  • Не совсем понял зачем мне данные с какой-то конкретной лиги, если мне нужен полный список самих лиг. А именно когда нажимаешь на Австралию (слева в меню) выпадет список лиг (Лига А, НПЛ АСТб,...). Вот ссылки на них мне-то и нужны. Только не на одну Австралию, а на все страны. И чтоб программа каждый час перезагружала страницу и искала новые лиги, которых не было час назад. – eugenelly Oct 06 '21 at 12:29
  • Ну чтож вы так, я вам показал пример, показал что данные на сайте получаются в виде простых запросов. Вместо того, чтоб упрекать меня в том, что дам не то, что вы хотели, попробовали бы найти самостоятельно.... Ок, вот вам данные, опять же, посмотрите что требуется для этого запроса и как сайт их декодирует, все... – EvgeniyZ Oct 06 '21 at 13:35
  • Да не, упрека то не было. Просто я подумал, что вы не поняли то, что я хочу сделать. Я конечно изучал js, но не так, чтоб настолько глубоко понимать, откуда сайты подгружают данные. Вы возможно используете встроенные инструменты браузера, чтоб так легко находить нужные данные, чего я пока не умею. – eugenelly Oct 06 '21 at 14:14
  • По-началу я подумал, что все данные есть уже при загрузке, ток закодированы. И мне как раз не хотелось заниматься декодингом, тем более если разработчики сайта решат переписать логику этих данных или сделать их динамическими (постоянно изменяющимися). – eugenelly Oct 06 '21 at 14:16
  • Вы возможно используете встроенные инструменты браузера - да, зачастую достаточно нажать F12, советую почитать один из моих давних ответов. И мне как раз не хотелось заниматься декодингом - а там по сути и нечего декодировать, просто неведомые символы, которые можно заменить на нормальные и будет нужный вид. Ну и адрес, нужный вам в итоге будет сайт/спорт/Значение_ML/Значение_MU. – EvgeniyZ Oct 06 '21 at 14:37
  • https://www.flashscore.ru/x/req/m_1_24 https://www.flashscore.ru/x/req/m_1_25 https://www.flashscore.ru/x/req/m_1_26 https://www.flashscore.ru/x/req/m_1_17 https://www.flashscore.ru/x/req/m_1_18 https://www.flashscore.ru/x/req/m_1_128 ... Все эти ссылки не по порядку, что уже как-то ненадежно и нельзя предугадать на каком числе все остановится. Так и было ли мне проще потом парсить и формировать ссылки на каждую из лиг? Ведь мне не нужны названия лиг, а мне нужны ссылки ведущие на сами лиги. – eugenelly Oct 06 '21 at 14:37
  • m_1_26 - 26 - это id страны (или нечто такое), он должен быть статичен, что пугает вас тут я не пойму) мне проще потом парсить - я вас не заставляю, я лишь говорю, что вам не нужно тащит в свой проект целый браузер, который будет кушать в разы больше ресурсов, чем само ваше приложение. Я говорю, чо есть альтернатива, правильная альтернатива, которая подразумивает под собой простой GET запрос на указанный адрес, который выдаст сразу вам ужные данные, без HTML, Selenium и прочего. А нужно вам это, ну, решать вам. – EvgeniyZ Oct 06 '21 at 14:57
  • Просто есть некоторое беспокойство о том, что если некоторые индексы будут пропущены или вовсе отсутствовать, а может добавляться. То как мне это как ни в ручную отлавливать? Как я на данный момент понимаю, можно запустить цикл, который будет считать от 0 или от 1 и прерываться как только страница вернет 404, я не знаю. Я ж не буду ж просматривать вручную какой индекс последний, верно ж? Так-то ваше решение мне нравится больше, по скорости выполнения. Но вот не будут ли этих пропусков, которые не дадут взять весь список стран... – eugenelly Oct 06 '21 at 19:04
  • В общем, я попробую так как вы советуете. Может это решение не будет преследовать трудностей, которые возникают у меня в голове. О результате сообщу. Спасибо за наводку. – eugenelly Oct 06 '21 at 19:08
  • если некоторые индексы будут пропущены или вовсе отсутствовать - вспомните то, что я сказал вам раньше Помните, JS не знает про данные, он их сначала должен получить от куда либо, то есть все нужные вам ID тоже где-то хранятся и получаются неким образом, найдите данные, а не занимайтесь подбором. Как, я вам уже все вроде дал и показал. Ищите запрос, который сайт посылает, или может в самом HTML хранится (получите его через простой C# и посмотрите что там до всех скриптов). – EvgeniyZ Oct 06 '21 at 20:13
  • Получается мне нужно проанализировать весь html, пробежаться по каждой строке верстки и каждому скрипту, чтоб найти по каким точно адресам отправлять запросы? Конечно я знаю немного js, но не уверен, что на достаточном уровне. Или есть другой способ? В принципе, я получил начальную страницу и конечно попытаюсь понять её, чем сейчас займусь. Но может есть более правильный и удобный способ. Или только так? – eugenelly Oct 10 '21 at 14:13
  • Слушайте, ну я вам ведь уже все сказал, показал где и как брать данные, показал как их распарсить не трогая даже HTML сайта. А вы просто пропустили это мимо ушей и дальше берете селениум и парсите сгенерированный HTML сайта, вместо того, чтоб наконец пойти и посмотреть какие запросы куда и как уходят... Ну вот и что мне, повторно все объяснять или что? Ок... Представьте что вы хотите купить большое кол-во молока, вы идете в магазин, вам там говорят "нету, ждите поставок" и ценник в 3 раза дороже. Вы идете напрямую к поставщику и берете у него, по нормальной цене и сразу. – EvgeniyZ Oct 10 '21 at 14:30
  • Вот сайт - это магазин, простой клиент, который реализует данные поставщика (сервера). Используя селениум и разбирая HTML сайта, вы делаете Клиент > Клиент > Сервер, то есть ваш клиент, обращается к клиенту (сайт), который в свою очередь обращается к серверу за данными. Я вам говорю "Научитесь отлавливать запросы", чтоб вы делали Клиент > Сервер, то есть чтоб ваше приложение было заменой сайта, напрямую общаясь с сервером. Как вы выше уже заметили, у сайта есть адреса, куда можно отправить запрос и он простым текстовиком отдаст данные - это API, вот найдите API со всеми странами... – EvgeniyZ Oct 10 '21 at 14:33
  • К чему я пример с магазином и завышенной ценой привел? А к тому, что ваш селениум, это огромный комбайн, который предназначен для QA (тестирования), но не парсинга! Он требует кучу ресурсов компа, места, памяти и др. Также вы очень сильно теряете в производительности, ибо вы ждете пока проинициализируется селениум, потом ждете пока прогрузится сайт, получит все данные, а уже потом вы эти данные забираете. То есть, как и с магазином, вы в 3 раза дороже "платите" за нужные вам данные. Если у вас конечно там все работает, ну чтож, делайте как знаете, парсите HTML, выбор ваш) – EvgeniyZ Oct 10 '21 at 14:37
  • Не, о селениуме уже речи не идет. Я уже полностью убрал его из своего кода. Я просто сейчас пытаюсь понять, каким образом перехватывать те запросы, чтоб найти весь этот список. Вот жму F12, захожу во вкладку Network, жму F5, смотрю какие данные приходят, но вот как их понимать? Куча каких-то символов, цифр, букв. В некоторых и вовсе написано, что "failed to load response data...". Проблема уже в том, как найти те самые данные. То ли через Network, то ли смотреть сам код и понимать в каком – eugenelly Oct 10 '21 at 15:01
  • как их понимать? - ну у вас там 90% это картинки, 10% это JS (помним, что JS зачастую не содержит данных), остальное это запросы к серверу. Вот сортируем по типу и видим это, где document, fetch - некие данные, крутим ниже, там еще xht часть из которых простые .js, не хранящие данные), а часть простые адреса с тоже некими данными. Еще есть некий запрос, который по таймингу занимает все время нахождения на сайте, это WebSocket - некий канал общения с сервером. – EvgeniyZ Oct 10 '21 at 15:27
  • Так хорошо, с этим понятно. Как я понимаю WebSocket мне не нужен, так как по нему передаются какие-то зашифрованные данные, правильно я понимаю? Js тоже отметаем, так как хранение данных зачастую хранятся в других типах. И остаются только fetch/hxr, в них то и нужно что-то искать? Вот есть ответ https://d.flashscore.ru/x/feed/f_1_0_3_ru_1 , но при переходе по этой ссылке выпадает ошибка 401 Unauthorized. Как я понимаю где-то от меня происходит отправка на один адрес, а именно с этого приходит ответ? Но опять же эти данные мне нужны или все же другие? – eugenelly Oct 10 '21 at 16:13
  • Вижу какие-то ссылки, но все ли они тут? И как это вообще парсить? Через Regex отлавливать 4 слеша и то что между ними? Видимо я не разбираюсь в запросах на таком уровне, так что прошу меня простить за возможные глупости. Видимо поэтому я и выбирал Selenium так как он был более для меня очевиден. Но я и не спорил, что это вариант далеко не идеален. Я привык к простым get запросам и простым ответам по типу json. Но вот когда приходят ответы других типов, еще и в каком-то странном шифре - вот в этом я теряюсь. – eugenelly Oct 10 '21 at 16:19
  • зашифрованные данные - я там такого не вижу, ведь "квадраты", это не шифр, а проблема с кодировкой, то есть браузер берет не ту кодировку, что требуется для соккета. 401 Unauthorized - это означает то, что адрес требует дополнительные заголовки/cookie для доступа. эти данные мне нужны или все же другие? - это уже вам виднее. Я предположу, что вам нужны Id стран, вот найдите от куда их берет сайт. Regex - а он тут при чем? Я привык к простым get запросам - а тут чем они отличаются? Теж запросы, данные не в JSON, да, но без шифров и прочего, простой набор параметров (показывал выше).. – EvgeniyZ Oct 10 '21 at 16:31
  • Ну вот какие ответы мне приходят: WS, XTR. Может из-за кодировки мне и непонятно. – eugenelly Oct 10 '21 at 17:01
  • Прошу вас, почитайте внимательно мои комментарии, я вам даже код предоставлял, в котором разбирал что это за "кодировки"... – EvgeniyZ Oct 10 '21 at 17:36
  • Прошу прощения. Я случайно пропустил ту ссылку, где вы приводите код под расшифровку. Теперь все встало на свои места. Как вы смогли это увидеть? Для меня данный ответ казался беспорядочным набором символов и текста (какие-то MN, MU,...). Вот что значит опыт - умеете читать между строк. В общем, спасибо огромное. – eugenelly Oct 10 '21 at 18:59

0 Answers0