使用python判斷網(wǎng)站是否存在CDN

有些網(wǎng)站會(huì)做cdn,當(dāng)你測(cè)試一個(gè)網(wǎng)站時(shí)剧蹂,測(cè)了半天少态,發(fā)現(xiàn)你跑偏了,這時(shí)想死的心都有了蹦误。。肉津。强胰。。

可以通過dns的cname記錄和http返回頭來判斷是否使用了cdn
CNAME:
我做的百度云加速妹沙,cname配置
www.reber.com他會(huì)讓你cname到www.reber.com.cname.yunjiasu-cdn.net.

這時(shí)你可以nslookup偶洋,得到結(jié)果如下:
C:\Users\xxx >nslookup www.xxx.com
服務(wù)器:  public1.114dns.com
Address:  114.114.114.114

非權(quán)威應(yīng)答:
名稱:    www.xxx.com.cname.yunjiasu-cdn.net
Addresses:  162.159.210.12
          162.159.211.12
Aliases:  www.xxx.com

其中yunjiasu-cdn.net就是百度云cdn特有的特征串,我們可以根據(jù)特征串來判別是否使用了cdn距糖,用了哪一家的cdn
HTTP返回包:
Http返回頭有類似下面的信息也可判斷為使用了cdn
X-Via: 1.1 zhshx14:3 (Cdn Cache Server V2.0), 1.1 oudxin55:6 (Cdn Cache Server V2.0)

首先安裝dnspython模塊:pip install dnspython

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import dns.resolver
import urllib2
import urlparse

class CdnCheck(object):
    def __init__(self, url):
        super(CdnCheck, self).__init__()
        self.cdninfo()
        self.url = url
        self.cnames = []
        self.headers = []

    def get_cnames(self): # get all cname
        furl = urlparse.urlparse(self.url)
        url = furl.netloc
        # print url

        rsv = dns.resolver.Resolver()
        # rsv.nameservers = ['114.114.114.114']
        try:
            answer = dns.resolver.query(url,'CNAME')
        except Exception as e:
            self.cnames = None
            # print "ERROR: %s" % e
        else:
            cname = [_.to_text() for _ in answer][0]
            self.cnames.append(cname)
            self.get_cname(cname)

    def get_cname(self,cname): # get cname
        try:
            answer = dns.resolver.query(cname,'CNAME')
            cname = [_.to_text() for _ in answer][0]
            self.cnames.append(cname)
            self.get_cname(cname)
        except dns.resolver.NoAnswer:
            pass

    def get_headers(self): # get header
        try:
            resp = urllib2.urlopen(self.url)
        except Exception as e:
            self.headers = None
            # print "ERROR: %s" % e
        else:
            headers = str(resp.headers).lower()
            self.headers = headers

    def matched(self, context, *args): # Matching string
        if not isinstance(context, basestring):
            context = str(context)

        func = lambda x, y: y in x
        for pattern in args:
            if func(context,pattern):
                return pattern
        return False

    def check(self):
        flag = None
        self.get_cnames()
        self.get_headers()
        if self.cnames:
            # print self.cnames
            flag = self.matched(self.cnames,*self.cdn['cname'])
            if flag:
                return {'Status':True, 'CDN':self.cdn['cname'].get(flag)}
        if not flag and self.headers:
            flag = self.matched(self.headers,*self.cdn['headers'])
            if flag:
                return {'Status':True, 'CDN':'unknown'}
        return {'Status':False, 'CNAME':self.cnames, 'Headers':self.headers}

    def cdninfo(self):
        self.cdn = {
            'headers': set([
                'via',
                'x-via',
                'by-360wzb',
                'by-anquanbao',
                'cc_cache',
                'cdn cache server',
                'cf-ray',
                'chinacache',
                'verycdn'
                'webcache',
                'x-cacheable',
                'x-fastly',
                'yunjiasu',
            ]),
            'cname': {
                'tbcache.com':u'taobao', # 應(yīng)該是淘寶自己的玄窝。。悍引。恩脂。
                'tcdn.qq.com':u'tcdn.qq.com', # 應(yīng)該是騰訊的。趣斤。俩块。
                'yunjiasu-cdn':u'Baiduyun', # 百度云加速
                'kunlunar.com':u'ALiyun', # 阿里云
                'kunlunca.com':u'ALiyun', # 阿里云
                'kxcdn.com':u'KeyCDN', # KeyCDN
                'lswcdn.net':u'Leaseweb', # Leaseweb
                'lxcdn.com':u'ChinaCache', # 網(wǎng)宿科技
                'lxdns.com':u'ChinaCache', # 網(wǎng)宿科技
                # 其余的特征可以自己找一下
            }
        }

if __name__ == '__main__':
    # url = "http://www.xxx.com"
    url = sys.argv[1]
    cdn = CdnCheck(url)
    print cdn.check()
結(jié)果如下:
C:\Users\xxx\Desktop>python check_cdn.py http://www.xxx.com
{'Status': True, 'CDN': u'Baiduyun'}

C:\Users\xxx\Desktop>python check_cdn.py http://v.ifeng.com
{'Status': True, 'CDN': u'ChinaCache'}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市浓领,隨后出現(xiàn)的幾起案子玉凯,更是在濱河造成了極大的恐慌,老刑警劉巖镊逝,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件壮啊,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡撑蒜,警方通過查閱死者的電腦和手機(jī)歹啼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來座菠,“玉大人狸眼,你說我怎么就攤上這事≡〉危” “怎么了拓萌?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長升略。 經(jīng)常有香客問我微王,道長屡限,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任炕倘,我火速辦了婚禮钧大,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘罩旋。我一直安慰自己啊央,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布涨醋。 她就那樣靜靜地躺著瓜饥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪浴骂。 梳的紋絲不亂的頭發(fā)上乓土,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音靠闭,去河邊找鬼帐我。 笑死坎炼,一個(gè)胖子當(dāng)著我的面吹牛愧膀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谣光,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼檩淋,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了萄金?” 一聲冷哼從身側(cè)響起蟀悦,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎氧敢,沒想到半個(gè)月后日戈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡孙乖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年浙炼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片唯袄。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡弯屈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出恋拷,到底是詐尸還是另有隱情资厉,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布蔬顾,位于F島的核電站宴偿,受9級(jí)特大地震影響湘捎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜窄刘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一消痛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧都哭,春花似錦秩伞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至穆趴,卻和暖如春脸爱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背未妹。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國打工簿废, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人络它。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓族檬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親化戳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子单料,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容