|
4 / 4 / 2
Регистрация: 04.04.2015
Сообщений: 186
|
||||||
Beautiful Soup 4, сравнение html-парсеров при запуске в потоке04.04.2018, 21:03. Показов 7562. Ответов 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) из кода? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|
|
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
|
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
|
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ
Основная суть и тезисы по измерениям:
0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема.
Объект не может перемещаться в 0D.
1D (Первое измерение):. . .
|