Maison  >  Article  >  développement back-end  >  Explication détaillée de la façon dont le DNS du robot d'exploration Python résout le cache

Explication détaillée de la façon dont le DNS du robot d'exploration Python résout le cache

黄舟
黄舟original
2017-06-04 10:10:482016parcourir

Cet article présente principalement la méthode Pythoncrawler DNS parsingcaching, combinée à des exemples spécifiques pour analyser les compétences opérationnelles pertinentes et à des notes sur la façon dont Python utilise le module socket pour analyser le cache DNS. Matter , les amis dans le besoin peuvent s'y référer

Cet article décrit la méthode de mise en cache de résolution DNS du robot Python avec un exemple. Partagez-le avec tout le monde pour référence, comme suit :

Avant-propos :

Ceci est le code principal du module de cache d'analyse DNS dans le Crawler Python. C'est le code de l'année dernière, et il est maintenant publié pour ceux qui sont intéressés.

Généralement, le temps de résolution DNS d'un nom de domaine est compris entre 10 et 60 millisecondes, ce qui semble insignifiant, mais pour les plus gros robots, cela ne peut être ignoré. Par exemple, si nous voulons explorer Sina Weibo, il y a 10 millions de requêtes sous le même nom de domaine (ce qui n'est pas trop), donc cela prend entre 100 000 et 600 000 secondes, soit seulement 86 400 secondes par jour. En d'autres termes, la résolution DNS à elle seule prend plusieurs jours. À l'heure actuelle, en ajoutant la mise en cache de la résolution DNS, l'effet est évident.

Mettez le code directement en dessous, et les instructions sont au dos.

Code :

# encoding=utf-8
# ---------------------------------------
#  版本:0.1
#  日期:2016-04-26
#  作者:九茶<bone_ace@163.com>
#  开发环境:Win64 + Python 2.7
# ---------------------------------------
import socket
# from gevent import socket
_dnscache = {}
def _setDNSCache():
  """ DNS缓存 """
  def _getaddrinfo(*args, **kwargs):
    if args in _dnscache:
      # print str(args) + " in cache"
      return _dnscache[args]
    else:
      # print str(args) + " not in cache"
      _dnscache[args] = socket._getaddrinfo(*args, **kwargs)
      return _dnscache[args]
  if not hasattr(socket, &#39;_getaddrinfo&#39;):
    socket._getaddrinfo = socket.getaddrinfo
    socket.getaddrinfo = _getaddrinfo

Description :

En fait Ce n'est pas difficile, il suffit de sauvegarder le cache dans le socket pour éviter des acquisitions répétées.
Vous pouvez mettre le code ci-dessus dans un fichier dns_cache.py et simplement appeler cette méthode dans le framework du robot _setDNSCache().

Il est à noter que si vous utilisez la coroutine gevent et utilisez le mon<a href="http://www.php.cn/wiki/1051.html" target="_blank">key<code>mon<a href="http://www.php.cn/wiki/1051.html" target="_blank">key</a>.patch_<a href="http://www.php.cn/wiki/1483.html" target="_blank">all</a>().patch_all

(), obligatoire Notez que le robot est passé à l'utilisation du socket dans gevent pour le moment, et le module de cache de résolution DNS devrait également utiliser le socket gevent.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn