[PYTHON] Télécharger si l'URL correspond à certaines conditions lors de la patrouille dans le navigateur

introduction

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.

Qu'est-ce que «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».

Ce que je veux faire dans cet article

Le but de cet article est de télécharger automatiquement le contenu en fonction des hypothèses suivantes.

Script créé

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.

Commentaire

Avec le script ci-dessus, ce qui suit peut être réalisé.

Supplément

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

Télécharger si l'URL correspond à certaines conditions lors de la patrouille dans le navigateur
Vérifiez si l'URL existe en Python
Spécifiez l'URL de la vue dans le modèle Django
Comment trouver le premier élément qui correspond aux critères de la liste Python
Téléchargez des fichiers tout en affichant la progression dans Python 3.x
Vérifiez si le hachage de mot de passe généré par PHP correspond en Python