Comments 42
Кстати говоря, увидев заголовок статьи, изначально ожидал встретить в статье описание обхода 429 Too Many Requests.
Использовать пакет ratelimit выглядит подходящим решением.
Безусловно, ограничение числа запросов было первым опробованным методом, time.sleep()
наше всё, однако он совершенно не спасал. Во-первых, 429-я ни разу не всплывала, а во-вторых, даже при увеличении интервала между запросами до одной минуты, бан всё равно приходил. Из чего мы и сделали вывод, что блокировка происходит при любом подозрении на автоматические запросы, и поэтому стали искать новые способы обхода.
А что если рандомизировать время time.sleep()’а?
Ещё бы «fake-useragent» для сишки накопать.
Scrapy — промышленный инструмент для парсинга.
Дело в том, что многие вебсайты — особенно популярные, которые представляют интерес с точки зрения данных, — так или иначе защищаются от скрапинга, поэтому довольно быстро вы сами себе по рукам начнете давать, ограничивая количество запросов с секунду, чтобы не получить лишний бан. Либо будете ограничивать RPS, чтобы вебсайт не накатал abuse report на ваши действия, которые быстро покажутся подозрительными.
В случае масштабных кравлов (3000000 сайтов) быстро понадобится какая-то инфраструктура, и там язык уж точно не будет ботлнеком. Посмотрите на Frontera, как раз-таки промышленный инструмент для подобной задачи.
Прокси — замечательный вариант, если действительно хорошо поискать или заплатить надежным поставщикам, но хотелось поэкспериментировать именно с тором и его передресацией запросов. А за ссылку большое спасибо, наверняка не раз в будущем пригодится!
Зачем для простых запросов тянуть библиотеку 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()))
Теперь запускаем свежескачанный браузер и оставляем его открытым.
Вместо Tor Browser можно использовать обычный tor-сервис (в том числе и под виндой, категоричный отказ от которой выглядит просто нелепо). Не нужно будет ничего держать открытым, что особенно актуально на серверах.
По поводу смены Tor-сессии.
Это делается через передачу на ControlPort сервиса сигнала (
NEWNYM
) по TCP-сокету, зачем городить костыли с конфигами совсем не понятно.Если лень/не умеете работать с сокетами, то всё уже сделано за вас: stem.torproject.org
На большинстве крупных ресурсов подсети выходных нод тора тупо забанены, поэтому часто не панацея.
Если нужны свободные пулы, то легче агрегировать, проверять и ротировать публичные прокси самописным микросервисом и дёргать доступные прокси уже через него.
Совсем ленивые могут купить приватных проксей.
А в sitemap.xml получить все ссылки на мемы без кроулинга
urllib.error.URLError: <urlopen error PySocks doesn't support IPv6: ('2604:1380:1000:af00::1', 80, 0, 0)>
how to be in this case?
Парсим мемы в питоне: как обойти серверную блокировку