Почему Splash не отображает эту веб-страницу?

#web-scraping #scrapy #screen-scraping #scrapy-splash #splash-js-render

#очистка веб-страницы #scrapy #очистка экрана #scrapy-splash #splash-js-render

Вопрос:

Я совсем новичок в Splash, и хотя мне удалось настроить Splash на моем Ubuntu 18 (через Splash / Docker), это дает мне разные результаты для этой страницы:https://www.overstock.com/Home-Garden/Area-Rugs/31446/subcat.html

Обычно это отображается следующим образом: введите описание изображения здесь

Но когда я пытаюсь отобразить ее в режиме Splash, она отображается следующим образом: введите описание изображения здесь

Я попытался изменить пользовательский агент в Splash на этот:

 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36
  

Следовательно, это делает сценарий заставки таким:

 function main(splash, args)
  splash:set_user_agent(
  'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36'
  )
  assert(splash:go(args.url))
  assert(splash:wait(0.5))
  return {
    html = splash:html(),
    png = splash:png(),
    har = splash:har(),
  }
end
  

Тем не менее, несмотря на эти дополнения, по-прежнему не удается отобразить страницу.

Как я могу заставить Splash отображать эту страницу?

Комментарии:

1. docker splash довольно устарел, если вам нужно быстрое решение, используйте scrapy-selenium. если вы хотите использовать splash, вам нужно установить его вручную и изменить

2. @wishmaster, ты имеешь в виду установку scrapy-selenium в тот же docker, что и Splash?

3. нет необходимости в splash вообще, если вы используете selenium (scrapy-selenium)

Ответ №1:

Похоже, для этого overstock.com требуются заголовки a Connection и Accept . Добавьте это в свой запрос, и он должен работать как ожидалось. Проверено на Postman, с Connection: keep-alive amp; amp; Accept: */* заголовками и без них; Я получаю одну и ту же страницу с ошибкой:

введите описание изображения здесь

После добавления двух заголовков выше:

введите описание изображения здесь

Поэтому ваш запрос должен быть соответствующим образом отредактирован:

 function main(splash, args)
  splash:set_custom_headers({
     ["Connection"] = "keep-alive",
     ["Accept"] = "*/*",
  })
  assert(splash:go(args.url))
  assert(splash:wait(0.5))
  return {
    html = splash:html(),
    png = splash:png(),
    har = splash:har(),
  }
end
  

Комментарии:

1. После использования этого по-прежнему получен тот же результат.

2. @rom я все еще предполагаю, что у вас отсутствует заголовок запроса. Попробуйте поработать с платформой разработки API, такой как Postman, чтобы воспроизвести проблему, с которой вы сталкиваетесь, за пределами Splash и поиграть с заголовками.