Size: a a a

2021 February 04

МС

Михаил Синегубов... in Scrapy
Кстати, народ, вроде спрашивал, но забыл что предложили и как именно спрашивал (не нашел поиском) 😳. Где можно министатейки, больше как шпаргалки для себя с кусками кода и небольшими пояснениями что и для чего.  А то умаялся шариться по проектам, где что делал. А их уже не совсем мало :)
источник

П

Пастырь in Scrapy
Михаил Синегубов
для старта:
https://stackoverflow.com/questions/46339263/scrapy-get-start-urls-from-database-by-pipeline
https://stackoverflow.com/questions/38658491/scrapy-generate-url-from-database

в довесок скажу
1. надо скрестить оба метода. Тогда при 10 млн записях можно по 1000 ссылок дергать
2. статус меняешь в пайпе. Можно отдельными айтемом, можно тем же.

ну и, это все не истина последней инстанции. Но у меня такая связка (чуток проработанная) успешно работает на десятках млн записях и норм.
По хорошему, если у тебя сотни тысяч ссылок, то надо либо свой дупфильтр делать, либо отключать его нахрен, если он не актуален. Ибо нахрен все это хранить в мозгах
У меня примерно 7кк записей
источник

МС

Михаил Синегубов... in Scrapy
ну, тебе по каждой ссылке один айтем в результате будет? или 100500?
источник

П

Пастырь in Scrapy
Один
источник

МС

Михаил Синегубов... in Scrapy
1. запись в базе можно по ссылке искать (может и "тяжелее" чем по целому числу, но менее геморойнее)
2. на всех записях статус = 0
3. получаешь 1000 записей, ставишь и "1"
4. при сохранении данных в ту же таблицу ставишь статус "2"
5. в spider_idle получаешь след. 1000 записей и генеришь DontCloseSpider, если записи получил из базы
6. кстати, обрати внимание, как реквесты в добавляются в очередь по второй ссылке
источник

OS

Oleg Shleiko in Scrapy
А я другой костыль хреначил....
    def start_requests(self):
       for i in range(0, 100):
           url = get_url_from_db()
           yield scrapy.Request(url=url, callback=self.parse_offers, dont_filter=True)
источник

МС

Михаил Синегубов... in Scrapy
для начала попробуй все это сам реализовать, если что не получится - приходи уже с конкретными вопросами.
Можно кончено заморочаться со всякими очередями и прочими плюшками, но ИМХО это нах не надо, по крайней мере пока
источник

МС

Михаил Синегубов... in Scrapy
Oleg Shleiko
А я другой костыль хреначил....
    def start_requests(self):
       for i in range(0, 100):
           url = get_url_from_db()
           yield scrapy.Request(url=url, callback=self.parse_offers, dont_filter=True)
rabbitmq_helper - я так понимаю, человеку надо с кроликом еще разбираться? ничего не имею против его, но, по моему, надо до него дорасти, на не кидаться бездумно в кучу всего нового. Мозг вскипит
ну и, тут не понятно как поступать с 7кк записями, все их всасывать сразу?

я не против твоего метода, просто хз, надо ли сразу такое человеку. По моему, надо дорастать до решений.
источник

OS

Oleg Shleiko in Scrapy
Михаил Синегубов
rabbitmq_helper - я так понимаю, человеку надо с кроликом еще разбираться? ничего не имею против его, но, по моему, надо до него дорасти, на не кидаться бездумно в кучу всего нового. Мозг вскипит
ну и, тут не понятно как поступать с 7кк записями, все их всасывать сразу?

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

OS

Oleg Shleiko in Scrapy
исправил....
источник

OS

Oleg Shleiko in Scrapy
по поводу 7кк записей сразу точно не стоит, да и вообще по мне это не малый объём данных, нужно обезапашивать парсинг что б не отвалилось ничего и по новой не распаршивать
источник

МС

Михаил Синегубов... in Scrapy
Oleg Shleiko
да я не хотел что б вы на кролика зациклились, просто способ сбросил
а, сорян, ты про "перекрыть start_requests"? Тогда Ок, вполне достойно.
Кстати, в твоем варианте намного проще подтащить доп. данные из базы.
источник

П

Пастырь in Scrapy
Михаил Синегубов
1. запись в базе можно по ссылке искать (может и "тяжелее" чем по целому числу, но менее геморойнее)
2. на всех записях статус = 0
3. получаешь 1000 записей, ставишь и "1"
4. при сохранении данных в ту же таблицу ставишь статус "2"
5. в spider_idle получаешь след. 1000 записей и генеришь DontCloseSpider, если записи получил из базы
6. кстати, обрати внимание, как реквесты в добавляются в очередь по второй ссылке
Могу в личку написать ?
источник

МС

Михаил Синегубов... in Scrapy
Oleg Shleiko
по поводу 7кк записей сразу точно не стоит, да и вообще по мне это не малый объём данных, нужно обезапашивать парсинг что б не отвалилось ничего и по новой не распаршивать
так оно то и обезопасится, если писать в базу со сменой статуса, не особо большими кусками.
Кстати, вроде как, можно и все записи записи сразу всосать, но:
1. сцуко, долго будет
2. смысла нет, ибо по п. 1 старт будет ппц, какой долгий
источник

МС

Михаил Синегубов... in Scrapy
Пастырь
Могу в личку написать ?
а нахрена? Или там пентагоновские тайны?
может переписка кому и пригодится. А если боишься глупые вопросы задать, так чего я только не видел. 😂
Ну и, может кто чего более полезного посоветует
источник

П

Пастырь in Scrapy
Михаил Синегубов
а нахрена? Или там пентагоновские тайны?
может переписка кому и пригодится. А если боишься глупые вопросы задать, так чего я только не видел. 😂
Ну и, может кто чего более полезного посоветует
Угадал :D
Статусы я сделал для того, чтобы в случае потери соединения, либо бана, мне не пришлось неделю сидеть заново собирать
источник

П

Пастырь in Scrapy
У меня вообще 2 варианта в голове.
Первый это использовать inmemory хранилище типа redis, импортировать туда все записи, и по 1 доставать. Но тогда теряется отказоустойчивость.
Второй, это брать по 100 записей, менять статус на running, вытащить данные, поставить complete. В случае закрытия паука я потом продолжу с того-же места
источник

П

Пастырь in Scrapy
только вот я не до конца понимаю жизненный цикл скрапи похоже
источник

МС

Михаил Синегубов... in Scrapy
Пастырь
У меня вообще 2 варианта в голове.
Первый это использовать inmemory хранилище типа redis, импортировать туда все записи, и по 1 доставать. Но тогда теряется отказоустойчивость.
Второй, это брать по 100 записей, менять статус на running, вытащить данные, поставить complete. В случае закрытия паука я потом продолжу с того-же места
у меня второй метод постоянно используется. Первый - я кролика не знаю😂
источник

МС

Михаил Синегубов... in Scrapy
Пастырь
только вот я не до конца понимаю жизненный цикл скрапи похоже
а что именно не понятно?
источник