|
4 / 4 / 2
Регистрация: 04.04.2015
Сообщений: 186
|
||||||
Beautiful Soup 4, сравнение html-парсеров при запуске в потоке04.04.2018, 21:03. Показов 7052. Ответов 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 | |
|
Помогаю со студенческими работами здесь
40
В чем проблема? (Beautiful Soup) Парсинг Beautiful Soup 4 и Selenium.Webdriver Beautiful Soup - существует ли ограничения на длину получаемых данных? Извлечь атрибуты a href и img src одновременно, используя Beautiful Soup Как убрать soup = BeautifulSoup (html) из кода? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|