В сегодняшнюю эпоху информационного взрыва в Интернете получение данных становится все более важным, а веб-сканеры стали распространенным инструментом сбора данных. Однако по мере того, как крупные веб-сайты совершенствуют свои технологии защиты от сканирования, программы-сканеры сталкиваются со все большим количеством проблем. В этой статье на примере сканирования результатов поиска Baidu будет показано, как использовать Selenium в сочетании с рядом стратегий для преодоления антисканирующего механизма целевого веб-сайта.
Будучи одной из крупнейших поисковых систем Китая, Baidu имеет огромную базу пользователей и массивные поисковые данные. Чтобы защитить конфиденциальность пользователей и безопасность данных, Baidu внедрила ряд механизмов защиты от сканирования, включая, помимо прочего:
Для этих механизмов защиты от сканирования нам необходимо принять соответствующие стратегии, чтобы избежать идентификации и предотвращения перехвата.
При использовании Selenium для автоматизации веб-страниц мы можем установить поле User-Agent в заголовке запроса для имитации различных типов поведения браузера. Это может снизить вероятность быть идентифицированным как сканер.
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import random
# Случайным образом выберите User-Agent
user_agents = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36",
# ПодробнееUser-Agent...
]
options = Options()
options.add_argument(f"user-agent={random.choice(user_agents)}")
driver = webdriver.Chrome(options=options)
Используя прокси-IP, мы можем избежать частого запроса результатов поиска с одного и того же IP-адреса и снизить риск блокировки.
from selenium import webdriver
from selenium.webdriver.common.proxy import Proxy, ProxyType
proxyHost = "xxxx"
proxyPort = "5445"
proxyUser = "1xxxxxx"
proxyPass = "280651"
proxy = Proxy()
proxy.proxy_type = ProxyType.MANUAL
proxy.http_proxy = f"{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}" # IP-адрес и порт прокси-сервера
proxy.ssl_proxy = f"{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}"
capabilities = webdriver.DesiredCapabilities.CHROME
proxy.add_to_capabilities(capabilities)
driver = webdriver.Chrome(desired_capabilities=capabilities)
Имитируйте поведение человека при поиске и избегайте идентификации в качестве сканера, рандомизируя интервал запроса.
import time
# Подождите случайный период времени
time.sleep(random.uniform(1, 3))
Если мы встретим проверочный код, мы можем решить его, введя проверочный код вручную или воспользовавшись сторонней службой распознавания проверочного кода.
# Подождите, пока пользователь вручную введет код подтверждения.
captcha = input("Пожалуйста, введите проверочный код:")
# Введите проверочный код в соответствующее поле ввода.
driver.find_element_by_id("captcha-input").send_keys(captcha)
Ниже приведен простой пример, демонстрирующий, как использовать Selenium для преодоления антисканирующего механизма поиска Baidu и получения результатов поиска:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
driver = webdriver.Chrome()
# Открыть страницу поиска Baidu
driver.get("https://www.baidu.com")
# Найдите поле ввода поиска и введите ключевые слова.
search_box = driver.find_element_by_id("kw")
search_box.send_keys("Рептилия Python")
# Имитировать нажатие клавиши Enter на клавиатуре
search_box.send_keys(Keys.RETURN)
# Подождите, пока загрузятся результаты поиска
time.sleep(3)
# Распечатать результаты поиска
results = driver.find_elements_by_css_selector(".t")
for result in results:
print(result.text)
# Закрыть браузер
driver.quit()