Скребок в 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, так и веб-сайта, на котором выполняется сканирование.

  • вращающиеся пользовательские агенты с scrapy-fake-useragent промежуточное ПО:

Использовать случайный 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.

  1. загрузите и установите браузер
  2. тестирование

откройте терминал и введите:

curl --socks5-hostname localhost:9050 <http://site-that-blocked-you.com>

если вы видите результат, он сработал.

  1. Теперь мы должны проверить в 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 для очистки веб-страниц.