查了一下网上关于socket
关于dns
缓存的代码,希望提高网络请求的速度,
自己在代码中使用了以后,发现速度反倒慢了,为什么呢 下面的 100 个请求中,使用了缓存之后时间增加了 4 秒多, 10 个请求的时候,时间增加了 0.2 秒左右
# coding=utf-8 import requests import time 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] = temp_getaddrinfo(*args, **kwargs) return _dnscache[args] if not hasattr(socket, '_getaddrinfo'): temp_getaddrinfo = socket.getaddrinfo socket.getaddrinfo = _getaddrinfo class TiebaSpider: def __init__(self,tieba_name): self.tieba_name = tieba_name self.headers = { "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36" } def get_url_list(self): url_temp = "https://tieba.baidu.com/f?kw=" + self.tieba_name + "&ie=utf-8&pn={}" url_list = [url_temp.format(i*50) for i in range(100)] return url_list def parse_url(self,url): print("now parsing url",url) respOnse= requests.get(url,headers=self.headers) return response.content.decode() def run(self): url_list = self.get_url_list() for url in url_list: html_str = self.parse_url(url) if __name__ == '__main__': t1 = time.time() _setDNSCache() tieba_spider = TiebaSpider("李毅") tieba_spider.run() print(time.time()-t1)
![]() | 1 wwqgtxx 2017-10-07 12:27:25 +08:00 你是不是应该先测试一下缓存命中率 |
![]() | 2 shn7798 2017-10-07 13:41:06 +08:00 ![]() 除了第一个请求,后续的请求应该的都是命中缓存的。 不过百度服务器毕竟不是放在你旁边,同样的 URL 每次的网络耗时都是不同的,所以这样用来对比是没啥意义的。 我的感觉瓶颈不在 DNS,建议使用 https://github.com/rkern/line_profiler 这个工具来分析一下每行代码的耗时,这样就能找出瓶颈了。 |
![]() | 3 mengskysama 2017-10-08 10:49:02 +08:00 via iPhone 这个 dns 缓存意义不大,系统本来就有一层 dns 缓存。我猜换成 session 会快很多,时间都花在 ssl 隧道和 tcp 握手 |