Как ускорить парсер на python
Перейти к содержимому

Как ускорить парсер на python

  • автор:

Как ускорить парсинг на Python?

Добрый вечер, тостерчане! Захотелось в научных целях пропарсить башорг, ithappens и задолбали. Написал банальный парсер на bs4, скорость при 4 потоках 10 постов в секунду. Сеть 100Мбит (Монреаль). Пинг до башорга 82ms. Time показывает скорость загрузки страницы в одном потоке за 365ms. При таком раскладе, только на башорг уйдет около суток. Есть ли способы ускорить процесс?

  • Вопрос задан более трёх лет назад
  • 2390 просмотров

Комментировать
Решения вопроса 1

sim3x

Парсинг вам не нужно ускорять
Вам нужно ускорить граббинг
А ускорить его можно если сделать кеширующий днс поближе, сам граббер разместить поближе к хосту донору

И если парсинг сделать на lxml, то и ускорять там уже нечего — он и так на Си написан

Ответ написан более трёх лет назад
Комментировать
Нравится 3 Комментировать
Ответы на вопрос 3

если используете только многопоточность, то можно запускать по 20-40 потоков или больше если процессор позволяет.
увеличивайте число потоков пока не нагрузите 100Мбит или процессор

Ответ написан более трёх лет назад
Комментировать
Нравится 1 Комментировать
Скачайте сайты многопоточной качалкой (типа winhttrack) и парсите уже со своего диска
Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать

башорг 1300+ страниц, выкачивается достаточно быстро, а дальше простой простой разбор. Также и с остальными сайтами.

Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

python

  • Python
  • +1 ещё

Error Connecting: HTTPSConnectionPool(host=’url’, port=443) как решить?

  • 1 подписчик
  • час назад
  • 7 просмотров

Как ускорить парсер на python

Бюджет: ожидает предложений

Срок: по договоренности

Есть парсер на пайтон с обходом CloudFlare через сторонний сервис, проблема в том, что этот сервис отправляет ответ на гет запрос в течении минуты, а запросов около одиннадцати, даже с асинхронностью время работы получается 4 минуты, нужно либо изменить способ обхода, либо как то подправить код, чтобы время работы не занимало больше минуты.

Опубликован:

08.02.2023 | 11:00 [поднят: 08.02.2023 | 11:00] [последние изменения: 08.02.2023 | 11:03]

Заказ находится в архиве

Теги: Специалисты по парсингу, недорого, FL.ru

© FL.ru, 2005 – 2024

© FL.ru, 2005 – 2024

Наши партнеры

Сведения об ООО «Ваан» внесены в реестр аккредитованных организаций, осуществляющих деятельность в области информационных технологий. ООО «Ваан» осуществляет деятельность, связанную с использованием информационных технологий, по разработке компьютерного программного обеспечения, предоставлению доступа к программе для ЭВМ и является правообладателем программы для ЭВМ «Платформа FL.ru (версия 2.0)».

Продолжая пользоваться сайтом, вы соглашаетесь с условиями использования файлов cookie

Как ускорить парсинг python

Всем привет. Я пишу бота для тг. И суть его в том, что присылаются породы кроликов и потом присылаются выбранные (например, выбрал породу минилоп, и все представители этой породы берутся с сайта). Берется картинка, порода, цена и есть ли скидка. Присылается первый кролик, потом по кнопке второй и т.д. Я заметил, что сбор данных очень долгий (1.67 сек). При нажатии на кнопку у меня заново все парсится, и поэтому все работает не очень плавно. Как можно его ускорить?

from bs4 import BeautifulSoup from datetime import timedelta, datetime from collections import namedtuple import requests import time class Parser: """ Class Parser use for parsing info about rabbits General use - take info from div tag with class 'product-wrapper' Note: Web-site: https://tsarskiykrolik.com/ Methods: -------------------- get_hours_from_td(data: datetime.timedelta) - Returns hours from timedelta convert_hours_to_word(hour: int) - Changes the ending of a word for correct form convert_days_to_word(day: int) - Changes the ending of a word for correct form parse_date(str_date: str) - Converts str date to datetime type format_datetime(date: datetime.timedelta) - Returns a string with the number of days and hours until the end of the discount parse(breed: str) - Returns a list of namedtuple with information about rabbits """ def __init__(self): pass @staticmethod def get_hours_from_td(date: timedelta) -> int: """Returns hours from timedelta""" return date.seconds // 3600 @staticmethod def convert_hours_to_word(hour: int) -> str: """Returns correct ending of a word(час/часа/часов)""" if hour str: """Returns correct ending of a word(день, дня, дней)""" if day == 1: return 'день' elif 2 datetime: """Returns date at datetime type""" return datetime.strptime(str_date, '%Y-%m-%d %H:%M:%S') def format_datetime(self, date: timedelta) -> str: """Returns a string with the number of days and hours until the end of the discount. If days until the end of discount less 0, only the hours are returned""" time_end = (date.days, self.get_hours_from_td(date)) if time_end[0] == 0 and time_end[1] > 0: # if days < 0 return f'' else: return f'  и ' @staticmethod def get_url(breed: str) -> str: """Takes breed of the rabbit and returns url of them""" return f'https://tsarskiykrolik.com/product-category/kroliki/?filter_poroda=' def parse(self, breed: str) -> list[namedtuple]: """Takes breed from user(inline-button) and parse info about it from site. The Exception is raised if no discount in block""" url = self.get_url(breed) page = requests.get(url) soup = BeautifulSoup(page.text, 'html.parser') products = soup.find_all('div', class_='product-wrapper') res = [] for block in products: breed = block.find('h3').text.strip() price = block.find('span', class_='price').text.split() img_url = block.find('img').get('data-srcset').split(', ')[0][:-4] more_info = block.find('h3').find('a')['href'] end_discount = timedelta(days=0, hours=0) time_to_end = timedelta(days=0, hours=0) try: end_discount = ( self.parse_date( block.find( 'div', class_='wd-product-countdown wd-timer woodmart-product-countdown woodmart-timer').attrs[ 'data-end-date']) ) current_date = datetime.now() time_to_end = end_discount - current_date + timedelta(hours=3) except AttributeError: pass old_price = ''.join(price[:price.index('₽') + 1]) discount_price = ''.join(price[price.index('₽') + 1:]) Rabbit = namedtuple('Rabbit', 'breed, img_url, old_price, discount_price, time_to_disc_end, more_info') rabbit = Rabbit(breed, img_url, old_price, discount_price, self.format_datetime(time_to_end), more_info) res.append(rabbit) return res if __name__ == '__main__': a = Parser() start = time.monotonic() print(*a.parse('germelin'), sep='\n') print(time.monotonic() - start) 

