Самая большая разница между динамическими веб-страницами и статическими веб-страницами заключается в том, когда данные получаются.Динамические веб-страницы получают данные динамически, когда это необходимо, через JavaScript после того, как браузер получил HTML. Следовательно, программа-краулер также должна учитывать вопрос динамического получения данных, чтобы правильно находить нужные данные. «Slider Captcha» — это распространенный тип механизма проверки кода, и он также является сложным противником для предотвращения программ-краулеров. В этой статье будут использоваться три инструмента Python, opencv и Selenium, чтобы продемонстрировать, как дизассемблировать и имитировать код скользящей проверки.
Общие типы и принципы кодов веб-проверки
Вы видели эти механизмы аутентификации при просмотре веб-страниц? Профессиональный термин для кода проверки веб-страницы называется «CAPTCHA» (полное название — «Полностью автоматизированный публичный тест Тьюринга для определения компьютеров и людей отдельно»), который в настоящее время является распространенным механизмом проверки на веб-страницах. Используется для определения злонамеренного вмешательства пользователя и атак. . В настоящее время распространенными методами CAPTCHA являются следующие:
- Письменный код подтверждения / SMS-код подтверждения
- Капча
- код подтверждения проблемы
- код подтверждения поведения
Программа reCAPTCHA в настоящее время представляет собой механизм проверки, в первую очередь разработанный Google.Первоначально инициировано CMU. reCAPTCHA помогает людям оцифровывать документы, предлагая людям ответы в различных контекстах. Этот проект будет отображать неузнаваемый текст в вопросе после сканирования бумаги, чтобы люди также могли использовать его при ответе на вопрос.
Идея использования Python для обработки «скользящего кода»
В «графическом проверочном коде» есть общая деформация, называемая «скользящим проверочным кодом». Скользящий код проверки будет динамически обновлять изображение и отсутствующие блоки и требует, чтобы пользователь переместил отсутствующие блоки в определенную позицию на изображении, чтобы вынести решение, как показано на рисунке:
Для разработчиков сканеров скользящий код подтверждения действительно является довольно большим порогом. Для того, чтобы сканер мог считывать код подтверждения и имитировать его поведение, требуется определенная степень знакомства с работой веб-страницы. Далее давайте испытаем решение скользящего кода на примере реализации, мы можем разделить его на два больших блока:
- ① Используйте Python + opencv для дизассемблирования отсутствующей позиции блока.
- ② Используйте Python + Selenium для имитации скольжения.
① Используйте Python + opencv для дизассемблирования отсутствующей позиции блока.
Сначала вручную загрузите «фоновое изображение» на локальный компьютер, а затем попробуйте использовать метод распознавания изображений, чтобы попытаться найти местоположение.
(1) Используйте cv2, чтобы прочитать изображение в программе
OpenCV (Библиотека компьютерного зрения с открытым исходным кодом) — это пакет обработки для компьютерного зрения, который можно установить/загрузить с помощью opencv-python и cv2 в Python. На первом этапе мы сначала используем cv2.imread(...) для чтения изображения в программу и используем cv2.cvtColor для преобразования цвета (исходное изображение содержит ошибки):
from matplotlib import pyplot as plt
import cv2
path = '~/Downloads/filename.png'
image = cv2.imread(path)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # Converting BGR to RGB
plt.imshow(image)
plt.show()
(2) Определить краевой контур объекта на картинке
Canny – это метод, используемый для обнаружения краев (обнаружение краев) при распознавании образов. Подробную информацию о параметрах можно найти в [официальном документе](docs.OpenCV.org/2.4/модули…?highlight=хитрый#хитрый). Метод Канни может преобразовать исходное изображение в оттенки серого и вывести черно-белое изображение, содержащее диапазон краев:
canny = cv2.Canny(image, 300, 300)
plt.imshow(canny)
plt.show()
Из результата видно, что помимо блока есть еще много мелких разбросанных частей блока:
(3) Выньте положение, в котором находится недостающий блок.
Затем используйте cv2.findContours(), чтобы найти все обнаруженные блоки на изображении, и нарисуйте часть, отмеченную синим цветом. По длине (w) и ширине (h) можно судить, какой блок является реальным блоком на картинке, но если цвет картинки слишком близок, это усложнит оценку.
contours, hierarchy = cv2.findContours(canny, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)
dx, dy = 0, 0
for i, contour in enumerate(contours):
x, y, w, h = cv2.boundingRect(contour)
if (w > 50) and (h > 50):
dx = x
dy = y
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)
plt.imshow(image)
plt.show(
Наконец, вы можете получить местоположение недостающего блока с помощью двух переменных dx и dy:
dx, dy # (202, 15)
В этом примере мы можем узнать смещение отсутствующего блока от крайнего левого расстояния в 202 пикселя.
② Используйте Python + Selenium для имитации скольжения.
Во втором абзаце мы будем использовать инструмент тестирования браузера Selenium, который поможет нам «симулировать поведение пользователя, перемещающего блок». О динамической симуляции веб-страниц в Selenium я уже писал ранее.Вот этотПоделитесь текстом.
(1) Откройте браузер, чтобы перейти на веб-страницу и загрузить исходное изображение.
Сначала изучите структуру веб-страницы и обнаружите, что данный образец веб-сайта использует Canvas для динамической загрузки изображений для достижения эффекта скользящего кода подтверждения:
Затем используйте Selenium, чтобы открыть браузер для перехода на веб-страницу, и используйте JavaScript для преобразования Canvas в изображение перед загрузкой.
from selenium import webdriver
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.action_chains import ActionChains
browser = webdriver.Chrome('./chromedriver')
js_download_code = '''
var link = document.createElement('a');
link.download = 'filename.png';
link.href = document.getElementById('captcha').getElementsByTagName("canvas")[0].toDataURL()
link.click();
'''
browser.execute_script(js_download_code)
Таким образом, исходное изображение может быть загружено, а с помощью «① Используйте Python + opencv для дизассемблирования позиции отсутствующего блока» вы можете узнать смещение, которое необходимо переместить.
найти элемент кнопки
Наблюдая за структурой веб-страницы, можно четко обнаружить, что блок, который необходимо переместить, представляет собой элемент div, расположенный в class = jigsaw__slider--ihcNg (о конкретных методах см.Вот этотстатья):
Легко выбрать с помощью Selenium:
btn = browser.find_element_by_class_name("jigsaw__slider--ihcNg")
(2) Имитировать поведение пользователей, перетаскивающих блоки
На последнем шаге вы можете использовать местоположение только что найденного отсутствующего блока и инструмент, смоделированный браузером, чтобы переместить блок в указанное положение смещения:
move = ActionChains(browser)
move.click_and_hold(btn)
move.move_by_offset(dx, 0)
move.perform()
Настоящий бой! Пусть поисковые роботы Python также понимают «код подтверждения слайда».
В этом примере помимо сканера, реализующего скользящий проверочный код, в качестве цели также используется простой скользящий проверочный код. Окончательный результат, вероятно, такой, весь процесс от «Открытие веб-страницы» → «Загрузка изображений» → «Место анализа» → «Имитация скольжения»:
Сканирование веб-страниц — это метод сбора данных, но перед лицом изменений в веб-технологиях программы-сканеры также имеют разные стратегии преодоления. Если вы все еще сталкиваетесь с какими-либо проблемами в реализации сканера, оставьте сообщение, чтобы поделиться своими наблюдениями и решениями ???
Reference
- ВИКИ: проверочный код
- Каковы категории кодов подтверждения Captcha? каков эффект?
- Взлом Slider Captcha с помощью Python + Selenium
Привет, меня зовут Вэйюань, и я продолжаю публиковать статьи о #datascience, #webdevelopment или #softwarecareer на разных платформах. Если у вас есть какие-либо вопросы по содержанию, вы можете общаться с нами дальше, вы можете подписаться на меня.Facebook Follower: День Data Scientist на работе, также будет время от времени проводить мероприятия по обмену информацией, давайте повеселимся вместе ヽ(●´∀`●)ノ
В эпоху больших данных сбор данных и поиск программ уже являются базовыми цифровыми навыками! В настоящее время планируется [Супер новичок также может использовать поисковый робот Python для создания веб-сайта сравнения цен.] онлайн-курсы, чтобы собрать огромное количество информации одним щелчком мыши и помочь вам создать веб-сайт для сравнения цен. От сбора данных, сортировки данных до окончательного подчиненного отображения, преобразования массивных данных в визуальные диаграммы и объединения с реализацией веб-сайта для создания реальных целевых приложений ???
? Заполните анкету, чтобы получить бесплатные курсы:pse.is/3fyr4n
? Заполните анкету, чтобы получить бесплатные курсы:pse.is/3fyr4n
? Заполните анкету, чтобы получить бесплатные курсы:pse.is/3fyr4n