この記事では、主に
Pythonクローラー DNS 解析キャッシュ方法を紹介し、関連する操作スキルと、DNS キャッシュを解析するためのソケット モジュールを使用する Python の注意事項を分析するための具体的な例と組み合わせて説明します。 この例では、Python クローラーの DNS 解決キャッシュ方法について説明します。参考のために皆さんと共有してください。詳細は次のとおりです。
前書き: これは、Python クローラーの DNS 解析キャッシュ モジュールのコア コードです。興味のある方はご覧ください。
一般に、ドメイン名の DNS 解決時間は 10 ~ 60 ミリ秒であり、それほど重要ではないように見えますが、より大きなクローラーの場合、これは無視できません。たとえば、Sina Weibo をクロールしたい場合、同じドメイン名で 1,000 万件のリクエストがあり (これは多すぎません)、100,000 ~ 600,000 秒かかります。これは 1 日あたりわずか 86,400 秒です。つまり、DNS 解決だけでは数日かかりますが、この時点で DNS 解決キャッシュを追加すると、その効果は明らかです。
コードを直接下に入力してください。説明は後ろにあります。
コード: # 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
手順: 実際、繰り返しの取得を避けるためにソケットにキャッシュを保存するだけです。
上記のコードを dns_cache.py ファイルに配置し、この_setDNSCache()
メソッドをクローラー フレームワーク
で呼び出すだけです。 gevent コルーチンを使用し、mon<a href="http://www.php.cn/wiki/1051.html" target="_blank">key<code>_setDNSCache()
方法就行了。
需要说明一下的是,如果你使用了gevent协程,并且用上了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
以上がPython クローラー DNS がキャッシュを解決する方法の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。