Как стать автором
Обновить

Комментарии 42

Спасибо за статью! Фраза про EA просто топ
Может, чем ходить через тор, проще (и лучше по отношению к серверу) было ограничить rps? Вполне возможно, что заблокировали не просто из-за количества запросов, а именно из-за rps.

Кстати говоря, увидев заголовок статьи, изначально ожидал встретить в статье описание обхода 429 Too Many Requests.
можете указать ссылку где можно подробно ознакомиться с предложенным вами вариантом?
Disclaimer: я не питонист, так что не уверен, что нагуглил правильно.

Использовать пакет ratelimit выглядит подходящим решением.
спасибо, посмотрел ссылку, по сути все сводится к уменьшению числа запросов за единицу времени
Да. Собственно, rps и расшифровывается как «requests per second».
Другое дело, если админ берет и банит любые обращения с сети Тор. Вот просто напрочь и фаерволом и на самом Nginx — и тогда только урезание rps спасает, да и то не всегда. Попробуйте использовать ipv6 посдети и списки proxy.
А чего там сложного? Просто добавить ограничение на количество запросов, самый простой вариант, добавить банально sleep после каждого запроса

Безусловно, ограничение числа запросов было первым опробованным методом, time.sleep() наше всё, однако он совершенно не спасал. Во-первых, 429-я ни разу не всплывала, а во-вторых, даже при увеличении интервала между запросами до одной минуты, бан всё равно приходил. Из чего мы и сделали вывод, что блокировка происходит при любом подозрении на автоматические запросы, и поэтому стали искать новые способы обхода.

А что если рандомизировать время time.sleep()’а?

Честно говоря, не пробовали, но в предыдущих проектах это не помогало. К тому же время отправки запросов и так не было распределено со строгими интервалами, некоторые страницы подгружались быстрее, некоторые медленнее, что зависело и от скорости сети, и от количества контента на странице.
Далеко не все банят очевидным 429, к слову. Многие предпочитают, например, начинать показывать капчу. Капча — тот же бан в смысле парсинга: вебсайт защищает свой контент от показа.
Сам люблю писать парсеры, просто из интереса и для наблюдения. Нашёл у вас парочку полезных ссылок. Спасибо за статью!
Мне казалось вчера тут ещё была часть про распараллеливание процесса?! Или мне совсем уже не хорошо?
Вчера точно не было, хотя распараллелить тут можно достаточно просто — разбить потоки по батчам страниц, например, штук по 50-100, а потом объединить в финальный датасет.
Крутая статья! Спасибо ребята!
Однозначно плюсик! Прикрутил себе прокси через Тор, добавив всего две строчки кода, я рад.
Ещё бы «fake-useragent» для сишки накопать.
Для меня основной критерий — скорость обработки запроса, как у python обстоят дела со скоростью сетевых запросов? Использует ли он неблокирующие сокеты или какие другие механихзмы? Есть ли смысл смотреть в сторону python если мне допустим необходимо обойти 3 000 000 сайтов?

Scrapy — промышленный инструмент для парсинга.

Юзай aiohttp
Честно говоря, до промышленных систем в таких масштабах дело не доходило, но можно посмотреть в сторону вот этих ребят — scrapinghub.com. Они как раз разрабатывают платформу, позволяющую быстро, эффективно и масштабируемо собирать данные.
Да, у нас как раз есть решение, которое может помочь с банами: Crawlera.
Ирония заключается в том, что для промышленных скраперов язык совершенно неважен, важно написать его быстро, без ошибок и устойчивым к изменениям со стороны самого сайта.

Дело в том, что многие вебсайты — особенно популярные, которые представляют интерес с точки зрения данных, — так или иначе защищаются от скрапинга, поэтому довольно быстро вы сами себе по рукам начнете давать, ограничивая количество запросов с секунду, чтобы не получить лишний бан. Либо будете ограничивать RPS, чтобы вебсайт не накатал abuse report на ваши действия, которые быстро покажутся подозрительными.

В случае масштабных кравлов (3000000 сайтов) быстро понадобится какая-то инфраструктура, и там язык уж точно не будет ботлнеком. Посмотрите на Frontera, как раз-таки промышленный инструмент для подобной задачи.
А если просто прикинуться гуглоботом?)
Ну, есть ещё куча других поисковых систем и невозможно IP адреса всех знать и хранить.
А я даже и не думал использовать тор для автоматизированного обхода ip блокировок. Спасибо за идею!
Чем использовать тор, лучше было бы поставить ограничение на количество запросов в единицу времени. А ещё лучше использовать aiohttp, requests блокирующий и как следствие медленный. Также тор часто банят и IP не так много, поэтому лучше взять прокси. Если хорошо, поискать, можно в открытых источниках найти несколько тысяч(ну или купить платные). github.com/DevAlone/proxy_py в зависимости от времени суток количество проксей меняется от тысячи, почти до 9 тысяч. Если сделать пул проксей, где хранить информацию о времени последнего запроса(для ограничения количества запросов) и периодически обновлять его(удалять мёртвые прокси и добавлять свежие), то получится очень производительный парсер.
Ограничения на число запросов в разных конфигурациях конечно же пробовали, к сожалению, не помогло. Тор активно банят, да и переключение между разными выходами — дело медленное, но все-таки выходных узлов достаточно для того, чтобы забаненные IP не повторялись, а в исследовательских целях, когда сам парсер лишь промежуточный инструмент, а не конечный продукт, можно и подождать.
Прокси — замечательный вариант, если действительно хорошо поискать или заплатить надежным поставщикам, но хотелось поэкспериментировать именно с тором и его передресацией запросов. А за ссылку большое спасибо, наверняка не раз в будущем пригодится!

