¿Cómo raspar todos los archivos PDF en un sitio web?

Requisitos previos: Implementación de Web Scraping en Python con BeautifulSoup

Web Scraping es un método para extraer datos del sitio web y utilizar esos datos para otros usos. Hay varias bibliotecas y módulos para hacer web scraping en Python. En este artículo, aprenderemos cómo raspar los archivos PDF del sitio web con la ayuda de beautifulsoup, que es uno de los mejores módulos de raspado web en Python, y el módulo de requests para las requests GET. Además, para obtener más información sobre el archivo PDF, usamos el módulo PyPDF2 .

Código paso a paso –

Paso 1: Importe todos los módulos y paquetes importantes.

Python3

# for get the pdf files or url
import requests
 
# for tree traversal scraping in webpage
from bs4 import BeautifulSoup
 
# for input and output operations
import io
 
# For getting information about the pdfs
from PyPDF2 import PdfFileReader

Paso 2: pasar la URL y hacer un analizador HTML con la ayuda de BeautifulSoup.

Python3

# website to scrap
url = "https://www.geeksforgeeks.org/how-to-extract-pdf-tables-in-python/"
 
# get the url from requests get method
read = requests.get(url)
 
# full html content
html_content = read.content
 
# Parse the html content
soup = BeautifulSoup(html_content, "html.parser")

En el código anterior:

  • El raspado se realiza mediante el enlace https://www.geeksforgeeks.org/how-to-extract-pdf-tables-in-python/
  • El módulo de requests se utiliza para hacer una solicitud de obtención.
  • read.content se utiliza para recorrer todo el código HTML. La impresión generará el código fuente de la página web.
  • sopa tiene contenido HTML y se usa para analizar el HTML

Paso 3: Necesitamos recorrer los archivos PDF desde el sitio web.

Python3

# created an empty list for putting the pdfs
list_of_pdf = set()
 
# accessed the first p tag in the html
l = soup.find('p')
 
# accessed all the anchors tag from given p tag
p = l.find_all('a')
 
# iterate through p for getting all the href links
for link in p:
     
    # original html links
    print("links: ", link.get('href'))
    print("\n")
     
    # converting the extension from .html to .pdf
    pdf_link = (link.get('href')[:-5]) + ".pdf"
     
    # converted to .pdf
    print("converted pdf links: ", pdf_link)
    print("\n")
     
    # added all the pdf links to set
    list_of_pdf.add(pdf_link)

Producción:

En el código anterior:

  • list_of_pdf es un conjunto vacío creado para agregar todos los archivos PDF de la página web. Se usa set porque nunca repite los elementos con el mismo nombre. Y deshazte automáticamente de los duplicados.
  • La iteración se realiza dentro de todos los enlaces convirtiendo el .HTML a .pdf. Se hace porque el nombre del PDF y el nombre del HTML tienen una única diferencia en el formato, el resto son todos iguales.
  • Usamos el conjunto porque necesitamos deshacernos de nombres duplicados. La lista también se puede usar y, en lugar de agregar, agregamos todos los PDF.

 Paso 4: Cree la función de información con el módulo pypdf2 para obtener toda la información requerida del pdf.

Python3

def info(pdf_path):
 
    # used get method to get the pdf file
    response = requests.get(pdf_path)
 
    # response.content generate binary code for
    # string function
    with io.BytesIO(response.content) as f:
 
        # initialized the pdf
        pdf = PdfFileReader(f)
 
        # all info about pdf
        information = pdf.getDocumentInfo()
        number_of_pages = pdf.getNumPages()
 
    txt = f"""
    Information about {pdf_path}:
     
    Author: {information.author}
    Creator: {information.creator}
    Producer: {information.producer}
    Subject: {information.subject}
    Title: {information.title}
    Number of pages: {number_of_pages}
    """
    print(txt)
     
    return information

 
 En el código anterior: 

  • La función de información es responsable de brindar toda la salida raspada requerida dentro del PDF.
  • io.BytesIO(response.content): se usa porque response.content es un código binario y la biblioteca de requests tiene un nivel bastante bajo y generalmente se compila (no se interpreta). Entonces, para manejar bytes, se usa io.BytesIO .
  • Hay varias funciones de pypdfs2 para acceder a diferentes datos en pdf.

 Nota: Consulte Trabajar con archivos PDF en Python para obtener información detallada.

Python3

# print all the content of pdf in the console
for i in list_of_pdf:
    info(i)

Código completo:

Python3

import requests
from bs4 import BeautifulSoup
import io
from PyPDF2 import PdfFileReader
 
 
url = "https://www.geeksforgeeks.org/how-to-extract-pdf-tables-in-python/"
read = requests.get(url)
html_content = read.content
soup = BeautifulSoup(html_content, "html.parser")
 
list_of_pdf = set()
l = soup.find('p')
p = l.find_all('a')
 
for link in (p):
    pdf_link = (link.get('href')[:-5]) + ".pdf"
    print(pdf_link)
    list_of_pdf.add(pdf_link)
 
def info(pdf_path):
    response = requests.get(pdf_path)
     
    with io.BytesIO(response.content) as f:
        pdf = PdfFileReader(f)
        information = pdf.getDocumentInfo()
        number_of_pages = pdf.getNumPages()
 
    txt = f"""
    Information about {pdf_path}:
 
    Author: {information.author}
    Creator: {information.creator}
    Producer: {information.producer}
    Subject: {information.subject}
    Title: {information.title}
    Number of pages: {number_of_pages}
    """
    print(txt)
    return information
 
 
for i in list_of_pdf:
    info(i)

Producción:

Publicación traducida automáticamente

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