странный js попадается, но я его регуляркой чищу и через chompjs прогоняю
в нём например вместо запятых в некоторых местах слеш, внутри строчек неэкранированные кавычки
тут регулярки тема
пока 7 нашёл, надеюсь больше не будет)
а так да, проще выходит просто по словарю как по дереву ходить
всем спасибо!
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 запросов в секунду на один сервак, то сервак, если не тупой, тебе возможно такой латенс заряжает, что смысла там параллелить как-то и нет особо.
Читать полностью…А известна максимальная вложенность? А то мб подобие такого прокатит:
find_str = "*.c"Читать полностью…
while True:
jmespath.search(find_str, data)
find_str = "*." + find_str
js2xml + xpath, угу
может конкуренты jmespath умеют, не силён (не удивлюсь если нет)
jq наверняка сумеет, но через разворачивание ключей в вектор и прочую байду
всем привет!
можете подсказать, возможно ли как нибудь с помощью 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), которые дают обзор потоков исполнения, включая асинхронные задачи, показывая где возникают "узкие места".