Как ускорить парсинг 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)
Многопоточный парсинг на Python

В этой статье я расскажу, как значительно ускорить парсинг сайта. Те, кто изучил парсинг и начал применять его на практике приходят к такому моменту как ожидание окончания работы парсера, в особенности, когда объем данных высок. На скорость работы влияет множество параметров, один из них — это время ответа сервера, т.к. серверу нужно время чтобы обработать информацию.
В статье я опишу один из способов борьбы с этой проблемой.
Использоваться будет библиотека «concurrent.futures». Использовать «concurrent» нужно умеренно, не стоит устраивать «DDoS» атаку на сайт.
Для создания многопотока ничего мудрёного делать не придётся, код очень прост и понятен. После установки импортируем библиотеки. Добавлены 2 дополнительные библиотеки, это «tqdm» индикатор процесса и «pandas» для создания датафрейма.
import requests import pandas as pd from tqdm import tqdm import concurrent.futures
Прописываем «headers» в request запросы, создаем сессию, объявляем функцию отправки запросов
headers = < 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36' >TIMEOUT = 10 session = requests.Session() session.headers = headers def load_url(url): answer = requests.get(url, headers=headers, timeout=TIMEOUT) return [url, answer.text]
Создаем датафрейм со списком «url» из файла «test.xlsx». Для тестирования берем только первые 2000 записей
df = pd.read_excel('test.xlsx') df.head()
| Index | source.objectHrefTerm |
| 0 | https://test.ru/PurchaseView/43/0/0/705675 |
| 1 | https://test.ru/PurchaseView/30/0/0/705663 |
| 2 | https://test.ru/PurchaseView/43/0/0/705661 |
| 3 | https://test.ru/PurchaseView/30/0/0/705653 |
| 4 | https://test.ru/PurchaseView/20/0/0/705300 |
urls = list(df['source.objectHrefTerm'])[:2000]
Вначале протестируем время выгрузки одним потоком
out = [] for url in tqdm(urls): out.append(load_url(url))

Прогресс-бар показывает скорость выполнения — 2 минуты и 21 секунду. Среднее количество запросов в секунду — 14.15.
Теперь сделаем те же 2000 запросов, используя concurrent.futures и 2 потока. Изменяется только параметр CONNECTIONS
out = [] CONNECTIONS = 2 with concurrent.futures.ThreadPoolExecutor(max_workers=CONNECTIONS) as executor: future_to_url = (executor.submit(load_url, url) for url in urls) for future in tqdm(concurrent.futures.as_completed(future_to_url), total=len(urls)): try: data = future.result() except Exception as exc: data = str(type(exc)) finally: out.append(data)

Прогресс-бар показал скорость выполнения 1 минута и 16 секунд. В среднем 26.06 запроса в секунду.
Наблюдается уже значительное увеличение скорости. Попробуем использовать 5 потоков.
out = [] CONNECTIONS = 5

Скорость парсера увеличилась почти в 5 раз.
При использовании большего количества потоков не на все запросы приходили ответы либо на время блокировался ip адрес.
Многопоточный парсинг позволяет нам выполнять работу быстрее, в нашем случае ускорение работы достигло 4,85 раз, что дает существенную экономию времени в больших пулах запросов.
Как ускорить парсер на 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, который собирает информацию об идентификаторах счетчиков аналитики Google Tag Manager, Universal Analytics, Google Analytics 4, Яндекс.Метрики на сайтах и конкретных веб-страницах в отдельный файл.
Как это работает?
Парсинг — процесс автоматизированного сбора и систематизации данных. Его проводят с помощью программ, которые называются парсерами. Как правило, парсер — сервис или скрипт, который собирает данные с указанных веб-ресурсов, анализирует их и выдает результат в нужном вам формате. Парсинг нужен, чтобы ускорить рутинную работу.
Нижеприведенный код позволяет автоматически собирать идентификаторы счетчиков аналитики Google Tag Manager, Universal Analytics, Google Analytics 4, Яндекс.Метрики в отдельный список, который вы зададите в обычном .txt файле, имитируя заходы пользователя на сайты с помощью вашего браузера Google Chrome (его наличие на вашем компьютере обязательно!).
Вот так выглядит результат выполнения программы — отдельный файл, который можно открыть в обычном Microsoft Excel и посмотреть все:

