Вопрос или проблема
Я работаю над настройкой веб-скрапинга, где у меня есть socks5 прокси, работающий на устройстве в моей домашней сети, доступный удаленному VPS через обратное ssh туннелирование, как в этом вопросе https://stackoverflow.com/questions/842021/ssh-d-port-usernameserver-com-but-in-reverse. VPS — это от крупного провайдера серверов, у которого все IP-адреса заблокированы сайтом, который я скраплю, из-за другой активности веб-скрапинга, поэтому мне необходимо проксировать через мой домашний IP-адрес.
Когда я выполняю curl на сайт с моего домашнего устройства, либо через прокси, либо без него, запрос успешен. Когда я делаю это с удаленного сервера, либо через прокси, либо без него, запрос неудачен (я получаю сообщение “заблокировано”).
Сначала я думал, что туннель может не работать, но, когда я выполняю curl https://wtfismyip.com/
с удаленного сервера через прокси, он отображает IP-адрес моего домашнего устройства. Затем я подумал, что сайт, возможно, обнаруживает заголовок X-Forwarded-For, но выполнение curl https://myhttpheader.com/
через прокси также отображает мой домашний IP в X-Forwarded-For. Сайт, кажется, не проверяет прокси в целом, так как выполнение curl на домашнем устройстве через прокси работает нормально.
У кого-нибудь есть идеи, что здесь может происходить? Есть ли что-то, что я могу попробовать, чтобы сконструировать запрос, который также блокируется на моем домашнем устройстве, чтобы я мог получить воспроизводимую причину блокировки?
Шаги для воспроизведения:
На домашнем устройстве в отдельных окнах, чтобы поддерживать оба подключения:
ssh -R 24680:localhost:12345 {user}@{server-ip}
ssh -D 12345 localhost
Выполнение curl на домашнем устройстве с прокси:
$ curl --socks5-hostname localhost:12345 https://annapolis.craigslist.org/search/edgewater-md/apa?lat=38.9427&lon=-76.5386&search_distance=16#search=1~galler
y~0~0
[1] 10869
[2] 10870
$ <!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta property="og:site_name" content="craigslist">
<meta name="twitter:card" content="preview">
<meta property="og:title" content="Apartments / Housing For Rent near Edgewater, MD - craigslist">
<etc full size HTML...>
Выполнение curl на удаленном сервере с прокси:
# curl --socks5-hostname localhost:24680 https://annapolis.craigslist.org/search/edgewater-md/apa?lat=38.9427&lon=-76.5386&search_distance=16#search=1~gallery~0~0
[1] 2824239
[2] 2824240
# <!DOCTYPE html><html><head><title>blocked</title></head><body>Your request has been blocked.<br><br>If you have questions, please <a href="https://www.craigslist.org/contact?step=form&reqType=help_blocks&blockID={BLOCK_ID}">contact us</a></body></html>.
Ответ или решение
Причины блокировки curl
на сайте, даже через обратный SSH-туннель из домашней сети, могут быть достаточно разнообразными и включают как технические аспекты сетевых настроек, так и специфические алгоритмы защиты, применяемые самим сайтом.
Теория (Theory):
В основе проблемы лежит цикл взаимодействия между клиентом и сервером, и механизмы, которые могут оказывать влияние на это взаимодействие. Первая гипотеза заключается в том, что, хотя ваш проксированный запрос идет через домашний IP, сайт может использовать более сложные алгоритмы для обнаружения нежелательной активности, такие как анализ скорости и частоты запросов, проверка на известные User-Agent строки, различные типы JavaScript-чеков или использование файтинга (fingerprinting) для идентификации используемого устройства. Возможен также гео-фильтринг, который блокирует доступ с некоторых географических регионов или в определенное время.
Пример (Example):
Вы упомянули, что когда вы отправляете запрос с домашнего устройства, включая использование прокси, проблем не возникает, в то время как прокси-запрос с удаленного сервера блокируется, несмотря на то, что прокси демонстрирует ваш домашний IP. Это позволяет предположить, что сайт каким-то образом распознает, что запрос исходит не напрямую от обычного пользователя. Важно учесть, что сайты, старающиеся предотвратить web scraping, могут использовать многоуровневую стратегию защиты, включая проверку на автоматизацию (например, по поведению браузера) или другие типы поведенческого анализа, чтобы выявить шаблоны автоматизированных запросов.
Применение (Application):
-
Проверка заголовков HTTP: Убедитесь, что ваши запросы через curl полностью соответствуют тем, которые отправляет браузер. Некоторые сайты блокируют запросы, которые не имитируют реальный браузер. Проверьте заголовки вроде
User-Agent
,Accept-Language
,Accept-Encoding
, и другие, которые могут расшифровать ваш запрос как автоматизированный. -
Исключение JavaScript-проверок: Некоторые сайты полагаются на выполнение JavaScript для проверки, является ли клиент полноценным браузером. Попробуйте использовать инструменты, которые могут исполнять JavaScript, например, Puppeteer или Selenium с интеграцией SOCKS5-прокси.
-
Проверка на файтинг и капчи: Хотя ваш IP может быть "чистым", сайт может использовать другие способы идентификации, такие как файтинг на основе сетевых параметров TCP или cookies, которые сдаются через реальный браузер, и эта информация отсутствует в стандартном curl.
-
Изменение геолокации: Проверьте, нет ли специфических ограничений доступа со стороны сайта для вашего региона. Попробуйте изменить свою локализацию, например, через VPN на домашнем устройстве, а затем снова через удаленный сервер.
-
Обращение внимания на частоту запросов: Хотя ваши текущие тесты на локальном устройстве могут быть успешны, попытка эмулировать реальное пользовательское поведение с изменением частоты и распределения запросов может помочь устранить подозрения сайта относительно автоматизации.
-
Ведение логов и анализ: Ведите логи всех запросов и ответов, чтобы провести надежный анализ и последовательно выполнив изменения в сценариях запросов, чтобы определить, когда начинают появляться блокировки.
-
Dicumentation and Feedback: Изучите документацию и, если возможно, свяжитесь с командой поддержки сайта для получения более детальной информации о блокировках. Используйте чистый и ясный язык при обращении, избегая упоминания, что вы занимаетесь web scraping’ом, сосредотачиваясь на общении как заинтересованный пользователь.
Посредством применения вышеуказанных мер можно значительно повысить вероятность успешного преодоления ограничений на доступ к контенту сайта через автоматизированные запросы. Важно помнить, что уважение к политике использования API и сайтам может предотвратить дальнейшие проблемы с доступом и взаимодействием.