#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 и поиграть с заголовками.