Size: a a a

2020 November 16

B

Bulatbulat48 in Scrapy
Alexey Lemeshevski
Еще странная штука - беру для эксперимента 3000 рабочих доменов 2го уровня, в настройках пишу:
CONCURRENT_REQUESTS = 50,
DOWNLOAD_DELAY = 100 (я хочу, например, чтобы второй запрос на этот сайт пришел только спустя 100 секунд),
CONCURRENT_REQUESTS_PER_DOMAIN = 1

И происходит следующее: scrapy примерно за 1-2 секунды берет первые 50 сайтов, делает запросы, получает ответы ... и замирает на 100 секунд)))

Что я не так делаю?)

Код в parse для теста самый простой (извлекает ссылки и возвращает (через yield) запросы).
удалил (не правильно понял)
источник

A

Andrii in Scrapy
тессеракт решает капчу яндекса? или кто как решает ее каптчу?
источник

AL

Alexey Lemeshevski in Scrapy
Михаил Синегубов
переписать код.
могу ошибаться, но, вроде, делай глобально работает.
я вот написал самый простой тест, какой смог придумать: https://pastebin.com/eDsN7pJ9
источник

AL

Alexey Lemeshevski in Scrapy
настройки:
CONCURRENT_REQUESTS = 10

DOWNLOAD_DELAY = 200
RANDOMIZE_DOWNLOAD_DELAY = False
источник

AL

Alexey Lemeshevski in Scrapy
источник

AL

Alexey Lemeshevski in Scrapy
по логу видно - он берет часть запросов (сколько влезает в concurent_requests) и ждет download_delay :)
источник

AR

Andrey Rahmatullin in Scrapy
ну да, а как
источник

AR

Andrey Rahmatullin in Scrapy
новые брать нельзя потому что очередь заполнилась, а очередь трогать нельзя пока делей не пройдёт
источник

B

Bulatbulat48 in Scrapy
Alexey Lemeshevski
Еще странная штука - беру для эксперимента 3000 рабочих доменов 2го уровня, в настройках пишу:
CONCURRENT_REQUESTS = 50,
DOWNLOAD_DELAY = 100 (я хочу, например, чтобы второй запрос на этот сайт пришел только спустя 100 секунд),
CONCURRENT_REQUESTS_PER_DOMAIN = 1

И происходит следующее: scrapy примерно за 1-2 секунды берет первые 50 сайтов, делает запросы, получает ответы ... и замирает на 100 секунд)))

Что я не так делаю?)

Код в parse для теста самый простой (извлекает ссылки и возвращает (через yield) запросы).
тут похоже все верно, но нужно CONCURRENT_REQUESTS = 1
CONCURRENT_REQUESTS_PER_DOMAIN = 1 будет работать для каждого домена, так как у тебя сейчас и работает.
так что получается можно оставить только CONCURRENT_REQUESTS = 1 (но нужно потестить, иначе спайдер может один домен обходить.)
источник

AL

Alexey Lemeshevski in Scrapy
Andrey Rahmatullin
новые брать нельзя потому что очередь заполнилась, а очередь трогать нельзя пока делей не пройдёт
а что можно сделать, чтобы, в момент ожидания download_delay могли отрабатывать запросы к другим доменам?

если я увеличу concurrent_requests, например, до 3000, то scrapy на старте попробует отправить 3000 запросов? (у меня сеть больше 200 одновременных запросов к сайтам не держит - 100мбит/с канал)
источник

AR

Andrey Rahmatullin in Scrapy
к каким другим доменам, download_delay глобальный
источник

B

Bulatbulat48 in Scrapy
@AlexeyLemeshevski какая цель вообще?
источник

AL

Alexey Lemeshevski in Scrapy
Andrey Rahmatullin
к каким другим доменам, download_delay глобальный
ого... кажется, теперь понял ) спасибо ) ...тогда, реально, надо 1 сайт = 1 процесс scrapy. И следить другим скриптом, чтобы параллельно всегда работало около 200 процессов.
источник

AL

Alexey Lemeshevski in Scrapy
Bulatbulat48
@AlexeyLemeshevski какая цель вообще?
обходить десятки и сотни тысяч сайтов ) при этом, мне нужен download_delay на каждый домен. Попутно выяснил ещё, что и из списка start_urls (или из start_process, который возвращает генератор) scrapy берет первые N урлов (по кол-ву concurrent_requests) и, пока parse генерирует новые запросы, scrapy не берет следующий из генератора start_process. Другими словами, на входе даем 3000 сайтов, он взял 50, пошел обходить... и пока есть хотя бы 1 request в очереди для любого из этих 50 сайтов (а request'ы создаются вновь и вновь, по мере сбора ссылок), он не берет следующие 50 сайтов ))) в итоге, если, например, ограничить обход сайтов всего 100 УРЛами, то в первые 10 минут он работает нормально, а потом производительность падает до десятков УРЛов в минуту )))
источник

A

Andrii in Scrapy
Alexey Lemeshevski
обходить десятки и сотни тысяч сайтов ) при этом, мне нужен download_delay на каждый домен. Попутно выяснил ещё, что и из списка start_urls (или из start_process, который возвращает генератор) scrapy берет первые N урлов (по кол-ву concurrent_requests) и, пока parse генерирует новые запросы, scrapy не берет следующий из генератора start_process. Другими словами, на входе даем 3000 сайтов, он взял 50, пошел обходить... и пока есть хотя бы 1 request в очереди для любого из этих 50 сайтов (а request'ы создаются вновь и вновь, по мере сбора ссылок), он не берет следующие 50 сайтов ))) в итоге, если, например, ограничить обход сайтов всего 100 УРЛами, то в первые 10 минут он работает нормально, а потом производительность падает до десятков УРЛов в минуту )))
скрапид
источник

A

Andrii in Scrapy
или ето 1 паук ходит 100к сайтов?
источник

AR

Andrey Rahmatullin in Scrapy
ну ты слоу
источник

AL

Alexey Lemeshevski in Scrapy
Andrii
скрапид
да, вы были правы ) спасибо ) ...хотя это не идеальное решение ) ...через event-loop (twisted или asyncio наверное это умеют; я в perl на AnyEvent это писал) нужная мне логика реализуется (просто запоминаешь время старта загрузки последнего запроса в словаре, key в словаре - домен; на каждое срабатывание loop'а проверяешь - прошло ли нужное время - если не прошло - возвращаешь в очередь, если прошло - забираешь из очереди и отдаешь загрузчику), но ... я уже реализовал часть логики на scrapy и не охота переписывать на чем-то вроде pycurl + asycnio ... scrapy дописывать тоже не охота )
источник

AL

Alexey Lemeshevski in Scrapy
ок, всем спасибо )
источник

МС

Михаил Синегубов... in Scrapy
Alexey Lemeshevski
да, вы были правы ) спасибо ) ...хотя это не идеальное решение ) ...через event-loop (twisted или asyncio наверное это умеют; я в perl на AnyEvent это писал) нужная мне логика реализуется (просто запоминаешь время старта загрузки последнего запроса в словаре, key в словаре - домен; на каждое срабатывание loop'а проверяешь - прошло ли нужное время - если не прошло - возвращаешь в очередь, если прошло - забираешь из очереди и отдаешь загрузчику), но ... я уже реализовал часть логики на scrapy и не охота переписывать на чем-то вроде pycurl + asycnio ... scrapy дописывать тоже не охота )
в скрапи есть события открытия, закрытия, простоя (перед закрытием, когда ему уже нечего парсить, тут можно подсунуть следующие ссылки и снова "поднять" паука). Сними можно мнооого интересного наворочать
источник