|
4 / 4 / 2
Регистрация: 04.04.2015
Сообщений: 186
|
||||||
Beautiful Soup 4, сравнение html-парсеров при запуске в потоке04.04.2018, 21:03. Показов 7323. Ответов 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) из кода? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта
Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
|
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром.
возможно получится прикрутить интерпретатор питон для кастомизации игровой логики.
что есть на текущий момент:. . .
|
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2.
Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
|
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
|
|
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2.
Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
|
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2.
Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом.
В. . .
|
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2.
Задача: отобразить спецтехнику, которая на данный момент находится в ремонте.
Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
|
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
|