всем привет!
можете подсказать, возможно ли как нибудь с помощью jmespath дойти до определённого ключа? типа есть {'a': {'b':{'c':'d'}}}, хочу дойти до 'c', при этом не указывая 'a.b', потому что нет гарантии что ключи в джсоне который я паршу не будут меняться
кстати, там же, в ПР'ках есть обработка через сигналы, то же добавление/уделение проксей.
я у себя это делал, вроде, норм, работало...
Всем добрый вечер!
Подскажите пожалуйста, можно ли сделать объект 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}")
# Дополнительная логика обработки исключений
Вот так у меня сработало. Спасибо
Читать полностью…
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()
Scalene я как раз использовал и parse_seller_page там занимает 80 процентов времени и памяти
из-за постоянных переходов на ссылки лотов и парсинга html
и со стейтом вот ты в итоге постоянно работаешь, может он там палки в колеса вставляет
Читать полностью…чатжопоте вот сказал asynccoverage Pyinstrument, yappi,Scalene, дерзай:
Для твоих целей я бы рекомендовал использовать Py-Spy в комбинации с async-profiler или Scalene, так как они хорошо показывают асинхронные процессы и тайминги выполнения, включая сетевые запросы.Читать полностью…
Из них, Scalene может быть особенно полезным для визуализации работы с асинхронностью и сетевым IO, так как он дает детализированные отчеты с графиками, включая информацию о времени CPU, времени ожидания IO, а также уровне параллелизма запросов.
Если тебе важны графики для сетевых запросов, Scalene может предоставлять как текстовые, так и графические отчеты, которые помогут отследить начало и окончание сетевых запросов и проанализировать, сколько из них выполняется параллельно.
Для более визуального анализа также можно рассмотреть Flamegraphs (например, с помощью Py-Spy), которые дают обзор потоков исполнения, включая асинхронные задачи, показывая где возникают "узкие места".
если бы код был аля-улю синхронный я б рекомендовал run with coverage, но про асинхронный хз - вангую там черт ногу сломит где задержка происходит
Читать полностью…я бы еще посмотрел сколько в среднем времени уходит на каждый отдельный запрос (а еще лучше время каждого запроса на графике отобразить, чтобы не было температуры по-больнице), типа вот латенси там и задержки все эти. может там наоборот, 100 запросов на этот сервак дохера и он тебе латенси по 60 секунд на запрос выдает (в отместку, бугага)
Читать полностью…Да, лимитеру ему все равно, какие задачи в него попадают. Он просто считает количество выполненных операций и контролирует их частоту.
Читать полностью…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.
а чем https://github.com/TeamHG-Memex/scrapy-rotating-proxies/tree/master не подошел
Читать полностью…Ищу тех, кто хочет зарабатывать на криптовалюте.
Занятость до двух часов в день.
Работать можно с телефона или компьютера.
Обучение доступно для новичков.
Сфера: аирдропы, тестнеты, лаунчпады и прочее.
Для подробностей пишите в личку.
всем привет
как думаете, нормальной практикой будет держать одного паука всегда запущеным, передавая ему ссылки для парсинга через редис/альтернативу?
в планах реализовать чекер наличия итемов перед чекаутом, хочу чтоб время ответа было минимальным
есть scrapyrt, держит ли он паука все время запущенным хз, если знаете- подскажите, пожалуйста)
Привет! Как можно запустить паука внутри цикла 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
Я его ужа убирал и запускал без него, скорость та же самая
Основная нагрузка судя по профилированию, идет в parse_seller_page функции
мое тупое вангование из опыта - если 100 за 1 секунду в лимитере выходит в итоге где-то в 50-70 запросов в секунду на один сервак, то сервак, если не тупой, тебе возможно такой латенс заряжает, что смысла там параллелить как-то и нет особо.
Читать полностью…что было бы проще - прилепить туда какие-то декораторы таймера как на запрос так и на отдельные функции или сделать асинхронный coverage, я даже хз проподобные средства
Читать полностью…короче я своим слепым глазом особых прям криминальностей не вижу (тут в панамку щас напихают эксперты еще), возможно какая-то логика немного не та, типа вызываются лишние запросы например там, где их можно получить с одной страницы а заходится при этом в каждый товар внутрь - надо проверять точно ли обязательно внутрь заходить может данные уже есть на той странице которая выше по уровню
Читать полностью…а вот эти паузы они же получается не блокирующие? await asyncio.sleep(random.uniform(0.5, 1.5))
Читать полностью…а async with limiter:
значит что залетает в него под 100 задачек за 1 секунду и оно как-бы пытается их удержать? а лимитеру пофиг что в него пихать, в него можно разного рода задачи запихивать?