Результат парсинга (пример для собственного списка сайтов)
Это позволит вам быстро проверить наличие указанных счетчиков на нужных страницах и сайтах, включая ваших конкурентов.
Как использовать скрипт?
Для этого вам необходимо выполнить несколько шагов:
- установить программу Visual Studio;
- создать проект;
- установить необходимые библиотеки из файла;
- подготовить список нужных сайтов и веб-страниц;
- скопировать код и вставить его к себе;
- запустить код и получить результат.
Рассмотрим каждый шаг запуска парсера подробнее.
Примечание: если вы разбираетесь в программировании, то вы можете использовать интегрированную среду разработки (IDE), отличную от представленной ниже. Однако в случае возникновения каких-либо проблем с запуском парсинга и последующих ошибок в программе вам придется самостоятельно искать решения.
Установка программы Visual Studio
Для этого перейдите по ссылке и скачайте дистрибутив Visual Studio под вашу операционную систему (для Windows или Mac). Скачивайте именно Visual Studio, а не Visual Studio Code. Используйте версию Community:

Скачивание программы Visual Studio
Запустив программу, Visual Studio Installer начнет процесс установки. Нажмите кнопку Продолжить:

Visual Studio Installer
Программа начнет устанавливаться:

Скачивание и установка
В открывшемся окне поставьте галочку рядом с Разработка на Python и нажмите Установить:

Разработка на Python — Установить
Visual Studio Installer начнет устанавливать выбранные продукты программы и пакеты:

Установка выбранных продуктов
По завершении вам предложат войти в Visual Studio. Создать учетную запись можно потом. Для упрощения запуска программы пропустите этот шаг:

Пропустить в этот раз
Параметры разработки оставьте без изменений (Общие), а цветовую схему программы можете поменять в зависимости от собственных предпочтений. Нажмите Запустить Visual Studio:

Запуск Visual Studio
Создание проекта
В открывшемся окне программы выберите вариант Создание проекта:

Создание нового проекта в Visual Studio
На следующем этапе выберите Приложение Python и нажмите Далее:

В настройках проекта укажите его имя (например, IDTracker) и расположение (измените путь или оставьте по умолчанию), и в завершение нажмите Создать:

Имя проекта и расположение
После создания нового проекта в указанной директории вам откроется программа Visual Studio:

Интерфейс программы Visual Studio с выбранном темой
На этом установка Visual Studio и создание проекта завершены.
Установка необходимых библиотек из файла
Скрипт-парсер писался на конкретных версиях библиотек Python (не последних!), поэтому вам нужно установить определенный набор пакет с нужными версиями. Для этого скачайте файл .txt по ссылке и добавьте его в свой проект по тому пути, который вы указали на предыдущем шаге при создании проекта. Для моего примера это путь C:\. \source\repos\IDTracker\IDTracker:

Файл requirements.txt в папке проекта
Перезапустите программу Visual Studio, открыв свой проект. Вы должны увидеть строку такого типа: В проекте «ваш_проект» обнаружен файл спецификации пакета Python «requirements.txt», а рядом будет ссылка на создание виртуальное среды. Нажмите на нее:

Создание виртуальной среды
Проверьте, чтобы по пути установки пакетов из файла был указан именно тот путь, куда вы поместили скачанный файл requirements.txt. Затем нажмите кнопку Создать:

В обозревателе решений (справа) в вашем проекте вы увидите новое окружение Python — env (виртуальную среду):

Новая виртуальная среда
У вас должна начаться автоматическая загрузка всех пакетов, включая тех, что указаны в файле requirements.txt, с нужными версиями. Когда это действие будет завершено, в своем обозревателе решений для созданной виртуальной среды вы увидите все установленные библиотеки:

Установленные библиотеки (часть)
Если автоматическая установка не началась, вы можете запустить ее вручную, нажав на виртуальную среду правой кнопкой мыши, а затем выбрав меню Установить из requirements.txt:

Установить из requirements.txt
Как я писал выше, парсер писался на конкретных версиях библиотек Python, поэтому вам нужно установить определенный набор пакет с нужными версиями. Если вы используете глобальную среду и в ней уже установлены схожие библиотеки, только других версий, вам нужно использовать отдельную виртуальную среду и установить в нее библиотеки с версиями из requirements.txt. Иначе вы не сможете запустить данный код.
Подготовка списка нужных сайтов и веб-страниц
Теперь создайте обычный файл .txt и добавьте в него список нужных сайтов и веб-страниц, с которых вы хотите парсить информацию об идентификаторах счетчиков аналитики. Каждая ссылка или домен сайта задается на отдельной строке, протокол https или http можно не использовать. Например, ваш файл может выглядеть так:

