открытие
С популярностью Python и больших данных появилось большое количество инженеров, и технология краулеров стала объектом всеобщего внимания благодаря простоте обучения и замечательному эффекту.Разработка краулеров вступила в пиковый период, поэтому давление на сервер становится в разы больше. Чтобы обеспечить нормальную работу сервисов или снизить нагрузку и затраты, предприятиям приходится использовать различные технические средства, чтобы не дать инженерам-краулерам без ограничений запрашивать ресурсы с серверов. Мы называем это поведение «анти-краулеры».
«Технология защиты от поисковых роботов» — это общий термин для технологий в Интернет-технологиях, предназначенных для ограничения поисковых роботов, а обход поисковых роботов — это проблема, с которой приходится сталкиваться всем инженерам поисковых роботов, а также наиболее волнующий аспект в опросе среднего звена. и старшие гусеничные инженеры.
проблема заключается в
Однако в обычном общении автор обнаружил, что большинство младших инженеров-краулеров будут плевать только на технические статьи, написанные другими в Интернете, кроме того, зная, что они подделывают User-Agent в информации заголовка запроса браузера при запросе, для:
- почему ты хочешь сделать это?
- Какая польза от этого?
- Могу ли я сделать это по-другому?
- Как это работает?
- Как он распознает мой поисковый робот?
- Каким образом я должен обойти это?
Ничего не знаю. Если вы не знаете принципа и способа реализации, то когда целевой сайт немного подкорректирует стратегию антисканирования, вы все равно будете в замешательстве.
Да просто в недоумении.
авторский голос
Я также пытаюсь поделиться этими знаниями, чтобы каждый мог изучить относительно простые антирептильные принципы и методы реализации антирептильных знаний через эту статью в свободное время, а затем ознакомиться с его обходными операциями. Например, антикраулинг User-Agent означает, поймите его принцип и самостоятельно внедрите антикраулинг, а потом уже самостоятельно его обходите. Возможно, благодаря этому маленькому футляру вы сможете открыть дверь своему мышлению и взломать канализацию своего мышления.
текст
Вверху разговоры, внизу практика. Великий человек однажды выразил это значение:
Неважно, черный ты кот или белый кот, кот, который не может ловить мышей, не является хорошим котом.
Что такое User-Agent
Пользовательский агент называется пользовательским агентом на китайском языке или сокращенно UA.Это специальный строковый заголовок, который позволяет серверу идентифицировать операционную систему и версию, тип процессора, браузер и версию, механизм рендеринга браузера, язык браузера и браузер, используемый клиент, плагины и т.д. Некоторые веб-сайты часто отправляют разные страницы в разные операционные системы и разные браузеры, оценивая UA, поэтому некоторые страницы могут не отображаться нормально в определенном браузере, но обнаружение можно обойти, замаскировав UA. Блок-схему браузера, инициирующего запрос к серверу, можно представить следующим рисунком:
Взяв в качестве примера Firefox и Google Chrome, формат или представление UA выглядит следующим образом:
Пользовательский агент для Firefox:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:63.0) Gecko/20100101 Firefox/63.0
Пользовательский агент Chrome:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36
Какую роль User-Agent играет в сетевых запросах?
Роль браузера, как показано в поле выше, затем роль User-Agent заключается в указании личности.В сетевом запросе User-Agent — это идентификатор, указывающий на личность.Сервер может использовать User-Agent в параметре заголовка запроса, чтобы определить, является ли запросчик браузером, клиентской программой или другим терминалом (конечно, User-Agent's An допускается также пустое значение, так как это необязательный параметр).
Почему антикраулер выбирает параметр User-Agent?
Из приведенного выше введения видно, что это личность терминала. Это означает, что сервер может четко знать, был ли на этот раз запрос инициирован через браузер Firefox, или через браузер IE, или даже был ли он инициирован приложением (например, Python).
Представление контента, такого как страницы, анимация и изображения веб-сайта, реализуется функцией рендеринга браузера.Браузер является относительно закрытой программой, поскольку он должен обеспечивать успешный рендеринг данных, поэтому пользователь не может получить большие масштабирование данных из браузера. , автоматическое получение данных о контенте.
Это не относится к поисковым роботам, которые созданы для того, чтобы брать содержимое в Интернете и преобразовывать его в данные. Это два совершенно разных способа.Вы также можете понять, что написание кода для получения данных о контенте в больших масштабах и автоматически, это своего рода хитрая операция.
Возвращаясь к теме, почему вы выбрали параметр User-Agent?
Поскольку языки программирования имеют идентификаторы по умолчанию, когда вы инициируете сетевой запрос, этот идентификатор отправляется на сервер в качестве значения User-Agent в параметре заголовка запроса без вашего ведома. Например, когда язык Python инициирует сетевой запрос через код, значение User-Agent содержит Python. Точно так же такие языки, как Java и PHP, имеют флаги по умолчанию.
Стратегия черных списков антисканеров
Теперь, когда вы знаете эту особенность языка программирования и сочетаете ее с реальными потребностями, возникает идея антикраулинга. Это стратегия черных списков. Пока запрос присутствует в черном списке, он считается поисковым роботом, и такие запросы могут быть проигнорированы или могут быть возвращены соответствующие сообщения об ошибках.
Зачем использовать стратегию черного списка вместо стратегии белого списка?
В реальной жизни существует множество типов браузеров (Firefox, Google Chrome, браузер 360, браузер Maxthon, браузер Oprah, браузер Window of the World, браузер QQ и т. д.),
Нецелесообразно собирать и перечислять все бренды, типы и соответствующие логотипы браузеров, и если какой-либо из них будет упущен, это потеря для веб-сайта.Кроме того, многие сервисы открыты не только для браузеров. Иногда эти сервисы предоставляют услуги приложениям в виде API-интерфейсов. Например, внутренний API-интерфейс программного обеспечения Android предоставляет услуги данных для программ Android, в то время как само программное обеспечение предоставляет только сервисы. к приложениям.Возьмите на себя задачи интерфейса и структуры, в то время как данные извлекаются из внутреннего API. В это время в инициированном запросе User-Agent станет Android.
Вышеизложенное является причиной, по которой стратегия белого списка не может быть использована.
Черный список прост: если вы хотите заблокировать запросы из кода Python или запросы из кода Java, вам нужно только добавить его в черный список.
Просмотр User-Agent в заголовке запроса через журнал службы Nginx
Nginx — это легкий веб-сервер/обратный прокси-сервер и прокси-сервер электронной почты (IMAP/POP3). Его характеристики заключаются в том, что он занимает меньше памяти и обладает сильными возможностями параллелизма.На самом деле возможности параллелизма Nginx действительно лучше среди веб-серверов того же типа.Предприятия, использующие Nginx, включают: Baidu, Jingdong, Sina, NetEase, Tencent, Taobao, и Т. Д.
Установка и запуск Nginx
Обычно Nginx можно установить с помощью инструментов установки самой системы (yum для Centos, apt-get для Debian и brew для MacOS).На примере системы linux введите в терминале:
sudo apt-get install nginx
Далее выберите в соответствии с подсказками завершить установку Nginx.
Затем введите команду в терминале:
sudo systemctl start nginx
Служба Nginx может быть запущена.
Примечания: Из-за различий в различных системах и версиях команды установки и запуска немного отличаются, и решение следует искать самостоятельно.
Логи Nginx
Nginx предоставляет пользователям функцию журнала, в которой записывается статус и другая информация о каждом запросе сервера, включая User-Agent. Путь хранения журнала по умолчанию для Nginx:
/var/log/nginx/
через команду в терминале
cd /var/log/nginx && ls
Вы можете войти в каталог хранения журналов и перечислить файлы в каталоге.Вы можете видеть, что есть два основных файла, которыеaccess.log
иerror.log
Они записывают информацию об успешном запросе и информацию об ошибке соответственно. Мы используем журнал доступа Nginx для просмотра информации о каждом запросе.
Несколько способов инициировать запрос
браузер
После запуска Nginx по умолчанию прослушивает порт 80, вам нужно только получить доступ к IP-адресу или доменному имени. Предположим, что IP-адрес127.0.0.1
, то вы можете ввести в браузере:
http://127.0.0.1
После нажатия Enter браузер инициирует запрос к серверу, как и при обычном серфинге в Интернете.
Код Python
Здесь мы используем библиотеку запросов для инициирования сетевых запросов. Создайте новый локально названныйgets.py
файл, где код:
import requests
# 向目标发起请求,并打印返回的 http 状态码
resp = requests.get("http://127.0.0.1")
print(resp.status_code)
Postman
Postman — это мощный инструмент для отладки веб-страниц и отправки HTTP-запросов на веб-страницы (Адрес загрузки почтальона), он может имитировать браузер, получать доступ к указанному URL-адресу и выводить возвращаемый контент. Фактическое использование показано на следующем рисунке:
Curl
Это инструмент передачи, который использует синтаксис URL для работы в командной строке.Он не только поддерживает доступ к URL-адресу, но также поддерживает загрузку и загрузку файлов, поэтому его можно назвать комплексным инструментом передачи. Он также может имитировать браузер и получать доступ к указанному URL-адресу. Фактическое использование показано на следующем рисунке:
Результаты логирования Nginx
Выше используются четыре метода для инициации запроса к серверу, поэтому давайте посмотрим, какая информация записывается в журнал Nginx. Через команду в терминале:
sudo cat access.log
для просмотра файла журнала. Вы можете увидеть записи запросов для этих времен:
# 请求记录
127.0.0.1 - - [04/Nov/2018:22:19:07 +0800] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
127.0.0.1 - - [04/Nov/2018:22:19:07 +0800] "GET /favicon.ico HTTP/1.1" 404 200 "http://127.0.0.1/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
127.0.0.1 - - [04/Nov/2018:22:20:36 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
127.0.0.1 - - [04/Nov/2018:22:27:14 +0800] "GET /z_stat.php?id=1256772952&web_id=1256772952 HTTP/1.1" 404 144 "http://appstore.deepin.org/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) deepin-appstore/4.0.9 Safari/538.1"
127.0.0.1 - - [04/Nov/2018:22:42:10 +0800] "GET / HTTP/1.1" 200 396 "-" "PostmanRuntime/7.3.0"
127.0.0.1 - - [04/Nov/2018:22:42:51 +0800] "GET / HTTP/1.1" 200 612 "-" "curl/7.60.0"
Будь то запросы Python, Curl или браузера и Postman, все они записываются в файл журнала, что указывает на то, что Nginx может определить тип терминала, инициировавшего запрос.
Внедрить антикраулеры
Предыдущая теория и логика были проверены в эксперименте, затем мы отфильтруем запросы, инициированные Python и Curl, с помощью стратегии черного списка, позволим проходить только запросам от Firefox и Postman и вернем 403 в сообщение об ошибке отфильтрованных запросов.
На рисунке выше показан процесс антикраулинга, который эквивалентен установке брандмауэра между сервером и ресурсами, а запросы в черный список будут отбрасываться как мусор.
Настроить правила Nginx
Nginx предоставляет конфигурационные файлы и соответствующие правила, которые позволяют нам отфильтровывать запросы, которые не могут пройти, это то, что мы используем для антикраулеров. Файлы конфигурации Nginx обычно размещаются в/etc/nginx/
каталог с именемnginx.conf
, давайте посмотрим на файл конфигурации, чтобы увидеть, где находится файл конфигурации сайта. Затем используйте редактор, поставляемый с системой (система, которую я использую, поставляется с Nano, а другие системы могут поставляться с Vim), чтобы отредактировать файл конфигурации. Найдите в конфигурационном файле адрес файла конфигурации сайта (используемый автором путь к хранилищу компьютера/etc/nginx/sites-enable
), затем перейдите в файл конфигурации сайта, чтобы найтиlocal
level и добавьте в него следующее:
if ($http_user_agent ~* (Python|Curl)) {
return 403;
}
Определение этой конфигурации состоит в том, чтобы определить, содержит ли строка заголовка запроса Python или Curl, и если да, то она напрямую вернет ошибку 403, в противном случае будет возвращен обычный ресурс. После завершения настройки сохраните ее, а затем передайте команду:
sudo nginx -s reload
Весь процесс работы показан на рисунке выше: пусть сервер Nginx перезагрузит файл конфигурации, чтобы предыдущая конфигурация вступила в силу.
Тест на антирептильный эффект
Повторите описанные выше шаги, чтобы инициировать запрос через браузер, код Python, инструмент Postman и Curl. Как видно из возвращенных результатов, он отличается от предыдущего.
- Браузер возвращает обычную страницу, указывая на то, что она не была затронута;
- Код состояния для кода Python теперь равен 403 вместо 200.
- Почтальон возвращает правильный контент, как и раньше;
- Curl, как и Python, не может правильно обращаться к ресурсам, потому что запросы, которые они инициируют, отфильтровываются.
намекать: Вы можете продолжать изменять конфигурацию Nginx для тестирования, и в конечном итоге вы обнаружите, что результат будет таким же, как сейчас: пока он находится в черном списке, запрос будет отфильтрован и будет возвращена ошибка 403.
Совет: Вот почему вам нужно подделывать браузер в заголовках запросов, когда вы обычно пишете код краулера.
Антикраулеры в обход User-Agent
Благодаря вышеизложенному исследованию мы узнали принцип метода защиты от сканирования User-Agent и реализуем защиту от сканирования через Nginx.Далее мы узнаем, как обойти эту меру защиты от сканирования.
Python обходит антикраулеры
В библиотеке запросов пользователям разрешено настраивать информацию заголовка запроса, поэтому мы можем изменить значение User-Agent на идентификатор заголовка запроса браузера в информации заголовка запроса, чтобы мы могли обмануть сервер Nginx и добиться целью обхода антикраулеров. Измените предыдущий код Python на:
import requests
# 伪造请求头信息 欺骗服务器
headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:9527.0) Gecko/20100101 Firefox/9527.0"}
resp = requests.get("http://127.0.0.1", headers=headers)
print(resp.status_code)
В коде мы используем информацию заголовка запроса браузера Firefox, и для лучшего наблюдения мы можем изменить номер версии браузера (на 9527), чтобы отличить реальный браузер (это не повлияет на результат запроса). Запустите этот файл и посмотрите, что вы получите:
200
Это уже не 403, а это значит, что этот тип антикраулера был обойден (понимаете, это то, что писали те статьи в интернете, вам нужно изменить информацию заголовка запроса, чтобы обойти антикраулер, теперь вы понимаете, что продолжается).
Упражнение: снова протестируйте с Postman
Тест может быть неточным, можно еще раз проверить через Postman, помните как?
- Добавьте идентификатор для фильтрации (Postman) в файл конфигурации Nginx.
- Перезагрузите файл конфигурации, чтобы он стал эффективным
- Сделайте запрос через Postman, чтобы увидеть, будет ли он отфильтрован
- Снова используйте инструмент Postman и сделайте запрос с идентификатором браузера, чтобы узнать, будет ли он отфильтрован.
Совет: Если вы сделаете это упражнение самостоятельно, вам будет легче понять, как оно работает, и вы углубите свои размышления.
Суммировать
Чтобы просмотреть, процесс всей статьи:
Мы начали с явления антисканирования, с которым столкнулись, затем изучили принцип стратегии антисканирования User-Agent и внедрили антисканирование через Nginx, наконец, мы проверили наши идеи на примерах кода Python и примерах Postman, и, наконец, дал ясно понять Чу и четко понять причину, а когда цель меняет свою стратегию, мы также можем четко знать, какие методы можно использовать для ее обхода.
Мысль: в этом примере я просто использую Python, чтобы написать сканер для демонстрации, так что насчет написанного на Java сканера? Как насчет сканеров, написанных на PHP? Как насчет запроса, инициированного стороной Android?
Вы можете тестировать по очереди, и результаты обязательно дадут вам небольшой выигрыш.
Если вы энтузиаст краулеров или младший инженер краулеров и хотите повысить свой уровень, мы можем общаться вместе, отсканируйте код, чтобы следовать!
Ответьте на «Отчет о борьбе с рептилиями» в общедоступной учетной записи WeChat, чтобы получить следующий отчет о результатах борьбы с рептилиями (PDF)
это заставит вас выглядеть более профессионально
Скриншоты из отчета:
Структура отчета следующая: