Saltar al contenido

Descargue todos los archivos pdf de un sitio web usando Python

Recuerda que en las ciencias un problema casi siempre tiene diversas resoluciones, así que aquí te compartiremos lo mejor y más eficiente.

Solución:

Echa un vistazo a la siguiente implementación. he usado requests módulo en lugar de urllib para hacer la descarga. Además, he usado .select() método en lugar de .find_all() para evitar el uso re.

import os
import requests
from urllib.parse import urljoin
from bs4 import BeautifulSoup

url = "http://www.gatsby.ucl.ac.uk/teaching/courses/ml1-2016.html"

#If there is no such folder, the script will create one automatically
folder_location = r'E: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']"):
    #Name the pdf files using the last portion of each link which are unique in this case
    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)

En general, las respuestas anteriores deberían funcionar. Sin embargo, debe evaluar la fuente html de la página web con la que está tratando de trabajar. Por ejemplo, algunos pueden tener la propiedad og_url en la etiqueta meta mientras que otros pueden no tenerla. Esto es posible si está trabajando con un sitio web seguro (digamos la página web del curso de su universidad). En este caso, deberá extraer los enlaces pdf de manera diferente.

Puede encontrar una buena explicación y solución aquí:

https://medium.com/@dementorwriter/notesdownloader-use-web-scraping-to-download-all-pdfs-with-python-511ea9f55e48

un par de enlaces ya contenían la dirección del servidor que provocó que no se encontrara el 404. Además, no debe quitar el .pdf del nombre del archivo, ya que lo guardará sin extensión.

from urllib import request
from bs4 import BeautifulSoup
import re
import os
import urllib

# connect to website and get list of all pdfs
url="http://www.gatsby.ucl.ac.uk/teaching/courses/ml1-2016.html"
response = request.urlopen(url).read()
soup= BeautifulSoup(response, "html.parser")     
links = soup.find_all('a', href=re.compile(r'(.pdf)'))


# clean the pdf link names
url_list = []
for el in links:
if(el['href'].startswith('http')):
    url_list.append(el['href'])
else:
    url_list.append("http://www.gatsby.ucl.ac.uk/teaching/courses/" + el['href'])

print(url_list)


# download the pdfs to a specified location
for url in url_list:
    print(url)
    fullfilename = os.path.join('E:webscraping', url.replace("http://www.gatsby.ucl.ac.uk/teaching/courses/ml1-2016/", ""))
    print(fullfilename)
    request.urlretrieve(url, fullfilename)

Al final de la post puedes encontrar las críticas de otros creadores, tú incluso tienes la habilidad mostrar el tuyo si lo deseas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

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