Rastreo web usando Breadth First Search a una profundidad específica

Hoy en día, el web scraping se utiliza ampliamente en muchas aplicaciones industriales. Ya sea en el campo de la comprensión del lenguaje natural o del análisis de datos, el raspado de datos de sitios web es uno de los aspectos principales de muchas de estas aplicaciones. El raspado de datos de sitios web consiste en extraer una gran cantidad de textos contextuales de un conjunto de sitios web para diferentes usos. Este proyecto también se puede ampliar para un uso posterior, como resúmenes de texto basados ​​en temas o temas, extracción de noticias de sitios web de noticias, extracción de imágenes para entrenar un modelo, etc.

Bibliotecas utilizadas:

Para empezar, analicemos las diversas bibliotecas que vamos a utilizar en este proyecto.

  • requests:  Es una biblioteca para enviar requests HTTP 1.1 muy fácilmente. Usando el método request.get, podemos extraer el contenido HTML de una URL.
  • urlparse: proporciona una interfaz estándar para dividir una URL en diferentes componentes, como la ubicación de la red, el esquema de direccionamiento, la ruta, etc.
  • urljoin: Nos permite unir una URL base con una URL relativa para formar una URL absoluta.
  • beautifulsoup: es una biblioteca de Python para extraer datos de archivos HTML y XML. Podemos convertir una página HTML en un objeto beautifulsoup y luego extraer etiquetas HTML junto con su contenido

Instalación:

A continuación, discutiremos cómo instalar estas bibliotecas. Tenga en cuenta que si tiene pip3 instalado en su sistema, debe usar pip3 en lugar de pip.

pip install requests
pip install bs4

Características:

A continuación, analicemos los diversos aspectos y características del proyecto.

  1. Dada una URL de entrada y una profundidad a la que el rastreador debe rastrear, extraeremos todas las URL y las clasificaremos en URL internas y externas.
  2. Las URL internas son aquellas que tienen el mismo nombre de dominio que la URL de entrada. Las URL externas son aquellas que tienen un nombre de dominio diferente al de la URL de entrada dada.
  3. Comprobamos la validez de las URL extraídas. Si la URL tiene una estructura válida, solo entonces se considera.
  4. Una profundidad de 0 significa que solo se imprime la URL de entrada. Una profundidad de 1 significa que todas las URL dentro de la URL de entrada se imprimen y así sucesivamente.

Acercarse:

  1. Primero importamos las bibliotecas instaladas.
  2. Luego, creamos dos conjuntos vacíos llamados enlaces_internos y enlaces_externos que almacenarán los enlaces internos y externos por separado y se asegurarán de que no contengan duplicados.
  3. Luego creamos un método llamado level_crawler que toma una URL de entrada y la rastrea y muestra todos los enlaces internos y externos siguiendo los siguientes pasos:
    • Defina un conjunto llamado url para almacenar temporalmente las URL.
    • Extraiga el nombre de dominio de la url usando la biblioteca urlparse .
    • Cree un objeto beautifulsoup usando un analizador HTML.
    • Extraiga todas las etiquetas de anclaje del objeto beautifulsoup .
    • Obtenga las etiquetas href de las etiquetas ancla y, si están vacías, no las incluya.
    • Usando el método urljoin , cree la URL absoluta.
    • Compruebe la validez de la URL.
    • Si la URL es válida y el dominio de la URL no está en la etiqueta href y no está en el conjunto de enlaces externos, inclúyalo en el conjunto de enlaces externos.
    • De lo contrario, agréguelo al conjunto de enlaces internos si no está allí e imprímalo y colóquelo en un conjunto de URL temporal .
    • Devuelve el conjunto de URL temporal que incluye los enlaces internos visitados. Este conjunto se utilizará más adelante.
  4. Si la profundidad es 0, imprimimos la url tal cual. Si la profundidad es 1, llamamos al método level_crawler definido anteriormente.
  5. De lo contrario, realizamos un recorrido de búsqueda en amplitud (BFS) que considera la formación de una página URL como estructura de árbol. En el primer nivel tenemos la URL de entrada. En el siguiente nivel, tenemos todas las URL dentro de la URL de entrada y así sucesivamente.
  6. Creamos una cola y le agregamos la URL de entrada . Luego hacemos aparecer una url e insertamos todas las url dentro de ella en la cola. Hacemos esto hasta que no se analicen todas las URL en un nivel particular. Repetimos el proceso tantas veces como la profundidad de entrada.

A continuación se muestra el programa completo del enfoque anterior:

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()
input_url = "https://www.geeksforgeeks.org/machine-learning/"
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)

Aporte:

url = "https://www.geeksforgeeks.org/machine-learning/"
depth = 1

Producción:

python-bfs-web-scrape

python-bfs-web-scrape

Publicación traducida automáticamente

Artículo escrito por iamrj846 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *