Splash не подключается к прокси ни одним из 3 способов описанных в документации

Браузер-заставка ничего не отправляет через http-прокси. Страницы загружаются, даже если прокси не работает.

Я использую scrapy с заставкой в ​​​​python 3 для извлечения страниц после аутентификации для веб-сайта Angular.js. Сценарий может извлекать страницы, выполнять аутентификацию и извлекать страницы после аутентификации. Однако он не использует настройку прокси-сервера на локальном хосте: 8090, и wireshark подтверждает, что трафик, поступающий с порта 8050, идет на какой-то порт в диапазоне 50k.

Настройка такова: всплеск работает локально на образе докера (последний) на порту 8050 — Python 3 работает локально на Mac — Zap-прокси работает локально на Mac через порт 8090 — доступ к веб-странице осуществляется через VPN

Я попытался указать прокси-хост: порт через сервер, используя Chrome со сценарием LUA. Страница загружается без прокси.

Я попытался указать прокси в скрипте Python как с Lua, так и с API (args={'proxy':'host:port'}, и страница загружается без использования прокси.

Я попытался использовать файл прокси-хоста и получил статус 502.

  1. Прокси установлен через Lua в Chrome (без ошибок, не проксировано):
function main(splash, args)
  splash:on_request(function(request)
    request:set_proxy{
      host = "127.0.0.1",
      port = 8090,
      username = "",
      password = "",
      type = "HTTP"
    }
  end
  )
  assert(splash:go(args.url))
  assert(splash:wait(0.5))

  return {
    html = splash:html(),
    png = splash:png(),
    har = splash:har(),
  }
end

req = SplashRequest("http://mysite/home", self.log_in,
                     endpoint='execute', args={'lua_source': script})
  1. Прокси, установленные через апи (статус 502):
req = SplashRequest("http://mysite/home",
                            self.log_in, args={'proxy': 'http://127.0.0.1:8090'})
  1. Прокси установлен через Lua в Python (без ошибок, не проксировано):
def start_requests(self):
        script = """
            function main(splash, args)

                assert(splash:go(args.url))
                assert(splash:wait(0.5))
                splash:on_request(function(request)
                    request:set_proxy{
                        host = "127.0.0.1",
                        port = 8090,
                        username = "",
                        password = "",
                        type = "HTTP"
                    }
                end
                )

                return {
                    html = splash:html(),
                    png = splash:png(),
                    har = splash:har(),
             }
            end
            """
        req = SplashRequest("http://mysite/home", self.log_in,
                            endpoint='execute', args={'lua_source': script})
        # req.meta['proxy'] = 'http://127.0.0.1:8090'
        yield req
  1. Прокси устанавливается через файл прокси в образе докера (статус 502): файл прокси:
[proxy]

; required
host=127.0.0.1
port=8090

Команда оболочки:

docker run -it -p 8050:8050 -v ~/Documents/proxy-profile:/etc/splash/proxy-profiles scrapinghub/splash --proxy-profiles-path=/etc/splash/proxy-profiles

Все вышеперечисленное должно отображать страницу в zap proxy на порту 8090.

Некоторые из вышеперечисленных, кажется, устанавливают прокси, но прокси не может связаться с localhost: 8090 (статус 502). Некоторые вообще не работают (без ошибок, без проксирования). Я думаю, это может быть связано с тем, что используется образ докера.

Я не собираюсь использовать Selenium, потому что это то, что он заменяет.


person neoinageo    schedule 31.07.2019    source источник
comment
Кто-нибудь работал со Splash в докере и прокси?   -  person neoinageo    schedule 01.08.2019


Ответы (2)


Все методы, возвращающие статус 502, работают корректно. Причина этой проблемы в том, что образы докеров не могут получить доступ к локальному хосту на хосте. Чтобы решить эту проблему, используйте http://docker.for.mac.localhost:8090 в качестве прокси-хоста: порт на хосте Mac и используйте docker run -it --network host scrapinghub/splash для Linux с локальным хостом: порт. Для Linux параметр -p недействителен, поскольку все службы в контейнере будут находиться на локальном хосте.

Способ 2 лучше всего подходит для одного прокси без правил. Метод 4 лучше всего подходит для нескольких прокси с правилами.

Я не пробовал другие методы, чтобы посмотреть, что они вернут с этими изменениями и почему.

person neoinageo    schedule 01.08.2019

Хорошо, я уже некоторое время борюсь с той же проблемой, но нашел решение для вашего первого метода на GitHub, который основан на том, что Состояние документации Docker:

Хост имеет изменяющийся IP-адрес (или его нет, если у вас нет доступа к сети). Начиная с 18.03 мы рекомендуем подключаться к специальному DNS-имени host.docker.internal, которое разрешается во внутренний IP-адрес, используемый хостом. Шлюз также доступен как gateway.docker.internal.

Это означает, что вы должны/могли бы использовать «host.docker.internal» в качестве хоста вместо своего прокси-сервера.

splash:on_request(function (request)
     request:set_proxy{
         host = "host.docker.internal",
         port = 8090
     }
end)

Вот ссылка на объяснение: https://github.com/scrapy-plugins/scrapy-splash/issues/99#issuecomment-386158523

person Vasco    schedule 30.05.2020