1

Пишу парсер мероприятий в Facebook. Дело в том, что загружаются только 10 мероприятий, остальные подгружаются по мере скроллинга страницы. Каким образом можно получить все мероприятия? Для парсинга использую HtmlAgilityPack, для кликов и cookies - SimpleBrowser

mtrfnv
  • 737
  • 2
    Каким образом можно получить все - работать с сервером, а не с интерфейсом... – EvgeniyZ Aug 31 '18 at 15:25
  • как сказано ранее, найти апи, либо искать в куче текста (а я думал на мной созданных страницах много лишнего), так вот найти вам надо, то что вызывает как раз обновление. – Monomax Aug 31 '18 at 15:35
  • @EvgeniyZ но ведь api фэйсбука не предназначено для парсинга – mtrfnv Aug 31 '18 at 15:41
  • 1
    @mtrfnv Смотрите... Сайты делятся на 2 типа. 1 - те, что имеют статичную информацию, которая загружается в момент загрузки страницы, это простой HTML текст, там да, приходится работать с ним напрямую. 2 - это сайты, которые используют динамичную подгруздку данных (то есть вы получаете пустой макет HTML и при помощи JS грузите с сервера в этот макет потом информацию (разово, по времени, либо по условию (конец страницы к примеру)). Так вот второй тип всегда работает по принципу клиент-сервер, то есть идет запрос к серверу, который в свою очередь отдает данные. – EvgeniyZ Aug 31 '18 at 15:48
  • 1
    Запрос сам может быть скрытый, чисто для работы сайта, но он всегда есть. Вам как раз и надо отловить этот запрос, посмотреть какие данные он отправляет и куда и эмулировать его. В ответ вы получите удобный JSON/XML или аналоги. А что касается "программный скроллинг" - со вторым типом сайтов, как по мне это попросту изврат и костыли.. – EvgeniyZ Aug 31 '18 at 15:49
  • @EvgeniyZ то есть надо искать в JS скрипты, срабатывающие при загрузке страницы и скроллинге? – mtrfnv Aug 31 '18 at 16:19
  • 1
    Можете этот ответ глянуть, я там расписывал подробно об этом. А так, откройте нужную вам страницу в браузере, далее F12 - Nerwork, крутите вниз и как только появится новое содержимое - ищите его в открытой панели разработчика, должен быть всего 1 запрос (ну и картинки всякие может быть) который вам и нужен. – EvgeniyZ Aug 31 '18 at 16:28
  • @EvgeniyZ после выполнения HttpResponseMessage result = await client.PostAsync(url, content); значение result.RequestMessage.RequestUri получается равным {https://www.facebook.com/unsupportedbrowser}. Такую проблему я уже встречал и решалась она присвоением полю UserAgent объекта класса HttpWebRequest значения типа "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36". Куда нужно подставлять это значение в вашем коде? – mtrfnv Aug 31 '18 at 18:42
  • @mtrfnv Ну если данный способ не сработал, то смотрите внимательней на оригинальный запрос, смотрите в чем именно отличие вашего запроса от того, что посылает браузер. Может куки, может какой то заголовок забыли, может агент у них свой. Я вам так не отвечу без данных к сожалению... – EvgeniyZ Aug 31 '18 at 18:53
  • @EvgeniyZ то есть, фактически, взяв кукисы из браузера и применив их в запросе из C#, запрос посылается так, будто я авторизован? – mtrfnv Aug 31 '18 at 19:25
  • @mtrfnv Ну авторизация у любого сайта, это куки, либо токен какой нибудь по ссылке. Так, что да, если требует авторизацию, то нужно отсылать и куки. – EvgeniyZ Aug 31 '18 at 19:31
  • @EvgeniyZ все-таки проблема была в User-Agent, поскольку Facebook, видимо, не поддерживает некоторые браузеры. Дописал client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"); и заработало. – mtrfnv Aug 31 '18 at 20:05
  • @EvgeniyZ а не подскажете такой момент: в Request Headers при каждом запросе в качестве одного из параметров передается новое значение. Можно ли как-то узнать происхождение этого значения? Примеры: https://ibb.co/cgY5QK https://ibb.co/mguC5K Конкретный параметр - cursor. Каждый раз новое значение, которое угадать невозможно. Однако, если собрать "историю" таких cursor'ов, и передавать их в C#, то результаты будут возвращаться более-менее адекватно – mtrfnv Sep 01 '18 at 01:23
  • @mtrfnv Скачайте Fiddler, запустите в нем отлов всех запросов, сделайте то, что вам нужно в браузере, скопируйте это значение cursor и в Fiddler через поиск (Ctrl+F) ищем все запросы, где это значение встречается. Вот в первом найденном запросе смотрим как это значение формируется (может при авторизации, может при заходе на страницу в html, может куки, а может и вовсе выдается при другом запросе к серверу...). – EvgeniyZ Sep 01 '18 at 06:05
  • @EvgeniyZ с Fiddler'ом не разобрался, но это же можно сделать и с помощью хрома. Разобрался, спасибо) – mtrfnv Sep 01 '18 at 15:35

0 Answers0