Heim >Backend-Entwicklung >Python-Tutorial >Ausführliche Erklärung, wie der Python-Crawler-DNS den Cache auflöst

Ausführliche Erklärung, wie der Python-Crawler-DNS den Cache auflöst

黄舟
黄舟Original
2017-06-04 10:10:482087Durchsuche

In diesem Artikel wird hauptsächlich die PythonCrawler-DNS-Parsing-Caching-Methode vorgestellt, die relevanten Bedienfähigkeiten analysiert und Hinweise dazu gegeben, wie Python das Socket-Modul zum Parsen des DNS-Cache verwendet auf konkrete Beispiele. , Freunde in Not können sich darauf beziehen

Dieser Artikel beschreibt die DNS-Auflösungs-Caching-Methode des Python-Crawlers anhand von Beispielen. Teilen Sie es als Referenz mit allen. Die Details lauten wie folgt:

Vorwort:

Dies ist der Kerncode im DNS-Auflösungs-Caching Modul im Python-Crawler. Es handelt sich um den Code des letzten Jahres, der jetzt für Interessierte zum Anschauen freigegeben ist.

Im Allgemeinen liegt die DNS-Auflösungszeit eines Domainnamens zwischen 10 und 60 Millisekunden, was unbedeutend erscheint, aber bei größeren Crawlern kann dies nicht ignoriert werden. Wenn wir beispielsweise Sina Weibo crawlen möchten, gibt es 10 Millionen Anfragen unter demselben Domainnamen (was nicht allzu viel ist), sodass es zwischen 100.000 und 600.000 Sekunden dauert, was nur 86.400 Sekunden pro Tag entspricht. Mit anderen Worten, die DNS-Auflösung allein dauert mehrere Tage. Wenn man zu diesem Zeitpunkt DNS-Auflösungs-Caching hinzufügt, ist der Effekt offensichtlich.

Geben Sie den Code direkt unten ein und die Anweisungen finden Sie hinten.

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

Beschreibung:

Eigentlich Es ist nicht schwierig. Speichern Sie einfach den Cache im Socket, um eine wiederholte Erfassung zu vermeiden.
Sie können den obigen Code in eine dns_cache.py-Datei einfügen und diese -Methode einfach im Crawler--Framework _setDNSCache() aufrufen.

Es sollte beachtet werden, dass, wenn Sie gevent coroutine verwenden und mon<a href="http://www.php.cn/wiki/1051.html" target="_blank">key verwenden <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

(), erforderlich Beachten Sie, dass der Crawler gewechselt hat Zu diesem Zeitpunkt muss der Socket in Gevent verwendet werden, und das DNS-Auflösungs-Cache-Modul sollte ebenfalls den Gevent-Socket verwenden.

Das obige ist der detaillierte Inhalt vonAusführliche Erklärung, wie der Python-Crawler-DNS den Cache auflöst. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn