Búsqueda de sitios web

Acceso a recursos web utilizando el patrón de diseño del método de fábrica en Python


El patrón de diseño del método Factory de Python es un patrón de creación que proporciona una interfaz para crear objetos en una superclase pero permite que las subclases alteren el tipo de objetos que se crearán. Se utiliza para definir una interfaz genérica para crear objetos y al mismo tiempo permitir que las subclases decidan qué clase crear una instancia. En este artículo, exploraremos cómo utilizar el patrón de diseño del método Factory para acceder a recursos web en Python.

Acceder a recursos web

Python proporciona varias bibliotecas para acceder a recursos web, como solicitudes HTTP, urllib y solicitudes. Estas bibliotecas nos permiten enviar solicitudes HTTP a un servidor y recibir una respuesta. Sin embargo, elegir la biblioteca adecuada puede resultar abrumador, especialmente cuando se trabaja en proyectos grandes con múltiples dependencias. Para resolver este problema, podemos usar el patrón de diseño del método Factory para crear una interfaz común para acceder a los recursos web y dejar que las subclases decidan qué biblioteca usar.

Comencemos definiendo la clase abstracta para nuestra fábrica:

from abc import ABC, abstractmethod

class WebResourceFactory(ABC):

   @abstractmethod
   def get(self, url):
      pass

   @abstractmethod
   def post(self, url, data):
      pass

La clase WebResourceFactory es una clase abstracta que define la interfaz para acceder a los recursos web. Tiene dos métodos abstractos: get() y post(), que serán implementados por las subclases concretas.

A continuación, creemos dos subclases concretas que implementen la interfaz WebResourceFactory utilizando las bibliotecas Requests y urllib:

import urllib.request
import requests

class RequestsWebResourceFactory(WebResourceFactory):

   def get(self, url):
      return requests.get(url)

   def post(self, url, data):
      return requests.post(url, data)

class UrllibWebResourceFactory(WebResourceFactory):

   def get(self, url):
      response = urllib.request.urlopen(url)
      return response.read()

   def post(self, url, data):
      data = data.encode('utf-8')
      req = urllib.request.Request(url, data=data)
      response = urllib.request.urlopen(req)
      return response.read()

Las clases RequestsWebResourceFactory y UrllibWebResourceFactory son subclases concretas que implementan la interfaz WebResourceFactory utilizando las bibliotecas Requests y urllib respectivamente.

Ahora podemos utilizar la interfaz WebResourceFactory para acceder a los recursos web de manera uniforme, sin preocuparnos por la biblioteca subyacente. En el siguiente código, accedemos a los recursos web de la página de inicio de Google.

La función access_web_resource() toma un objeto de fábrica y una URL y utiliza el objeto de fábrica para acceder al recurso web en la URL especificada. Podemos crear un objeto de fábrica usando la clase RequestsWebResourceFactory o UrllibWebResourceFactory, según la biblioteca que queramos usar.

def access_web_resource(factory, url):
    web_resource = factory.get(url)
    print(web_resource)

factory = RequestsWebResourceFactory()
access_web_resource(factory, 'https://www.google.com')

factory = UrllibWebResourceFactory()
access_web_resource(factory, 'https://www.google.com')

El código completo y el resultado para acceder a la página de inicio de Google se detallan a continuación:

import urllib.request
import requests
from abc import ABC, abstractmethod

class WebResourceFactory(ABC):

   @abstractmethod
   def get(self, url):
        pass

   @abstractmethod
   def post(self, url, data):
      pass

class RequestsWebResourceFactory(WebResourceFactory):

   def get(self, url):
      return requests.get(url)

   def post(self, url, data):
      return requests.post(url, data)

class UrllibWebResourceFactory(WebResourceFactory):

   def get(self, url):
      response = urllib.request.urlopen(url)
      return response.read()

   def post(self, url, data):
      data = data.encode('utf-8')
      req = urllib.request.Request(url, data=data)
      response = urllib.request.urlopen(req)
      return response.read()

def access_web_resource(factory, url):
   web_resource = factory.get(url)
   print(web_resource)

factory = RequestsWebResourceFactory()
access_web_resource(factory, 'https://www.google.com')

factory = UrllibWebResourceFactory()
access_web_resource(factory, 'https://www.google.com')

Producción

<Response [200]>
b'<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" 
lang="en-IN"><head><meta content="text/html; charset=UTF-8" http-
equiv="Content-Type"><meta 
content="/images/branding/googleg/1x/googleg_standard_color_128dp.png" 
itemprop="image"><title>Google</title><script …

Conclusión

En este artículo, exploramos cómo usar el patrón de diseño del método Factory para crear una interfaz común para acceder a recursos web usando las bibliotecas Requests y urllib en Python. Sin embargo, este patrón se puede aplicar a cualquier escenario en el que necesitemos crear objetos de diferentes tipos basados en una interfaz común.

Artículos relacionados: