Меnu:


Dentro de nuestra empresa, estamos acostumbrados a hacer web scraping con python y selenium. Pero nos hemos encontrado con un obstáculo 2 Gb de memoria no son suficientes cuando abres mas de 30 tabs automáticamente con el chromium. La maquina se pone lentísima por falta de memoria.

Que hacemos, nos compramos una maquina con mas de 2 Gb de memoria?

En nuestra opinión "NO". Pues es una inversión adicional y generar mas basura para el planeta con los equipos que se van obsolesciendo. Ahora acá tenemos una orange pi plus 2e (opi) encendida permanentemente. Conseguir una opi con 4 Gb de memoria, seria bastante oneroso. Así que Emacs viene al rescate nuestro, para que nuestros 2 Gb de memoria sean mas que suficientes. Ya habíamos dejado de usar w3m estuvimos usando eww (otro browser dentro del Emacs mas reciente), pero la lista-de-correos de w3m comenzó a moverse de nuevo con nuevas ideas, desempolvando características ya desarrolladas a lo largo de mas de 20 años de desarrollo del w3m, y la verdad que nos hemos quedamos nuevamente sorprendidos por la versatilidad de w3m.

Algunos hechos que debemos también saber:

  1. Es probable que el servidor de los pdf's que estaremos abriendo con nuestro web scraping con Emacs+w3m, no este preparado para recibir mas de 30 consultas simultáneamente, ya que mas de una vez el servidor se ha caído, lo que nos obligo a enmascarar el user-agent del w3m, en caso que que nos quieran filtran usando ese mecanismo.
  2. Lo ya mencionado mas arriba, para abrir mas de 30 tabs en chromium se requiere mas memoria de la que nuestra orange pi nos brinda.
  3. El sitio web del cual colectaremos información recibe un conjunto de requerimientos de publicación de avisos (es un diario), para lo cual los clientes del diario solo envían una imagen dentro de un pdf. De tal modo que ver el pdf[la info que el cliente desea publicar] requiere dar click a un link.

Como hacemos web scraping con Emacs y w3m?

Esto es lo que necesitamos hacer:

  1. Filtrar solo las publicaciones del diario, las cuales son solo imágenes dentro de un pdf. Usaremos occur.
  2. Con la lista de todos los items que coinciden (son imagen dentro de pdf). Recorreremos nuevamente la pagina web, para localizar las url de cada coincidencia o mejor dicho de cada documento.
  3. Luego abrir cada una de las urls de los documentos en el w3m dentro del Emacs.

Mostrando es código que cumple con los requerimientos.

;-*- mode: emacs-lisp; encoding: utf-8; -*-
(when (boundp 'w3m-display-hook)



(setq w3m-user-agent-site-specific-alist '(("^https?://busquedas\\.elperuano\\.pe" . "Mozilla/5.0 (Linux; U; Android 4.0.3; ko-kr; LG-L160L Build/IML74K) AppleWebkit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30")))
 ; https://emacs.stackexchange.com/questions/19686/how-to-use-pdf-tools-pdf-view-mode-in-emacs
(defvar my-w3m-avisa-peruano-occur-lst '() "harvested matchs from occur")
(defvar my-w3m-avisa-peruano-url-lst '() "harvested url's that match the query")
(defun sunshavi/w3m-avisa-peruano (url)
  "get the links from pdfs that are just images. "
  (when (string-match (base64-decode-string "aHR0cHM6Ly9idXNxdWVkYXMuZWxwZXJ1YW5vLnBlL2FyY2hpdm8vYm9sZXRpbmVzLw==") url)
    (occur-1  "    002-.* Firmado Digitalmente por" (- 2 2) (list (current-buffer)))
    (when (get-buffer "*Occur*")
      (setq my-w3m-avisa-peruano-occur-lst '())
      (setq my-w3m-avisa-peruano-url-lst '())
      (let  ( (num-lines (count-lines (point-min) (point-max))) ; line counting
              (counter 1)
              (my-w3m-buffer (current-buffer))
              )
        (with-current-buffer (get-buffer "*Occur*")
          (goto-char (point-min))
          (end-of-line)
          (forward-line)
          (while ( < counter num-lines) ;iterate lines
            (back-to-indentation)
            (search-forward "002" nil t)
            (backward-word)
            (let ((beg (point)))
              (search-forward " " nil t)
              (backward-char 1)
              (if (> (length (buffer-substring-no-properties beg (point))) 3)
                  (add-to-list 'my-w3m-avisa-peruano-occur-lst  (buffer-substring-no-properties beg (point))))
              )
            (forward-line)
            (setq counter (+ 1 counter)))
          )
        (delete-other-windows)
        (when (> (length my-w3m-avisa-peruano-occur-lst) 0)
          ;use the matches list to fill the url's list
          (with-current-buffer my-w3m-buffer
            (goto-char (point-max))
            (dolist (my-item my-w3m-avisa-peruano-occur-lst)
              (search-backward my-item nil t)
              (end-of-line)
              (search-forward "Descarga individual" nil t)
              (end-of-line)
              (backward-char 1) ;"Descarga individual"
              (add-to-list 'my-w3m-avisa-peruano-url-lst  (w3m-active-region-or-url-at-point)))
            )
          )
        (when (> (length my-w3m-avisa-peruano-url-lst) 0)
          ; fill a temp buffer and evaluate it
          (with-temp-buffer
            (insert "(progn\n")
            (dolist (my-item-3 my-w3m-avisa-peruano-url-lst)
              (insert "(w3m-browse-url \"")
              (insert my-item-3)
              (insert "\" t)\n"))
            (insert ")")
            (eval-buffer))
            )
          )
        )))
(add-hook 'w3m-display-hook 'sunshavi/w3m-avisa-peruano)
(defun sunshavi/w3m-lambda-confirm-page-load()
  (if (y-or-n-p "Do You want to process documents for today?")
      (progn
        (w3m-browse-url (concat (base64-decode-string "aHR0cHM6Ly9idXNxdWVkYXMuZWxwZXJ1YW5vLnBlL2FyY2hpdm8vYm9sZXRpbmVzLw==") (format-time-string "%Y-%m-%d") "/") t)
        )
    )
  )
)

Mostrando el bash alias

alias myemacs="emacs --no-bitmap-icon -Q --eval \" (progn (defvar my-cli-not-init-pkgs-flag t \\\"my emacs var, indicates how this emacs was started\\\")(load \\\"~/.emacs.d/init.el\\\"))\""

Conclusión

Emacs+w3m nos permiten hacer web scraping con eficiencia. También nos permiten llegar a completar tareas que con las herramientas convencionales requerirían hardware mas moderno y por lo tanto mas costoso, también nos permiten evitar nuevos desembolsos.

Nota

La empresa generadora de contenidos que publicaba la pagina web, de la cual estábamos extrayendo información, ha dejado de publicar la dirección web de sus archivos y ahora solo publica un pdf con la misma información, estamos descargando el pdf y viéndolo con pdf-tools, nos faltaría adaptar el occur dentro de pdf-tools para luego con cada coincidencia comenzar a buscar cada pdf. Agradecemos a Andreas Politz el creador de pdf-tools por una herramienta tan buena y eficaz.

Last change: 21.12.2018 01:44

blog comments powered by Disqus