Веб-сканирование с использованием поиска в ширину на указанной глубине
Веб-скрапинг сегодня широко используется во многих промышленных приложениях. Будь то в области понимания естественного языка или анализа данных, сбор данных с веб-сайтов является одним из основных аспектов многих таких приложений. Сбор данных с веб-сайтов - это извлечение большого количества контекстных текстов из набора веб-сайтов для различных целей. Этот проект также можно расширить для дальнейшего использования, например, для обобщения текста на основе темы или темы, извлечения новостей с новостных веб-сайтов, извлечения изображений для обучения модели и т. Д.
Используемые библиотеки:
Для начала давайте обсудим несколько библиотек, которые мы собираемся использовать в этом проекте.
- запросы: это библиотека для очень простой отправки запросов HTTP 1.1. Используя метод requests.get, мы можем извлечь HTML-содержимое URL-адреса.
- urlparse: он предоставляет стандартный интерфейс для разбивки URL-адреса на различные компоненты, такие как расположение в сети, схема адресации, путь и т. д.
- urljoin: позволяет нам объединить базовый URL-адрес с относительным URL-адресом для формирования абсолютного URL-адреса.
- beautifulsoup: это библиотека Python для извлечения данных из файлов HTML и XML. Мы можем преобразовать HTML-страницу в объект beautifulsoup, а затем извлечь HTML-теги вместе с их содержимым.
Установка:
Далее мы обсудим, как установить эти библиотеки. Обратите внимание: если в вашей системе установлен pip3 , вам нужно использовать pip3 вместо pip.
pip install requests pip install bs4
Функции:
Далее давайте обсудим различные аспекты и особенности проекта.
- Учитывая входной URL-адрес и глубину, до которой сканер должен сканировать, мы извлечем все URL-адреса и распределим их по внутренним и внешним URL-адресам.
- Внутренние URL-адреса - это те, которые имеют то же доменное имя, что и входной URL. Внешние URL-адреса - это те, которые имеют другое доменное имя, чем у заданного входного URL-адреса.
- Проверяем достоверность извлеченных URL. Если URL-адрес имеет допустимую структуру, он считается только тогда.
- Глубина 0 означает, что печатается только входной URL. Глубина 1 означает, что печатаются все URL-адреса внутри входного URL-адреса и так далее.
Подход:
- Сначала импортируем установленные библиотеки.
- Затем мы создаем два пустых набора с именами internal_links и external_links, которые будут хранить внутренние и внешние ссылки отдельно и гарантировать, что они не содержат дубликатов.
- Затем мы создаем метод под названием level_crawler, который принимает входной URL-адрес, сканирует его и отображает все внутренние и внешние ссылки, используя следующие шаги:
- Определите набор с именем url для временного хранения URL-адресов.
- Извлеките доменное имя URL- адреса с помощью библиотеки urlparse.
- Создайте объект beautifulsoup с помощью парсера HTML.
- Извлеките все теги привязки из объекта beautifulsoup.
- Получите теги href из тегов привязки и, если они пусты, не включайте их.
- Используя метод urljoin , создайте абсолютный URL.
- Проверьте правильность URL-адреса.
- Если URL-адрес действителен, а домен URL-адреса не входит в тег href и не входит в набор внешних ссылок, включите его в набор внешних ссылок.
- В противном случае добавьте его во внутренние ссылки, если его там нет, распечатайте и поместите во временный набор URL.
- Вернуть временный набор URL-адресов, который включает посещенные внутренние ссылки. Этот набор будет использован в дальнейшем.
- Если глубина равна 0, мы печатаем url как есть. Если глубина равна 1, мы вызываем метод level_crawler, определенный выше.
- В противном случае мы выполняем обход поиска в ширину (BFS) с учетом формирования страницы URL как древовидной структуры. На первом уровне у нас есть входной URL. На следующем уровне у нас есть все URL-адреса внутри входного URL-адреса и так далее.
- Мы создаем очередь и добавляем в нее входной URL. Затем мы вставляем URL-адрес и вставляем все URL- адреса внутри него в очередь. Мы делаем это до тех пор, пока все URL- адреса на определенном уровне не будут проанализированы. Мы повторяем процесс столько раз, сколько входная глубина.
Below is the complete program of the above approach:
Python3
# Import libraries from urllib.request import urljoin from bs4 import BeautifulSoup import requests from urllib.request import urlparse # Set for storing urls with same domain links_intern = set () depth = 1 # Set for storing urls with different domain links_extern = set () # Method for crawling a url at next level def level_crawler(input_url): temp_urls = set () current_url_domain = urlparse(input_url).netloc # Creates beautiful soup object to extract html tags beautiful_soup_object = BeautifulSoup( requests.get(input_url).content, "lxml" ) # Access all anchor tags from input # url page and divide them into internal # and external categories for anchor in beautiful_soup_object.findAll( "a" ): href = anchor.attrs.get( "href" ) if (href ! = "" or href ! = None ): href = urljoin(input_url, href) href_parsed = urlparse(href) href = href_parsed.scheme href + = "://" href + = href_parsed.netloc href + = href_parsed.path final_parsed_href = urlparse(href) is_valid = bool (final_parsed_href.scheme) and bool ( final_parsed_href.netloc) if is_valid: if current_url_domain not in href and href not in links_extern: print ( "Extern - {}" . format (href)) links_extern.add(href) if current_url_domain in href and href not in links_intern: print ( "Intern - {}" . format (href)) links_intern.add(href) temp_urls.add(href) return temp_urls if (depth = = 0 ): print ( "Intern - {}" . format (input_url)) elif (depth = = 1 ): level_crawler(input_url) else : # We have used a BFS approach # considering the structure as # a tree. It uses a queue based # approach to traverse # links upto a particular depth. queue = [] queue.append(input_url) for j in range (depth): for count in range ( len (queue)): url = queue.pop( 0 ) urls = level_crawler(url) for i in urls: queue.append(i) |
Вход:
url = "https://www.geeksforgeeks.org/machine-learning/" глубина = 1
Выход:
Внимание компьютерщик! Укрепите свои основы с помощью базового курса программирования Python и изучите основы.
Для начала подготовьтесь к собеседованию. Расширьте свои концепции структур данных с помощью курса Python DS. А чтобы начать свое путешествие по машинному обучению, присоединяйтесь к курсу Машинное обучение - базовый уровень.