Cet article est le jour 19 du calendrier de l'avent Crawler / Web Scraping 2015.
Cette fois, je vais vous présenter comment écrire un script qui parcourt différentes pages à l'aide d'un navigateur et ne télécharge que lorsque l'URL correspond à une expression canonique spécifique.
Utilisez mitmproxy
.
mitmproxy
signifie Man In The Middle Proxy.
Comme son nom l'indique, il agit comme un proxy entre le navigateur et le serveur.
Cependant, ce n'est pas seulement un proxy, il est également possible de détecter une demande ou une réponse et d'effectuer un traitement automatique, ou de réécrire la chaîne de caractères de la demande ou de la réponse avec une certaine règle.
Puisque «mitmproxy» est écrit en «Python», le traitement doit également être écrit en «Python».
Le but de cet article est de télécharger automatiquement le contenu en fonction des hypothèses suivantes.
Le script suivant a été créé dans le but ci-dessus.
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)
Exécutez le script ci-dessus à l'aide de mitmproxy comme suit.
$ mitmproxy -s download.py
Le mitmproxy
commencera alors à agir comme un proxy HTTP sur le port 8080.
Puis changez les paramètres de proxy de votre navigateur en localhost: 8080 et il sera automatiquement accessible via mitmproxy
.
Puisque le script ci-dessus est en cours d'exécution, lorsque le chemin d'accès comprenant .pdf
est accédé, il sera téléchargé à l'aide de wget
.
Avec le script ci-dessus, ce qui suit peut être réalisé.
J'aimerais que vous vous renseigniez sur le traitement lié aux options de ligne de commande des en-têtes de requête wget
et HTTP dans d'autres documents, mais je n'expliquerai qu'un seul point, ʻAccepter-Encoding. Si je ne décrivais pas le processus pour ignorer cet ʻAccepter-Encodage
, le contenu téléchargé était compressé avec gzip, et je ne pouvais pas l'utiliser sans effort supplémentaire, et j'en étais accro. Cet en-tête spécifie le type de compression à effectuer pour réduire le trafic.
En sautant l'en-tête ʻAccept-Encoding`, les fichiers non compressés seront sauvegardés, ce qui peut réduire le problème.
Recommended Posts