Extraer información de productos de Amazon usando Beautiful Soup

El raspado web es un método de extracción de datos que se utiliza exclusivamente para recopilar datos de sitios web. Es ampliamente utilizado para la extracción de datos o la recopilación de información valiosa de sitios web grandes. El raspado web también es útil para uso personal. Python contiene una biblioteca increíble llamada BeautifulSoup para permitir el web scraping. Lo usaremos para extraer información del producto y guardar los detalles en un archivo CSV.

En este artículo, se necesitan los siguientes requisitos previos.

url.txt: un archivo de texto con pocas URL de páginas de productos de Amazon para raspar

Id. de elemento: Necesitamos Id. de los objetos que deseamos raspar en la web. Lo cubriremos pronto…

Aquí, nuestro archivo de texto parece.

Módulo necesario e instalación:

BeautifulSoup: nuestro módulo principal contiene un método para acceder a una página web a través de HTTP.

pip install bs4

lxml : biblioteca de ayuda para procesar páginas web en lenguaje python.

pip install lxml

requests : hace que el proceso de envío de requests HTTP sea impecable. El resultado de la función

pip install requests

Acercarse:

  • Primero, vamos a importar nuestras bibliotecas requeridas.
  • Luego tomaremos la URL almacenada en nuestro archivo de texto.
  • Enviaremos la URL a nuestro objeto de sopa que luego extraerá información relevante de la URL dada
    en función de la identificación del elemento que le proporcionamos y la guardará en nuestro archivo CSV.

Echemos un vistazo al código. Veremos qué sucede en cada paso significativo.

Paso 1: Inicializando nuestro programa.

Importamos nuestra hermosa sopa y requests, creamos/abrimos un archivo CSV para guardar nuestros datos recopilados. Declaramos Header y agregamos un agente de usuario. Esto asegura que el sitio web de destino que vamos a raspar no considere el tráfico de nuestro programa como spam y finalmente sea bloqueado por ellos. Hay un montón de agentes de usuario disponibles aquí .

Python3

from bs4 import BeautifulSoup
import requests
 
File = open("out.csv", "a")
 
HEADERS = ({'User-Agent':
           'Mozilla/5.0 (X11; Linux x86_64)
                AppleWebKit/537.36 (KHTML, like Gecko)
                    Chrome/44.0.2403.157 Safari/537.36',
                           'Accept-Language': 'en-US, en;q=0.5'})
 
webpage = requests.get(URL, headers=HEADERS)
soup = BeautifulSoup(webpage.content, "lxml")

Paso 2: Recuperar ID de elementos.

Identificamos elementos al ver las páginas web representadas, pero no se puede decir lo mismo de nuestro script. Para identificar nuestro elemento de destino, tomaremos su ID de elemento y lo introduciremos en el script. 

Obtener la identificación de un elemento es bastante simple. Supongamos que necesito la identificación del elemento del nombre del producto, todo lo que tengo que hacer 

  1. Acceda a la URL e inspeccione el texto.
  2. En la consola, tomamos el texto junto a id=

copiar la identificación del elemento

Lo alimentamos a soup.find y convertimos la salida de la función en una string. Quitamos las comas de la string para que no interfiera con el formato de escritura intento-excepto CSV. 

Python3

try:
        title = soup.find("span",
                          attrs={"id": 'productTitle'})
       title_value = title.string
 
        title_string = title_value
                    .strip().replace(',', '')
           
except AttributeError:
 
        title_string = "NA"
 
        print("product Title = ", title_string)

Paso 3: guardar la información actual en un archivo de texto

Usamos nuestro objeto de archivo y escribimos la string que acabamos de capturar, y terminamos la string con una coma «,» para separar su columna cuando se interpreta en un formato CSV.

Python3

File.write(f"{title_string},")

Realizando los 2 pasos anteriores con todos los atributos que deseamos capturar de la web,
como el precio del artículo, la disponibilidad, etc.

Paso 4: Cerrar el archivo.

Python3

File.write(f"{available},\n")
 
# closing the file
File.close()

Mientras escribe el último bit de información, observe cómo agregamos «\n» para cambiar la línea. No hacerlo nos dará toda la información requerida en una fila muy larga. Cerramos el archivo usando File.close(). Esto es necesario, si no lo hacemos puede que salga un error la próxima vez que abramos el archivo.

Paso 5: Llamar a la función que acabamos de crear.

Python3

if __name__ == '__main__':
  # opening our url file to access URLs
    file = open("url.txt", "r")
 
    # iterating over the urls
    for links in file.readlines():
        main(links)

