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
.
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.
Der Zweck dieses Artikels besteht darin, den Inhalt basierend auf den folgenden Annahmen automatisch herunterzuladen.
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.
Mit dem obigen Skript kann Folgendes erreicht werden.
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