es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo descargar todos los href (pdf) dentro de una clase con Python Beautiful Soup?

Tengo alrededor de 900 páginas y cada página contiene 10 botones (cada botón tiene un pdf). Quiero descargar todos los pdf: el programa debe navegar por todas las páginas y descargar los pdf uno por uno.

El código solo busca archivos .pdf, pero mi href no tiene la extensión .pdf page_no (1 a 900).

https://bidplus.gem.gov.in/bidlists?bidlists&page_no=3

Este es el sitio web y a continuación se encuentra el enlace:

<p class="bid_no pull-left"> BID NO: <a style="color:#fff !important" href="/showbidDocument/2989799">GEM/2021/B/1804626</a></p>
import os
import requests
from urllib.parse import urljoin
from bs4 import BeautifulSoup

url = "https://bidplus.gem.gov.in/bidlists"

# Si no existe esa carpeta, el script la creará automáticamente.
folder_location = r'C:\webscraping'
if not os.path.exists(folder_location):
    os.mkdir(folder_location)

response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
for link in soup.select("a[href$='.pdf']"):
    # Nombrar los archivos pdf utilizando la última parte de cada enlace, que es única en este caso.
    filename = os.path.join(folder_location, link['href'].split('/')[-1])
    with open(filename, 'wb') as f:
        f.write(requests.get(urljoin(url, link['href'])).content)
Tags:  ,

Answer

  1. Avatar for davy.ai

    Para descargar todos los pdf’s del sitio web que contiene 900 páginas con 10 botones cada una, debemos modificar el código existente para navegar por todas las páginas y descargar los pdf’s uno por uno. Podemos lograr esto utilizando un bucle for que itere a través de todas las páginas y un bucle for anidado que itere a través de todos los botones en cada página para obtener los enlaces a los pdf’s.

    El código modificado se muestra a continuación:

    import os
    import requests
    from urllib.parse import urljoin
    from bs4 import BeautifulSoup
    
    url = "https://bidplus.gem.gov.in/bidlists"
    
    # Si no existe esa carpeta, el script la creará automáticamente
    folder_location = r'C:\webscraping'
    if not os.path.exists(folder_location):
        os.mkdir(folder_location)
    
    # Navegar por todas las páginas
    for page in range(1, 901):
        page_url = url + "?page_no=" + str(page)
        response = requests.get(page_url)
        soup= BeautifulSoup(response.text, "html.parser")
    
        # Iterar a través de todos los botones en la página para obtener el enlace al pdf
        for button in soup.select("a[href^='/showbidDocument/']"):
            pdf_url = "https://bidplus.gem.gov.in" + button['href']
            filename = os.path.join(folder_location, pdf_url.split('/')[-1])
            with open(filename, 'wb') as f:
                f.write(requests.get(pdf_url).content)
    

    En el código anterior, comenzamos navegando por todas las páginas utilizando un bucle for que va desde 1 hasta 900. Dentro del bucle, construimos la URL de la página agregando el número de página a la URL base utilizando el parámetro de consulta “page_no”.

    A continuación, enviamos una solicitud a la URL de la página y creamos un objeto BeautifulSoup para analizar el contenido HTML. Luego, utilizamos otro bucle for para iterar a través de todos los botones en la página que tienen un enlace que comienza con “/showbidDocument/”.

    Para cada botón, agregamos la URL base “https://bidplus.gem.gov.in” para obtener la URL absoluta del pdf. Luego extraemos el nombre de archivo de la URL y lo unimos con la ubicación de la carpeta para crear la ruta del archivo. Finalmente, utilizamos la biblioteca requests para descargar el pdf y guardarlo en la ruta del archivo.

    Al ejecutar este código, todos los pdf’s del sitio web se descargarán y guardarán en la ubicación de carpeta especificada.

Comments are closed.