C # скрести правильный веб-контент после jquery - PullRequest
0 голосов
/ 24 октября 2018

Я уже некоторое время использую HtmlAgilityPack, но веб-ресурс, с которым я сейчас работаю, имеет (кажется, что) протокол jQuery, через который проходит браузер.То, что я ожидаю загрузить, - это страница продукта, но то, что фактически загружается (проверено с помощью элемента управления WebBrowser и WebClient DownloadString), представляет собой перенаправление, в котором посетителю предлагается выбрать консультанта и зарегистрироваться у него.

В другихслова, используя инструмент проверки >> элементов Chrome, я получаю:

<div data-v-1a7a6550="" class="product-extra-images">
  <img data-v-1a7a6550="" src="https://vw-xerophane.storage.googleapis.com:443/thumbnails/products/10174_1MainImage-White-9-14_1.jpg.100x100_q85_crop_upscale.jpg" width="50">
  <img data-v-1a7a6550="" src="https://vw-xerophane.storage.googleapis.com:443/thumbnails/products/10174_2Image2-White-9-14_1.jpg.100x100_q85_crop_upscale.jpg" width="50">

Но WebBrowser и HTMLAgilityPack получают только:

<div class="container content">
  <div class="alert alert-danger " role="alert">
    <button type="button" class="close" data-dismiss="alert">
      <span aria-hidden="true">&times;</span>
    </button>
    <h2 style="text-align: center; background: none; padding-bottom: 0;">It looks like you haven't selected a Consultant yet!</h2>
    <p style="text-align: center;"><span>...were you just wanting to browse or were you looking to shop and pick a Consultant to shop under?</span></p>
      <div class="text-center">
        <form action="/just-browsing/" method="POST" class="form-inline">
   ...

После поиска в определениях классовВ голове я обнаружил, что страница использует jQuery для правильной загрузки и обработки действий (прокрутка, изменение размера, наведение курсора на изображения, выбор других изображений и т. д.), когда посетитель просматривает страницу.Вот из главы jQuery:

/*!
* jQuery JavaScript Library v2.1.4
* http://jquery.com/
*
* Includes Sizzle.js
* http://sizzlejs.com/
*
* Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors
* Released under the MIT license
* http://jquery.org/license
*
* Date: 2015-04-28T16:01Z
*/

Я попробовал ScrapySharp, как описано здесь: C # .NET: Очистка динамических (JS) сайтов

Но это только что закончилосьпотребляет всю доступную память и никогда ничего не производит.

Также это: htmlagilitypack и проблема с динамическим содержимым Загружен неправильный редирект, как отмечено выше.

Я могу предоставить большеисточник, из которого я пытаюсь извлечь, включая полный JQuery, если необходимо.

1 Ответ

0 голосов
/ 24 октября 2018

Используйте CaptureRedirect = false; для обхода страницы перенаправления.Это сработало для меня на странице, которую вы упомянули:

var web = new HtmlWeb();
web.CaptureRedirect = false;
web.BrowserTimeout = TimeSpan.FromSeconds(15);

Теперь продолжайте попытки, пока не увидите текст "Описание продукта" на странице.

var doc = web.LoadFromBrowser(url, html =>
{
    return html.Contains("Product Description");
});

ПоследниеВерсии HtmlAgilityPack могут запускать браузер в фоновом режиме.Поэтому нам не нужна другая библиотека, например ScrapySharp, для очистки динамического содержимого.

...