[PYTHON] Laden Sie es herunter, wenn die URL bestimmten Bedingungen entspricht, während Sie im Browser patrouillieren

Einführung

Dieser Artikel ist Tag 19 des Crawler / Web Scraping Adventskalenders 2015.

Dieses Mal werde ich vorstellen, wie ein Skript geschrieben wird, das verschiedene Seiten mit einem Browser durchsucht und nur dann herunterlädt, wenn die URL mit einem bestimmten kanonischen Ausdruck übereinstimmt.

Verwenden Sie mitmproxy.

Was ist Mitmproxy?

mitmproxy steht für Man In The Middle Proxy. Wie der Name schon sagt, fungiert es als Proxy zwischen dem Browser und dem Server. Es ist jedoch nicht nur ein Proxy, es ist auch möglich, eine Anforderung oder Antwort zu erkennen und eine automatische Verarbeitung durchzuführen oder die Zeichenfolge der Anforderung oder Antwort mit einer bestimmten Regel neu zu schreiben. Da "mitmproxy" in "Python" geschrieben ist, muss die Verarbeitung auch in "Python" geschrieben werden.

Was ich in diesem Artikel machen möchte

Der Zweck dieses Artikels besteht darin, den Inhalt basierend auf den folgenden Annahmen automatisch herunterzuladen.

Skript erstellt

Das folgende Skript wurde für den oben genannten Zweck erstellt.

download.py


#!/usr/bin/env python
# -*- coding: utf-8 -*-

import urllib
import urlparse
import re
import sys
import datetime
import subprocess

def request(context, flow):
  request = flow.request
  if ".pdf" in request.path:
    cmdline = "wget"
    for k, v in request.headers.items():
      if k == "User-Agent":
        cmdline = cmdline + ( " --user-agent=\"%s\"" % ( v ) )
      elif k == "Referer":
        cmdline = cmdline + ( " --referer=\"%s\"" % ( v ) )
      elif k == "Host":
        pass
      elif k == "Proxy-Connection":
        pass
      elif k == "Accept-Encoding":
        pass
      else:
        cmdline = cmdline + ( " --header \"%s: %s\"" % ( k, v.replace(":", " ")))
    url = request.url
    cmdline = cmdline + " \"" + url + "\""
    now = datetime.datetime.strftime(datetime.datetime.now(), '%Y%m%d%H%M%S')
    filename = now + "-" + os.path.basename(request.path)
    cmdline = cmdline + " -O " + filename
    cmdline = "( cd ~/pdf; " + cmdline + ")"
    subprocess.call(cmdline)

Führen Sie das obige Skript mit mitmproxy wie folgt aus.

$ mitmproxy -s download.py

Der Mitmproxy fungiert dann als HTTP-Proxy an Port 8080.

Ändern Sie dann die Proxy-Einstellungen Ihres Browsers in localhost: 8080 und Sie werden automatisch über "mitmproxy" darauf zugreifen.

Da das obige Skript ausgeführt wird und beim Zugriff auf den Pfad einschließlich ".pdf" mit "wget" heruntergeladen wird.

Kommentar

Mit dem obigen Skript kann Folgendes erreicht werden.

Ergänzung

Ich möchte, dass Sie sich über die Verarbeitung in Bezug auf die Befehlszeilenoptionen von "wget" - und HTTP-Anforderungsheadern in anderen Dokumenten informieren, aber ich werde nur einen Punkt über "Accept-Encoding" erläutern. Wenn ich den Prozess zum Überspringen dieser "Accept-Encoding" nicht beschrieben habe, wurde der heruntergeladene Inhalt mit gzip komprimiert, und ich konnte ihn nicht ohne zusätzlichen Aufwand verwenden, und ich war leicht süchtig danach. Dieser Header gibt an, welche Art von Komprimierung durchgeführt werden soll, um den Datenverkehr zu reduzieren.

Durch Überspringen des Headers "Accept-Encoding" werden unkomprimierte Dateien gespeichert, wodurch die Probleme verringert werden können.

Recommended Posts

Laden Sie es herunter, wenn die URL bestimmten Bedingungen entspricht, während Sie im Browser patrouillieren
Überprüfen Sie, ob die URL in Python vorhanden ist
Geben Sie die Ansichts-URL in der Django-Vorlage an
So finden Sie das erste Element, das den Kriterien in der Python-Liste entspricht
Laden Sie Dateien herunter, während Sie den Fortschritt in Python 3.x anzeigen
Überprüfen Sie, ob der von PHP generierte Passwort-Hash in Python übereinstimmt