Abrimos el url.txt en modo lectura e iteramos sobre cada una de sus líneas hasta llegar a la última. Llamar a la función principal en cada línea.

Así es como se ve todo nuestro código:

Python

# importing libraries
from bs4 import BeautifulSoup
import requests
 
def main(URL):
    # opening our output file in append mode
    File = open("out.csv", "a")
 
    # specifying user agent, You can use other user agents
    # available on the internet
    HEADERS = ({'User-Agent':
                'Mozilla/5.0 (X11; Linux x86_64)
                    AppleWebKit/537.36 (KHTML, like Gecko)
                            Chrome/44.0.2403.157 Safari/537.36',
                                'Accept-Language': 'en-US, en;q=0.5'})
 
    # Making the HTTP Request
    webpage = requests.get(URL, headers=HEADERS)
 
    # Creating the Soup Object containing all data
    soup = BeautifulSoup(webpage.content, "lxml")
 
    # retrieving product title
    try:
        # Outer Tag Object
        title = soup.find("span",
                          attrs={"id": 'productTitle'})
 
        # Inner NavigableString Object
        title_value = title.string
 
        # Title as a string value
        title_string = title_value.strip().replace(',', '')
 
    except AttributeError:
        title_string = "NA"
    print("product Title = ", title_string)
 
    # saving the title in the file
    File.write(f"{title_string},")
 
    # retrieving price
    try:
        price = soup.find(
            "span", attrs={'id': 'priceblock_ourprice'})
                                .string.strip().replace(',', '')
        # we are omitting unnecessary spaces
        # and commas form our string
    except AttributeError:
        price = "NA"
    print("Products price = ", price)
 
    # saving
    File.write(f"{price},")
 
    # retrieving product rating
    try:
        rating = soup.find("i", attrs={
                           'class': 'a-icon a-icon-star a-star-4-5'})
                                    .string.strip().replace(',', '')
 
    except AttributeError:
 
        try:
            rating = soup.find(
                "span", attrs={'class': 'a-icon-alt'})
                                .string.strip().replace(',', '')
        except:
            rating = "NA"
    print("Overall rating = ", rating)
 
    File.write(f"{rating},")
 
    try:
        review_count = soup.find(
            "span", attrs={'id': 'acrCustomerReviewText'})
                                .string.strip().replace(',', '')
 
    except AttributeError:
        review_count = "NA"
    print("Total reviews = ", review_count)
    File.write(f"{review_count},")
 
    # print availablility status
    try:
        available = soup.find("div", attrs={'id': 'availability'})
        available = available.find("span")
                    .string.strip().replace(',', '')
 
    except AttributeError:
        available = "NA"
    print("Availability = ", available)
 
    # saving the availability and closing the line
    File.write(f"{available},\n")
 
    # closing the file
    File.close()
 
 
if __name__ == '__main__':
  # opening our url file to access URLs
    file = open("url.txt", "r")
 
    # iterating over the urls
    for links in file.readlines():
        main(links)

Producción:

Título del producto = Impresora 3D Dremel DigiLab 3D40 Flex con suministros adicionales 30 Planes de lecciones Curso de desarrollo profesional Placa de construcción flexible Nivelación automática de 9 puntos PC y MAC OS Chromebook iPad 
Productos compatibles precio = $1699.00 
Calificación general = 4.1 de 5 estrellas 
Revisiones totales = 40 calificaciones 
Disponibilidad = En stock. 
Título del producto = Impresora 3D Comgrow Creality Ender 3 Pro con placa de superficie de construcción extraíble y fuente de alimentación certificada por UL 220x220x250mm 
Precio de los productos = NA 
Calificación general = 4.6 de 5 estrellas 
Revisiones totales = 2509 calificaciones 
Disponibilidad = NA 
Título del producto = Idea de impresora 3D Dremel Digilab 3D20 Constructor para nuevos 
productos para aficionados y manitas precio = $679.00 
Overall rating = 4.5 out of 5 stars 
Total reviews = 584 ratings 
Availability = In Stock. 
product Title = Dremel DigiLab 3D45 Award Winning 3D Printer w/Filament PC & MAC OS Chromebook iPad Compatible Network-Friendly Built-in HD Camera Heated Build Plate Nylon ECO ABS PETG PLA Print Capability 
Products price = $1710.81 
Overall rating = 4.5 out of 5 stars 
Total reviews = 351 ratings 
Availability = In Stock. 

Así es como se ve nuestro out.csv.

Publicación traducida automáticamente

Artículo escrito por technikue20 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 *