Пример списка сайтов и веб-страниц для парсинга
Сохраните ваш файл, задав ему имя (например, sites.txt), и поместите в ту же папку проекта, что и файл requirements.txt:

Файл со списком сайтов в папке проекта
В Visual Studio вы увидите этот файл в папке проекта, переключившись между решениями и доступными представлениям (отображение папок):

Обозреватель решений — представление папок
На этом подготовительные работы для парсинга закончены. Теперь переходим к самой программе!
Копирование кода программы
Скачайте файл программы по ссылке, откройте любым текстовым редактором (блокнотом или Notepad++) и скопируйте все его содержимое:

Копирование кода программы
Вернитесь в свой проект Visual Studio и откройте ваш файл .py. Вставьте в него весь скопированный код:

Копирование кода в файл проекта Visual Studio
В этой программе вам нужно изменить несколько строчек кода. Во-первых, найдите код:
userData = «—user-data-dir=C:\\Users\\mi\\AppData\\Local\\Google\\Chrome\\User Data» ;
#Прописать путь к UserData Chrome, например «—user-data-dir=C:\\Users\\UserName\\AppData\\Local\\Google\\Chrome\\User Data»
и в userData= добавьте путь к вашей папке User Data для браузера Google Chrome. Как правило, это директория со скрытой папкой App Data и путь для Windows имеет вид C:\Users\Имя_польхователя\AppData\Local\Google\Chrome\User Data\. Для пользователей Mac OS X и других операционных систем воспользуйтесь этой инструкцией. Формат написания должен быть именно такой, какой указан в примере, вместе с —user-data-dir и двумя косыми чертами вместо одной + кавычки с обеих сторон.

Путь к папке User Data (браузер Google Chrome)
А во-вторых, найдите в коде такие строки:
#Загрузка ссылок/сайтов из текстового файла
fileHandler = open ( «sites.txt» , «r» );
И проверьте, чтобы в скобках было написано точно такое же название файла со списком сайтов и веб-страниц, которое вы указали на предыдущем шаге.

Название файла со списком сайтов и веб-страниц
Если оно отличается от sites.txt — поменяйте его на свое. В завершение сохраните свою программу в кодировке UTF-8. Для этого в левом верхнем углу Visual Studio нажмите Файл — Сохранить проект как.

Файл — Сохранить проект как.
Рядом с кнопкой Сохранить нажмите на иконку со стрелочкой и выберите Сохранить с кодировкой:

Сохранить с кодировкой
В дополнительных параметрах выберите кодировку Юникод (UTF-8, с сигнатурой), кодовая страница 65001, а затем сохраните свою программу:

Юникод (UTF-8, с сигнатурой), кодовая страница 65001
После этого вы можете полностью закрыть Visual Studio, а затем повторно открыть свой проект.
Запуск парсера
После всех вышеописанных настроек вам осталось только запустить выполнение программы. Для этого в самом верху программы нажмите на кнопку Пуск:

Запуск парсера
- maxTries — максимальное количество попыток, которое плагин должен предпринять при отправке события на целевой URL-адрес;
- longSearch — (False — быстро, True — медленно);
Чем больше у вас список сайтов и веб-страниц, тем дольше программа будет парсить идентификаторы. Среднее время обхода одной страницы сайта ~ 30 секунд, однако в некоторых случаях это время может быть больше. Поэтому парсинг лучше запускать в свободное от работы время, когда вы не находитесь за компьютером или же выполняете простые задачи (читаете новости, сидите в социальных сетях и т.д.). Просто запустите код в фоновом режиме и смело идите пить чай/кофе!
Результат парсинга
После прохода по всем ссылкам браузер автоматически закроется, а в папке с проектом появится новый файл с названием table.csv:

Файл с результатами парсинга
Открыв его в Excel, вы можете разбить текст по столбцам, указав в качестве разделителя запятую:

Текст по столбцам с разделителем «запятая»
Выполнив данную функцию, вы получите результат в виде таблице с данными по каждой ссылке и идентификатору:

Таблица с данными парсинга
Не забудьте, что парсинг — это автоматический процесс, но даже для него нужны определенные условия. В одном случае вы можете запустить программу и увидите идентификаторы для всех счетчиков, а при повторном запуске скрипта где-то чего-то не будет хватать, даже для тех же самых сайтов и веб-страниц. В этом случае я рекомендую менять переменные maxTries (задать большее значение, например 5-7) и longSearch (True). Скорость парсинга снизится, но результат будет лучше!