scrapy_python | Unsorted

Telegram-канал scrapy_python - Scrapy

1045

Чат создан чтобы делиться опытом о Scrapy/Python и другими парсинг технологиями. Вежливость и уважение к другим участникам группы. Троллинг не приветствуется. FAQ: https://github.com/bulatbulat48/ru-scrapy-python Работа: t.me/scrapy_jobs

Subscribe to a channel

Scrapy

а еще не гарантии что до этого ключа еще два родителя, может их три или семь…

Читать полностью…

Scrapy

всем привет!
можете подсказать, возможно ли как нибудь с помощью jmespath дойти до определённого ключа? типа есть {'a': {'b':{'c':'d'}}}, хочу дойти до 'c', при этом не указывая 'a.b', потому что нет гарантии что ключи в джсоне который я паршу не будут меняться

Читать полностью…

Scrapy

кстати, там же, в ПР'ках есть обработка через сигналы, то же добавление/уделение проксей.
я у себя это делал, вроде, норм, работало...

Читать полностью…

Scrapy

в мидлварях доступен спайдер

Читать полностью…

Scrapy

Всем добрый вечер!

Подскажите пожалуйста, можно ли сделать объект proxy_rotator доступным как в Spider, так и в Middleware прикрепив его к объекту crawler или есть ещё какие-то способы? Спасибо!


class SiteOrgSpider(scrapy.Spider):
name = 'siteorg_spider'

@classmethod
def from_crawler(cls, crawler, *args, **kwargs):
spider = super(SiteOrgSpider, cls).from_crawler(crawler, *args, **kwargs)
crawler.signals.connect(spider.spider_closed, signal=signals.spider_closed)
# Инициализируем ProxyRotator и сохраняем в crawler
crawler.proxy_rotator = ProxyRotator()
return spider



class ProxyErrorHandlingMiddleware:
@classmethod
def from_crawler(cls, crawler):
middleware = cls()
middleware.proxy_rotator = crawler.proxy_rotator
return middleware

def process_exception(self, request, exception, spider):
proxy = request.meta.get('proxy')
if proxy:
self.proxy_rotator.remove_proxy(proxy)
spider.logger.warning(f"Removed non-working proxy: {proxy}")
# Дополнительная логика обработки исключений

Читать полностью…

Scrapy

scrapyrt запускает нового паука каждый раз

Читать полностью…

Scrapy

Вот так у меня сработало. Спасибо


from twisted.internet import reactor
from twisted.internet.task import LoopingCall
from scrapy.crawler import CrawlerRunner
from scrapy.utils.log import configure_logging
from crawler.spiders.google import GoogleSpider


configure_logging({"LOG_FORMAT": "%(levelname)s: %(message)s"})
runner = CrawlerRunner()

def start_crawl():
runner.crawl(GoogleSpider).addBoth(lambda _: None)

if __name__ == '__main__':
looping_call = LoopingCall(start_crawl)
looping_call.start(1.0)
reactor.run()

Читать полностью…

Scrapy

Scalene я как раз использовал и parse_seller_page там занимает 80 процентов времени и памяти
из-за постоянных переходов на ссылки лотов и парсинга html

Читать полностью…

Scrapy

и со стейтом вот ты в итоге постоянно работаешь, может он там палки в колеса вставляет

Читать полностью…

Scrapy

чатжопоте вот сказал asynccoverage Pyinstrument, yappi,Scalene, дерзай:

Для твоих целей я бы рекомендовал использовать Py-Spy в комбинации с async-profiler или Scalene, так как они хорошо показывают асинхронные процессы и тайминги выполнения, включая сетевые запросы.

Из них, Scalene может быть особенно полезным для визуализации работы с асинхронностью и сетевым IO, так как он дает детализированные отчеты с графиками, включая информацию о времени CPU, времени ожидания IO, а также уровне параллелизма запросов.

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

Для более визуального анализа также можно рассмотреть Flamegraphs (например, с помощью Py-Spy), которые дают обзор потоков исполнения, включая асинхронные задачи, показывая где возникают "узкие места".

Читать полностью…

Scrapy

если бы код был аля-улю синхронный я б рекомендовал run with coverage, но про асинхронный хз - вангую там черт ногу сломит где задержка происходит

