1045
Чат создан чтобы делиться опытом о Scrapy/Python и другими парсинг технологиями. Вежливость и уважение к другим участникам группы. Троллинг не приветствуется. FAQ: https://github.com/bulatbulat48/ru-scrapy-python Работа: t.me/scrapy_jobs
а еще не гарантии что до этого ключа еще два родителя, может их три или семь…
Читать полностью…
всем привет!
можете подсказать, возможно ли как нибудь с помощью 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 секунд на запрос выдает (в отместку, бугага)
Читать полностью…
(для других параллельных обработок, пробегающих рядом в этом limiter'e)
Читать полностью…
Да, лимитеру ему все равно, какие задачи в него попадают. Он просто считает количество выполненных операций и контролирует их частоту.
Читать полностью…
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 секунду и оно как-бы пытается их удержать? а лимитеру пофиг что в него пихать, в него можно разного рода задачи запихивать?
ну хотя, если там не 10 тыщ записей оно не должно бы обтормаживать
Читать полностью…