|
4 / 4 / 2
Регистрация: 04.04.2015
Сообщений: 186
|
||||||
Beautiful Soup 4, сравнение html-парсеров при запуске в потоке04.04.2018, 21:03. Показов 7737. Ответов 47
Метки нет (Все метки)
Здравствуйте, спарсил страницу с помощью lxml, встроенного в Beautiful Soup - выдал 30 секунд. Не поверил, начал искать ошибки и оптимизировать. Ничего конкретного не получилось, время парсинга примерна такая же. Вспомнил, что у Beautiful Soup есть еще 2 других парсера html.parser и html5lib, в итоге их результаты:
Запуск в отдельном потоке Запуск в общей программе, без создания отдельного потока html.parser:2 1.44 html5lib: 14 5.5 lxml: 30 1.24 И собственно вопрос, почему в потоке lxml так теряет в скорости? Хотя он считается самым быстрым Метод запуска потока:
Вдруг кому-то захочется спарсить эту же страницу ради спортивного интереса: https://www.mvideo.ru/smartfon... rtfony-205 . Парсить только ссылки на телефоны 1 страницы (этой). Пишите библиотеку и язык программирования для сравнения. Должен быть запрос страницы, без сохранения ее на диск, а потом ее парсинга
0
|
||||||
| 04.04.2018, 21:03 | |
|
Ответы с готовыми решениями:
47
Beautiful Soup Python Парсинг на Python с Beautiful Soup
|
|
|
|||||||||||||||
| 06.04.2018, 17:22 | |||||||||||||||
|
Многопоточность != асинхронность. Многопоточность основана на вытесняющей многозадачности. Асинхронность - на кооперативной многозадачности + event loop. В многопоточных программах потоками (если это настоящие потоки) управляет планировщик ОС. В асинхронных программах потоков нет - они однопоточные. Однако есть корутины\сопрограммы, которые как раз выполняют роль нитей. И управление нитями\корутинами - переключение с одной задачи на другую - задача соответствующей библиотеки (в python это asyncio). И библиотека ожидает, что мы в своем коде будет использовать только асинхронный код - иначе все усилия - кот под хвост. Небольшая цитата:
Распараллеливать запросы посредством асинхронного кода более практично, чем использование многопоточности. -----------------------------
UPD. Другой вариант - без ожидания завершения каждого задания - обработка результатов по мере поступления. Все то же самое, изменена только функция main, в которую теперь нужно передать именованный параметр loop с экземпляром запущенного цикла событий.
0
|
|||||||||||||||
|
4 / 4 / 2
Регистрация: 04.04.2015
Сообщений: 186
|
||||||||||||||||
| 06.04.2018, 17:43 [ТС] | ||||||||||||||||
|
Если нажать на выбор город на https://www.mvideo.ru/ и искать города: то выдает лишние значения None
Кликните здесь для просмотра всего текста
Добавлено через 53 секунды применяю
Не пойму, из-за чего происходит Добавлено через 1 минуту
Хотя если проверить длину списка, то он равен 15, но ни как не 30 Добавлено через 2 минуты И вопрос как можно ограничить количество запросов? Если я правильно понимаю, одновременно делаются запросы, количество которых равно количеству элементов в списке. А если там будет больше 50, меня же забанить могут) Добавлено через 1 минуту Это для ссылки https://www.mvideo.ru/sitebuil... pageUrl=/&
0
|
||||||||||||||||
|
|
||||||||
| 06.04.2018, 18:39 | ||||||||
|
И еще - не смешивайте в одной функции логику запроса и логику парсинга. Это все нужно делать в отдельных функциях помеченных как async и дожидаться их выполнения посредством await. У меня в коде (и уже пожалел, что не сделал этого сразу) - строчка
Такая разбивка делает код более читабельным, понятным не только вам и улучшает отладку при ошибках. Так что ваши траблы мне пока малопонятны.
0
|
||||||||
|
4 / 4 / 2
Регистрация: 04.04.2015
Сообщений: 186
|
|
| 06.04.2018, 22:57 [ТС] | |
|
Как можно поймать и ошибку raise asyncio.TimeoutError from None
concurrent.futures._base.TimeoutError Кликните здесь для просмотра всего текста
Traceback (most recent call last):
File "D:/Учеба/Диплом/parsers/smartphone/test7.py", line 144, in <module> event_loop.run_until_complete(main(url_s elect_city)) File "C:\ProgramData\Anaconda3\lib\asyncio\ba se_events.py", line 467, in run_until_complete return future.result() File "D:/Учеба/Диплом/parsers/smartphone/test7.py", line 116, in main item= item.result() File "D:/Учеба/Диплом/parsers/smartphone/test7.py", line 70, in parse_list_object r=await request(client,url) File "D:/Учеба/Диплом/parsers/smartphone/test7.py", line 16, in request async with client.get(url) as r: File "C:\ProgramData\Anaconda3\lib\site-packages\aiohttp\client.py", line 783, in __aenter__ self._resp = await self._coro File "C:\ProgramData\Anaconda3\lib\site-packages\aiohttp\client.py", line 333, in _request await resp.start(conn, read_until_eof) File "C:\ProgramData\Anaconda3\lib\site-packages\aiohttp\client_reqrep.py", line 708, in start self._continue = None File "C:\ProgramData\Anaconda3\lib\site-packages\aiohttp\helpers.py", line 670, in __exit__ raise asyncio.TimeoutError from None concurrent.futures._base.TimeoutError 2018-04-07 00:47:33,206 ERROR:Task exception was never retrieved future: <Task finished coro=<parse_list_object() done, defined at D:/Учеба/Диплом/parsers/smartphone/test7.py:66> exception=TimeoutError()>
0
|
|
|
|
|
| 07.04.2018, 01:06 | |
|
Ошибка возникает на строке item= item.result()
Возможно ловить нужно там. Кстати, незавершенные задания будут находиться во втором списке - pending. Добавлено через 8 минут Хотя, не уверен - обработка ошибок в асинхронных корутинах не совсем тривиальная задача
0
|
|
|
|
|||
| 07.04.2018, 11:02 | |||
|
Поэтому я и говорю что нет смысла распараллеливать парсинг с помощью этих потоков. Добавлено через 38 секунд
0
|
|||
|
|
||||
| 07.04.2018, 13:49 | ||||
|
P.S. Если не в курсе - даже lxml отпускает GIL - достаточно глянуть исходник или прочитать в документации это:
А про задачи IO уже давно было сказано - они ОТПУСКАЮТ GIL, когда погружаются в состояние ожидания.
0
|
||||
|
|
||||
| 07.04.2018, 14:02 | ||||
|
Добавлено через 1 минуту Какая то либо библиотека(или место в коде) не будет отпускать и это может стать узким горлышком.
0
|
||||
|
|
|||||||
| 07.04.2018, 19:52 | |||||||
|
На самом деле есть: Semaphore, который принимает как параметр число "одновременно" выполняющихся корутин.
И Светлов как-то не сильно эту тему освещает.
0
|
|||||||
|
4 / 4 / 2
Регистрация: 04.04.2015
Сообщений: 186
|
||
| 08.04.2018, 21:52 [ТС] | ||
|
Добавлено через 1 минуту Как думаете стоит так сделать?http://skipperkongen.dk/2016/0... d-asyncio/ Судя по опыту внутри Async находится пул, максимум 5 запросов одновременно делает? или я не так понял
0
|
||
|
|
||
| 09.04.2018, 15:08 | ||
|
0
|
||
|
4 / 4 / 2
Регистрация: 04.04.2015
Сообщений: 186
|
|||||||||||
| 13.04.2018, 12:35 [ТС] | |||||||||||
|
У меня почему то request+threedpoolexecutor в 10 потоков выполняется в 2 раза быстрее чем async с семафором 10
Добавлено через 1 минуту request
async
0
|
|||||||||||
|
4 / 4 / 2
Регистрация: 04.04.2015
Сообщений: 186
|
||
| 13.04.2018, 12:42 [ТС] | ||
|
async 1134 против request+threedPool 590
Добавлено через 2 минуты
0
|
||
|
4 / 4 / 2
Регистрация: 04.04.2015
Сообщений: 186
|
||
| 13.04.2018, 13:09 [ТС] | ||
|
Также и async мы отправляем 10 запросов одновременно, и парсим по мере получения запроса. Так что можно уверять что и тут одновременно 10 запросов в серверу. Но способ с потоками в 2 раза быстрее чем, с async, хотя Garry Galler утвержает что использование async быстрее
0
|
||
|
║XLR8║
|
||
| 13.04.2018, 15:27 | ||
asyncio в разы быстрее 2х поточной работы с медленными устройствами\сетью. Но нужно понимать одно, выигрыишь не с скорости получения данных, а в том есть есть возможность полностью загрузить канал данными открыв 100500 соединение, не дожидаясь пока мы получим ответ он предыдущих 100499. Вот за счет чего получается быстрее. Если отправлять 2 запроса всего - смысла город городить нету.
0
|
||
|
4 / 4 / 2
Регистрация: 04.04.2015
Сообщений: 186
|
||
| 13.04.2018, 15:35 [ТС] | ||
|
Добавлено через 1 минуту А возможно ли сохранить результат запроса? Идея такая: сначала получаем результаты запросов, а потом потоками обрабатываем эти страницы? По идее же быстрее должно быть
0
|
||
|
║XLR8║
|
||
| 13.04.2018, 15:38 | ||
|
В противном случае обычное однопоточное приложение - в самый раз. Еще, я бы сделал немного не так. Сначала выкачал данные, а потом замерял время на парсинг. Смысл задержки сети в время парсинга засовывать?
0
|
||
|
4 / 4 / 2
Регистрация: 04.04.2015
Сообщений: 186
|
|||
| 13.04.2018, 15:42 [ТС] | |||
|
Добавлено через 1 минуту Добавлено через 26 секунд Можно сказать погрешность
0
|
|||
| 13.04.2018, 15:42 | |
|
В чем проблема? (Beautiful Soup) Парсинг Beautiful Soup 4 и Selenium.Webdriver Beautiful Soup - существует ли ограничения на длину получаемых данных? Извлечь атрибуты a href и img src одновременно, используя Beautiful Soup Как убрать soup = BeautifulSoup (html) из кода? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . .
Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
|
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг.
Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует.
В процессе разработки. . .
|
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
|
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации:
1. Вернуть возможность использования знаков | 1 l I;. . .
|
|
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С.
Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
|
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию?
Фраза «Любая достаточно развитая технология неотличима от магии». . .
|
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль?
Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
|
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология.
«Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
|