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
- Acceda a la URL e inspeccione el texto.
- En la consola, tomamos el texto junto a id=
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