Ускорить парсинг страницы

Author24 — интернет-сервис помощи студентам

Парсинг страницы
Здравствуйте! Столкнулся с такой проблемой, что не могу спарсить страницу. Я использовал.

Парсинг страницы
from urllib.request import urlopen from bs4 import BeautifulSoup import re def.

Парсинг html страницы
хочу сделать автоматическое скачивание файлов по ключевому слову на картинке есть кнопка которая.

Как ускорить загрузку страницы?
У меня есть страница где выводятся все категории ( всего их 146 ). class.

Парсинг страницы
Добрый вечер) Может кто подсказать. Я пытаюсь вытащить из страницы вот этот тег: <dd.

Эксперт Python

5417 / 3841 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1

ЦитатаСообщение от Dave_ Посмотреть сообщение

можно ли ускорить вышеупомянутый код

Сферический код в вакууме не ускоряется.
Ваше время может быть по большей части RTT (round-trip time), лагом сети.
Не зная сайта к которому вы обращаетесь и не зная кода ваших дальнейших действий, нельзя сказать более определенно.

Регистрация: 06.03.2015
Сообщений: 209

Согласен, сайт грузится долго, но мне нужен именно он. Для того, что бы было понятнее, дам такой код:

1 2 3 4 5 6 7 8 9 10 11 12 13
from bs4 import BeautifulSoup from urllib.request import Request, urlopen from itertools import groupby import timeit def test(): site= "https://www.cyberforum.ru/python-web/thread2571323.html#post14181443" hdr = {'User-Agent': 'Mozilla/5.0'} req = Request(site,headers=hdr) page = urlopen(req) b = BeautifulSoup(page, "html.parser") print(timeit.timeit("test()", setup="from __main__ import test", number=1)) # 0.9953085569941322 секунд

Вопрос: можно ли ускорить конкретно этот код? Возможно заменить библиотеку urllib на какую-то другую, более быструю.

Эксперт Python

5417 / 3841 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1

ЦитатаСообщение от Dave_ Посмотреть сообщение

Возможно заменить библиотеку urllib на какую-то другую, более быструю

Разницы не будет. Загрузка сайта зависит от сайта. Он не отдаст ресурсы быстрее, чем может.
Кроме того, ваша сеть через которую вы работаете, также вкладывает свою долю в лаг. И это тоже никак не регулируется библиотекой.

Все что вы можете сделать — использовать сессии для многократного обращения к сайту. Это немного прибавит производительности в случае многократных запросов.
Также вы можете использовать асинхронный подход, который даст экономию на ожидании ответа при многократных запросах.
Единичный запрос вы ничем не ускорите. Разве что физически переместитесь к серверу на котором находится сайт 🙂

Просто Лис

Эксперт Python

5442 / 3362 / 1024
Регистрация: 17.05.2012
Сообщений: 9,848
Записей в блоге: 9

Смотря что тормозит. Несколько наиболее вероятных вариантов:
1) медленный парсинг. Мне помогло заменить «html.parser» на lxml.
2) долгая установка соединения. Используйте сессии. Первый запрос будет таким же медленным, остальные быстрее за счёт переиспользования соединения.

ЦитатаСообщение от Garry Galler Посмотреть сообщение

Единичный запрос вы ничем не ускорите. Разве что физически переместитесь к серверу на котором находится сайт 🙂

Это даст ускорение на пару десятков-сотен мс А сайт может тратить секунды на обработку запроса.

Эксперт Python

5417 / 3841 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1

ЦитатаСообщение от Рыжий Лис Посмотреть сообщение

Смотря что тормозит

киберфорум. Он же его запрашивает. И это правда — киберфорум тормозит. Временами.
Вот, например, сейчас (пока не вечер), вроде все в пределах (хотя тоже не быстро):

>>> timeit.timeit('requests.get("https://www.cyberforum.ru/python-web/thread2571323.html#post14181443")',number=1,globals=globals()) 0.5732464929999992

А вчера страницы в браузере по 3 секунды грузились.
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Парсинг страницы
Здравствуйте! Есть проблема с получением информации с сайта. Отрывок кода страницы: <div.

Парсинг страницы
Здравствуйте,требуется написать программу на языке Python , которая парсит с сайта "Викисловарь".

Разметка страницы. Парсинг
Браузер понимает, как и что нужно отображать на web-странице, потому что эти страницы написаны.

Парсинг json страницы
Доброй ночи. Есть json страница. Как её прочитать не скачивая и вывести оттуда значение ключа.

Парсинг html страницы
Лаборатория 1. Осуществить ввод адреса Интернет-страницы. 2. Осуществить поиск всех изображений.

Парсинг html страницы
Здравствуйте. Есть видео где мужик парсит html страницу и далее заносит все ссылки которые нашёл.

Или воспользуйтесь поиском по форуму:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *