Скребок в Python - предотвращение запрета IP
Я использую Python
для очистки страниц. До сих пор у меня не было сложных проблем.
Сайт, который я пытаюсь очистить, использует множество проверок безопасности и имеет механизм предотвращения скребков.
Используя Requests
и lxml
, я смог очистить около 100-150 страниц, прежде чем получить запрет по IP. Иногда я даже получаю запрет на первый запрос (новый IP, ранее не используемый, другой блок C). Я попытался с подделкой заголовков, рандомизировать время между запросами, все равно.
Я пробовал с Селеном, и я получил намного лучшие результаты. С Selenium я смог очистить около 600-650 страниц перед тем, как их запретили. Здесь я также попытался рандомизировать запросы (между 3-5 секундами и сделать вызов time.sleep(300)
на каждый 300-й запрос). Несмотря на это, я получаю запрет.
Отсюда я могу заключить, что на сайте есть механизм, в котором они запрещают IP, если он запрашивал больше, чем X страниц в одном открытом сеансе браузера или что-то в этом роде.
Основываясь на своем опыте, что еще я должен попробовать?
Будет ли закрытие и открытие браузера в Selenium help (например, после каждых 100-ти запросов закрыть и открыть браузер). Я думал о попытках с прокси-серверами, но есть миллион страниц, и это будет очень обширно.
Ответы
Ответ 1
Если вы переключитесь на Scrapy
структуру веб-скрепок, вы сможете повторно использовать ряд вещей, которые были сделаны для предотвращать и бороться с запретом:
Это расширение для автоматического регулирования скорости обхода на основе нагрузки как сервера Scrapy, так и веб-сайта, на котором выполняется сканирование.
Использовать случайный User-Agent, предоставляемый fake-useragent для каждого запроса
Ответ 2
Вы можете использовать прокси.
Вы можете купить несколько сотен IP-адресов для очень дешевых и использовать селен, как вы это делали ранее.
Кроме того, я предлагаю изменить браузер для вашего использования и других параметров пользовательского агента.
Вы можете выполнить итерацию с использованием одного IP-адреса для загрузки только x количества страниц и остановки до того, как вы будете заблокированы.
def load_proxy(PROXY_HOST,PROXY_PORT):
fp = webdriver.FirefoxProfile()
fp.set_preference("network.proxy.type", 1)
fp.set_preference("network.proxy.http",PROXY_HOST)
fp.set_preference("network.proxy.http_port",int(PROXY_PORT))
fp.set_preference("general.useragent.override","whater_useragent")
fp.update_preferences()
return webdriver.Firefox(firefox_profile=fp)
Ответ 3
У меня тоже была эта пробема. Я использовал urllib
с tor
в python3
.
- загрузите и установите браузер
- тестирование
откройте терминал и введите:
curl --socks5-hostname localhost:9050 <http://site-that-blocked-you.com>
если вы видите результат, он сработал.
- Теперь мы должны проверить в Python. Теперь запустите этот код
import socks
import socket
from urllib.request import Request, urlopen
from bs4 import BeautifulSoup
#set socks5 proxy to use tor
socks.set_default_proxy(socks.SOCKS5, "localhost", 9050)
socket.socket = socks.socksocket
req = Request('http://check.torproject.org', headers={'User-Agent': 'Mozilla/5.0', })
html = urlopen(req).read()
soup = BeautifulSoup(html, 'html.parser')
print(soup('title')[0].get_text())
если вы видите
Поздравляю. Этот браузер настроен на использование Tor.
Это также работает в Python, и это означает, что вы используете Tor для очистки веб-страниц.