Веб-сканирование с использованием поиска в ширину на указанной глубине

Опубликовано: 20 Марта, 2022

Веб-скрапинг сегодня широко используется во многих промышленных приложениях. Будь то в области понимания естественного языка или анализа данных, сбор данных с веб-сайтов является одним из основных аспектов многих таких приложений. Сбор данных с веб-сайтов - это извлечение большого количества контекстных текстов из набора веб-сайтов для различных целей. Этот проект также можно расширить для дальнейшего использования, например, для обобщения текста на основе темы или темы, извлечения новостей с новостных веб-сайтов, извлечения изображений для обучения модели и т. Д.

Используемые библиотеки:

Для начала давайте обсудим несколько библиотек, которые мы собираемся использовать в этом проекте.

  • запросы: это библиотека для очень простой отправки запросов 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

Функции:

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

  1. Учитывая входной URL-адрес и глубину, до которой сканер должен сканировать, мы извлечем все URL-адреса и распределим их по внутренним и внешним URL-адресам.
  2. Внутренние URL-адреса - это те, которые имеют то же доменное имя, что и входной URL. Внешние URL-адреса - это те, которые имеют другое доменное имя, чем у заданного входного URL-адреса.
  3. Проверяем достоверность извлеченных URL. Если URL-адрес имеет допустимую структуру, он считается только тогда.
  4. Глубина 0 означает, что печатается только входной URL. Глубина 1 означает, что печатаются все URL-адреса внутри входного URL-адреса и так далее.

Подход:

  1. Сначала импортируем установленные библиотеки.
  2. Затем мы создаем два пустых набора с именами internal_links и external_links, которые будут хранить внутренние и внешние ссылки отдельно и гарантировать, что они не содержат дубликатов.
  3. Затем мы создаем метод под названием level_crawler, который принимает входной URL-адрес, сканирует его и отображает все внутренние и внешние ссылки, используя следующие шаги:
    • Определите набор с именем url для временного хранения URL-адресов.
    • Извлеките доменное имя URL- адреса с помощью библиотеки urlparse.
    • Создайте объект beautifulsoup с помощью парсера HTML.
    • Извлеките все теги привязки из объекта beautifulsoup.
    • Получите теги href из тегов привязки и, если они пусты, не включайте их.
    • Используя метод urljoin , создайте абсолютный URL.
    • Проверьте правильность URL-адреса.
    • Если URL-адрес действителен, а домен URL-адреса не входит в тег href и не входит в набор внешних ссылок, включите его в набор внешних ссылок.
    • В противном случае добавьте его во внутренние ссылки, если его там нет, распечатайте и поместите во временный набор URL.
    • Вернуть временный набор URL-адресов, который включает посещенные внутренние ссылки. Этот набор будет использован в дальнейшем.
  4. Если глубина равна 0, мы печатаем url как есть. Если глубина равна 1, мы вызываем метод level_crawler, определенный выше.
  5. В противном случае мы выполняем обход поиска в ширину (BFS) с учетом формирования страницы URL как древовидной структуры. На первом уровне у нас есть входной URL. На следующем уровне у нас есть все URL-адреса внутри входного URL-адреса и так далее.
  6. Мы создаем очередь и добавляем в нее входной 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. А чтобы начать свое путешествие по машинному обучению, присоединяйтесь к курсу Машинное обучение - базовый уровень.