Как создать многопоточный парсер веб-страниц на Python
Table Of Content
- **Необходимые библиотеки**
- **Постепенная реализация**
- **1. Импорт необходимых библиотек**
- 2. Создание основной программы и объекта класса MultiThreadedScraper с аргументом source_url
- **3. Реализация класса MultiThreadedScraper**
- **4. Парсинг всех URL-адресов на указанном исходном URL-адресе**
- **5. Создайте функцию scrap_pages, которая будет парсить необходимые данные**
- **6. Вызовите ThreadPoolExecutor для запуска парсера**
В этой статье мы научимся создавать простой многопоточный парсер с использованием 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, основанные на математической статистике