Maison >développement back-end >Tutoriel Python >Explication détaillée de la façon dont le DNS du robot d'exploration Python résout le cache
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, '_getaddrinfo'): 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
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!