Столкнулся с кейсом, что если запрашиваемый url находится за cloudflare и имеет редирект после проверки, то А-парсер не переходит по нему, хотя Follow common redirects включено. Это можно увидеть запросив урл https://a-star.ru/ (именно без www) с не российского ip. Более подробное описание проблемы я давал в ТГ в общении с саппортом. Это касается Engine HTTP (Fast, JavaScript Disabled) В случае Engine Chrome (Slow, JavaScript Enabled) обход cloudflare не работает, вообще, в логе вижу: GET(1): https://www.a-star.ru/ - 597 Chrome request error: Timeout by timer И уходит в цикл. Очень прошу поправить это, а то, вроде, как можно парсить сайты успешно причем, но получается, что не во всех вариантах.
Вот как выглядит лог и результат. То есть A-parser видит 301 редирект, но несмотря на Follow common redirects его все равно не делает возвращая виде результата.
По-умолчанию в Net::HTTP используется HTTP/1.1. Указанный сайт при использовании этого протокола уходит в бесконечный редирект, это можно увидеть на скриншоте: Но, если использовать HTTP/2, то сайт отрабатывает корректно:
Да, я знаю, что при HTTP/2 все корректно, но я делаю с помощью а-парсера универсальный инструмент, хочу чтобы он не задумываясь брал по любому протоколу. Если я принудительно поставлю HTTP/2, то не смогу взять урл http://businesspravo.ru/Docum/DocumShow_DocumID_6521.html будет: "reason":"HTTP/2 Read Headers: Protocol error","data":"","code":597 Почему бы вам не сделать, что в случае такой ошибки понижать протокол и повторять запрос. Да, я могу это сам сделать, но мне это на порядок ресурсозатратнее, так как я хочу отправлять далеко не один урл, а целую пачку, выбирать из них те, что не прошли и повторять новым пакетом. Да, могу, но вдруг вам это сделать проще? Очень хотелось бы просто отправить и получить по api.
Главный вопрос, вы сможете это сделать (повтор с понижением протокола при ошибке) в относительно ближайшее время или мне самому корячется с репитом?
Спасибо! Будет очень хорошо, если вы это сделаете на своем уровне, у вас же повторы есть, добавить условие, что если http2 и код 597 и число репитов больше 1, отключаем http2 и пробуем через http1.1. Мне просто это гораздо сложнее сделать. Только ответьте, пожалуйста, до конца недели, ждать или делать самому? У меня дедлайн.
В Net::HTTP добавлена опция Try use HTTP/1.1 for Protocol error (по-умолчанию включена). Данная опция указывает парсеру повторить запрос с HTTP/1.1 если был включен HTTP/2 и получена ошибка протокола.