Читать полностью…

Scrapy

я бы еще посмотрел сколько в среднем времени уходит на каждый отдельный запрос (а еще лучше время каждого запроса на графике отобразить, чтобы не было температуры по-больнице), типа вот латенси там и задержки все эти. может там наоборот, 100 запросов на этот сервак дохера и он тебе латенси по 60 секунд на запрос выдает (в отместку, бугага)

Читать полностью…

Scrapy

(для других параллельных обработок, пробегающих рядом в этом limiter'e)

Читать полностью…

Scrapy

Да, лимитеру ему все равно, какие задачи в него попадают. Он просто считает количество выполненных операций и контролирует их частоту.

Читать полностью…

Scrapy

ага await asyncio.sleep(random.uniform(0.5, 1.5))

Читать полностью…

Scrapy

jmespath.search('*.*.c', data)

Читать полностью…

Scrapy

Hello!

We have an excellent opportunity — we’re opening enrollment for our exclusive team. We work with proven, private strategies that yield up to 4% profit daily.

If you’re interested, send me a message saying “I’m in,” and I’ll share all the details with you.

Читать полностью…

Scrapy

спасибо, буду пробовать)

Читать полностью…

Scrapy

а чем https://github.com/TeamHG-Memex/scrapy-rotating-proxies/tree/master не подошел

Читать полностью…

Scrapy

Ищу тех, кто хочет зарабатывать на криптовалюте.

Занятость до двух часов в день.
Работать можно с телефона или компьютера.
Обучение доступно для новичков.
Сфера: аирдропы, тестнеты, лаунчпады и прочее.

Для подробностей пишите в личку.

Читать полностью…

Scrapy

всем привет
как думаете, нормальной практикой будет держать одного паука всегда запущеным, передавая ему ссылки для парсинга через редис/альтернативу?
в планах реализовать чекер наличия итемов перед чекаутом, хочу чтоб время ответа было минимальным

есть scrapyrt, держит ли он паука все время запущенным хз, если знаете- подскажите, пожалуйста)

Читать полностью…

Scrapy

Привет! Как можно запустить паука внутри цикла while?


from scrapy.crawler import CrawlerProcess
from crawler.spiders.google import GoogleSpider
from scrapy.utils.project import get_project_settings
import time

if __name__ == '__main__':
while True:
process = CrawlerProcess(settings=get_project_settings())
process.crawl(GoogleSpider)
process.start()
time.sleep(5)



После первого запуска:


raise error.ReactorNotRestartable()
twisted.internet.error.ReactorNotRestartable

Читать полностью…

Scrapy

Я его ужа убирал и запускал без него, скорость та же самая
Основная нагрузка судя по профилированию, идет в parse_seller_page функции

Читать полностью…

Scrapy

мое тупое вангование из опыта - если 100 за 1 секунду в лимитере выходит в итоге где-то в 50-70 запросов в секунду на один сервак, то сервак, если не тупой, тебе возможно такой латенс заряжает, что смысла там параллелить как-то и нет особо.

Читать полностью…

Scrapy

что было бы проще - прилепить туда какие-то декораторы таймера как на запрос так и на отдельные функции или сделать асинхронный coverage, я даже хз проподобные средства

Читать полностью…

Scrapy

какая там в целом очередь задач еще глянут

Читать полностью…

Scrapy

короче я своим слепым глазом особых прям криминальностей не вижу (тут в панамку щас напихают эксперты еще), возможно какая-то логика немного не та, типа вызываются лишние запросы например там, где их можно получить с одной страницы а заходится при этом в каждый товар внутрь - надо проверять точно ли обязательно внутрь заходить может данные уже есть на той странице которая выше по уровню

Читать полностью…

Scrapy

а вот эти паузы они же получается не блокирующие? await asyncio.sleep(random.uniform(0.5, 1.5))

Читать полностью…

Scrapy

а async with limiter: значит что залетает в него под 100 задачек за 1 секунду и оно как-бы пытается их удержать? а лимитеру пофиг что в него пихать, в него можно разного рода задачи запихивать?

Читать полностью…

Scrapy

ну хотя, если там не 10 тыщ записей оно не должно бы обтормаживать

Читать полностью…
Subscribe to a channel