Как стать автором
Обновить

Комментарии 6

питон давно стал проблемой а не решением

Ускорил скорость…

А причем тут Python? Я думал что автор нашел необычный способ парсинга, или написал свой. А тут по сути он нашел способ как запрашивать JSON, а не парсить всю страницу?

В самом начале статьи было сказано о чем пойдет речь далее. Под конец написания я и сам задумался о названии, но пока мне сложно переименовать и перенести в ветку reverse-инженеринга, т.к. это сложно таковым назвать. Статью решил оставить, так как придумал хорошее оправдание, о котором написано в конце статьи. Уж извините, если не оправдал ваших надежд.

Спасибо за статью! Я так вайлдбериз парсю и трейдингвью. Только они не требуют никаких прокси и никакие капчи не вываливают.

привет. попробуй заменить все return на yield. Будешь сильно удивлен.
как то так:


    def search(self, search_value, search_by_key, partial):

        def process(data, path: str):
            if isinstance(data, dict):
                for key, value in data.items():
                    if search_by_key:
                        if key == search_value:
                            results.append(f'{path}.{key}')
                    prefix = '.' if path != '' else ''
                    if isinstance(value, dict):
                        process(data.get(key), f'{path}{prefix}{key}')

                    if isinstance(value, list):
                        for index, i in enumerate(value):
                            process(i, f'{path}{prefix}{key}[{index}]')
                    else:
                        if partial and isinstance(value, str):
                            if search_value in value:
                                yield f'{path}{prefix}{key}'
                        if search_value == value:
                            yield f'{path}{prefix}{key}'

        gen = process(self.input_item, '')
        result = next(gen, None)
        second = next(gen, None)
        return result if result and not second else chain((result, second),  results)

    # Для получения значения по пути вида value.items[0].name
    def get_value(self, path: str):

        def process(current, item):
            lists = re.findall(r'[\d+]+', current)
            if len(lists):
                key = re.findall('[a-zA-Z]+', current)[0]
                yield item.get(key)[int(lists[0])]
            else:
                yield item.get(current)

        res = self.input_item

        for i in path.split('.'):
            res = process(i, res)
        return res

    # Для того чтобы срезать count глубины с конца пути
    @staticmethod
    def cut_path(path: str, count: int):
        return '.'.join(path.split('.', count)[0:-1])
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории