CoderCastrov logo
CoderCastrov
Python3

Как создать многопоточный парсер веб-страниц на Python

Как создать многопоточный парсер веб-страниц на Python
просмотров
3 мин чтение
#Python3

В этой статье мы научимся создавать простой многопоточный парсер с использованием Python и библиотеки Beautiful Soup.

Необходимые библиотеки

BeautifulSoup: BeautifulSoup - это библиотека Python, которая упрощает извлечение информации с любой веб-страницы. Она работает поверх парсера HTML или XML и предоставляет удобные способы для итерации, поиска и модификации дерева разбора. Чтобы установить эту библиотеку, введите следующую команду в IDE/терминал.

pip install beautifulsoup4

requests: Requests - это простая и элегантная библиотека для работы с HTTP. Она позволяет легко отправлять запросы HTTP/1.1.

pip install requests

Постепенная реализация

Мы будем следовать следующим шагам для создания многопоточного скрипта.

Давайте реализуем все эти шаги для создания скрипта.

1. Импорт необходимых библиотек

Сначала нам нужно импортировать все библиотеки, которые нам нужны для парсинга. Если вы используете Python3, у вас уже есть все библиотеки, кроме BeautifulSoup, requests. Так что, если вы еще не установили эти две библиотеки, вам нужно установить их с помощью указанных выше команд.

import requests
from bs4 import BeautifulSoup
import concurrent.futures
from urllib.parse import urljoin, urlparse

2. Создание основной программы и объекта класса MultiThreadedScraper с аргументом source_url

Создайте основную программу, а затем создайте объект класса MultiThreadedScraper с аргументом URL веб-сайта для парсинга. В этой основной функции, после создания объекта класса, нам нужно вызвать функцию scrap_urls(), которая парсит все URL-адреса, присутствующие на заданном URL.

После парсинга всех URL-адресов нам нужно вызвать функцию start_scraper(), чтобы парсить необходимые данные с использованием многопоточного подхода.

if __name__ == '__main__':
    cc = MultiThreadedScraper("https://www.kushalstudy.com/")
    cc.scrap_urls()
    cc.start_scraper()

3. Реализация класса MultiThreadedScraper

Давайте реализуем класс MultiThreadedScraper с некоторыми необходимыми членами данных.

class MultiThreadedScraper:

    def __init__(self, source_url):
        self.source_url = source_url
        self.root_url = '{}://{}'.format(urlparse(self.source_url).scheme,
                                 urlparse(self.source_url).netloc)
        self.all_urls = set([])
        self.total_threads = 5

В реализации класса выше у нас есть следующие члены данных класса.

  • source_url: Это URL, который мы передали из главной функции. Это основной URL, на котором находятся все URL для парсинга.
  • root_url: Это URL, который мы извлекли из source_url, если мы не передали базовый URL веб-сайта.
  • all_urls: Это массив URL, которые мы извлекли из source_url.
  • total_threads: Это общее количество потоков, которые будут выполняться параллельно. Мы использовали 5 потоков, но вы можете увеличить их по мере необходимости.

4. Парсинг всех URL-адресов на указанном исходном URL-адресе

def парсить_url(self):
        page_data = requests.get(self.исходный_url).content
        soup = BeautifulSoup(page_data, "lxml")

        все_url = soup.find_all("a", class_="wp-block-latest-posts__post-title", href=True)
        for ссылка in все_url:
            url = urljoin(self.корневой_url, ссылка['href'])
            self.все_url.add(url)

5. Создайте функцию scrap_pages, которая будет парсить необходимые данные

def scrap_pages(self, page_url):
        page_data = requests.get(page_url).content
        soup = BeautifulSoup(page_data, "lxml")

        # Извлечение заголовка
        blog_title = soup.find("h1", class_="entry-title").text.strip()

        print("URL: {}, Заголовок: {}".format(page_url, blog_title))
        print("*"*20)

В приведенном выше коде мы передаем page_url, который содержит все необходимые данные для парсинга. Мы открываем указанный URL с помощью библиотеки requests, а затем используем библиотеку BeautifulSoup для парсинга данных.

6. Вызовите ThreadPoolExecutor для запуска парсера

def start_scraper(self):
        # Параллельный парсинг содержимого URL
        with concurrent.futures.ThreadPoolExecutor(self.total_threads) as executor:
         executor.map(self.scrap_pages, self.all_urls)

Наконец, создайте функцию start_scraper, чтобы создать ThreadPoolExecutor и передать все URL, которые мы ранее спарсили.

Полный код приведен ниже.

<script src=”[https://gist.github.com/vilash99/e33380422cea059010a5d88d032c6cf0.js](https://gist.github.com/vilash99/e33380422cea059010a5d88d032c6cf0.js)”></script>

Когда вы запустите приведенный выше код, результат будет выглядеть следующим образом:

URL: https://www.kushalstudy.com/blog/what-is-raid-in-operating-systems/, Заголовок: Что такое RAID в операционных системах


URL: https://www.kushalstudy.com/blog/disk-scheduling-algorithms-in-operating-systems/, Заголовок: Алгоритмы планирования диска в операционных системах


URL: https://www.kushalstudy.com/blog/what-is-disk-cache-in-operating-systems/, Заголовок: Что такое кэш диска в операционных системах


URL: https://www.kushalstudy.com/blog/data-structures-programs-implementation-using-c/, Заголовок: Реализация программ структур данных с использованием C++


URL: https://www.kushalstudy.com/blog/io-buffering-disk-io-in-operating-systems/, Заголовок: Буферизация ввода-вывода и ввод-вывод диска в операционных системах


URL: https://www.kushalstudy.com/blog/what-is-memory-management-in-operating-system/, Заголовок: Что такое управление памятью в операционной системе


URL: https://www.kushalstudy.com/blog/simple-c-programs-based-on-discrete-mathematics/, Заголовок: Простые программы на C, основанные на дискретной математике


URL: https://www.kushalstudy.com/blog/memory-allocation-method-in-operating-systems/, Заголовок: Метод выделения памяти в операционных системах


URL: https://www.kushalstudy.com/blog/simple-c-programs-based-on-the-mathematical-statistics/, Заголовок: Простые программы на C, основанные на математической статистике