Зачем для простых запросов тянуть библиотеку requests, основанную на другой сторонней библиотеке urllib3, которая, в свою очередь, является надстройкой над стандартными средствами python. Чем стандартный urllib не устроил?

Интересный вариант как введение в скрэпинг, что из чего состоит и как работает. Если делать всерьез, то лучше взять scrapy — она это все умеет.
Пример. Когда-то давно, в качестве развлечения написал парсер задач с веблансера. Она сам запускается в 16 покотоков и за полминуты он выдал мне тысячи задач в виде CSV.


Код простой донельзя (и его можно еще сократить):


from urllib.parse import urljoin
from scrapy import Spider, Request

class WeblancerParser(Spider):
    name = 'wbl_prj'
    allowed_domains = ["www.weblancer.net"]
    _url = 'http://www.weblancer.net/projects/'

    _extract_fields = (
        ('title', 'h2.title > a'),
        ('categories', 'a.text-muted'),
        ('price', 'div.amount.title'),
        ('apps', '.text-nowrap'),
    )

    def start_requests(self):
        yield self.make_requests_from_url(self._url)

    def parse(self, response):
        for row in response.css('div.cols_table.container-fluid > div.row'):
            yield dict(
                (k, '|'.join(c.strip()
                             for c in row.css(v+'::text').extract()))
                for k, v in self._extract_fields
            )

        for link in response.css('ul.pagination > li > a::attr(href)'):
            yield Request(urljoin(self._url, link.extract()))
Отличная статья, но у меня почему-то knowyourmeme.com входит в число запрещенных сайтов, причем при попытке делать запрос используя Tor, вылетает 403 ошибка) Думаю про пути обхода такого рода сайтов задавать вопрос вообще неуместно, или это выходит за рамки этой статьи?)
А можно полюбопытствовать, что значит «входит в число запрещенных» — провайдер блокирует доступ или администратор рабочей сети не даёт мемесы посмотреть? :)
Провайдер заблокировал, но по по решению органов государственной власти Российской Федерации.
Лол, и вправду eais.rkn.gov.ru
ну теперь собсно вопрос как это обойти, потому что даже используя описываемый в статье способ через tor, приводит к ошибке 403
Просто возможно выходная нода заблокированна сайтом knowyourmeme.com, т.к. tor шифрованный и ркн не может фильтровать сайты внутри тор трафика.
Теперь запускаем свежескачанный браузер и оставляем его открытым.

Вместо Tor Browser можно использовать обычный tor-сервис (в том числе и под виндой, категоричный отказ от которой выглядит просто нелепо). Не нужно будет ничего держать открытым, что особенно актуально на серверах.

По поводу смены Tor-сессии.
Это делается через передачу на ControlPort сервиса сигнала (NEWNYM) по TCP-сокету, зачем городить костыли с конфигами совсем не понятно.

Если лень/не умеете работать с сокетами, то всё уже сделано за вас: stem.torproject.org

На большинстве крупных ресурсов подсети выходных нод тора тупо забанены, поэтому часто не панацея.

Если нужны свободные пулы, то легче агрегировать, проверять и ротировать публичные прокси самописным микросервисом и дёргать доступные прокси уже через него.

Совсем ленивые могут купить приватных проксей.
Перевод отличный, статья неплохая, но вброс про Windows вообще как-то чужеродно видится… Есть разработчики и под эту платформу, и на этой платформе.
Прикинуться определенным юзерагентом — это здравая мысль, но помогает только в самых простых случаях. Еще нужно отправлять те хедеры, что посылает тот браузер, под который идет закос, причем очень желательно посылать в том же порядке, в котором их сам браузер и расставляет.
Что-то мне подсказывает, что в robots.txt можно подсмотреть нужный delay и юзер-агент
А в sitemap.xml получить все ссылки на мемы без кроулинга
I get an error:
urllib.error.URLError: <urlopen error PySocks doesn't support IPv6: ('2604:1380:1000:af00::1', 80, 0, 0)>
how to be in this case?
Зарегистрируйтесь на Хабре , чтобы оставить комментарий