python 网站CDN

#coding:utf-8
import os
import sys
import tld
import time
import chardet

import get_header
import random
import socket
import requests
import builtwith
import dns.resolver
import urllib2
import pymongo
import urlparse
import mongo
from BeautifulSoup import BeautifulSoup  
#from Config import FileConfig


add_time = time.strftime('%Y-%m-%d',time.localtime(time.time()))

class Url_Check(object):
    def __init__(self, url):
        super(Url_Check, 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 conn_url(self):
        """"""
        try:
            
            req = urllib2.Request(self.url,headers=get_header.get_header())
            resp = urllib2.urlopen(req)
        except Exception as e:
            print '[-] self.url:' + self.url 
            print str(e)
        else:
            return resp
    
    def get_headers(self): # get header
        try:
            resp = self.conn_url()
        except Exception as e:
            self.headers = None
            # print "ERROR: %s" % e
        else:
            headers = str(resp.headers).lower()
            self.headers = headers
            
            
    #----------------------------------------------------------------------
    def get_ip(self):
        """"""
        try:
            domain_url = str(self.url.strip())[7:]
            ip_url = socket.getaddrinfo(domain_url,'http')[0][4][0]
            #ip_url = socket.gethostbyname(url)
            return ip_url
        except Exception,e:
            pass
        
        
    #----------------------------------------------------------------------
    def get_title(self):
        """"""
        try:
        
            html = urllib2.urlopen(self.url).read()
            encoding = str(chardet.detect(html)['encoding'])
        
            if encoding == 'GB2312':
                soup = BeautifulSoup(html,fromEncoding="GB18030")  
        
            else:
                soup = BeautifulSoup(html,fromEncoding=encoding)  
            #print url.strip() +':'+ str(encoding) +':'+ soup.title.string
            return soup.title.string
        except Exception,e:
            print str(e)
        
    #----------------------------------------------------------------------
    def get_cms_url(self):
        """"""
        try:
            cms_url = builtwith.parse(self.url) 
        except Exception,e:
            
            pass 
        else:
            #print 'cms_rule succccesss'
            return cms_url
            
    #----------------------------------------------------------------------
    def matched(self, context, *args): # Matching string 
        if not isinstance(context, basestring):
            context = str(context)

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

    def check(self):
        try:
            flag = None
            self.get_cnames()
            self.get_headers()            
            if self.cnames:
                # print self.cnames
                flag = self.matched(self.cnames,*self.cdn['cname'])
                if flag:
                    print '[+]  ' + self.url + 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}
        except Exception,e:
            pass

    def cdninfo(self):
        self.cdn = {
            'headers': set([
 
    #----------------------------------------------------------------------
    def update_mongo(self):
        """"""
        cms_url = self.get_cms_url()
        title_url = self.get_title()
        ip_url = self.get_ip()
        cdn_url = self.check()
        mongo.ls_Info.update({"URL":self.url},
                             {"$set": {'add_time':add_time,'title':title_url,
                                       'IP':ip_url,'Info':cms_url,'CDN':cdn_url}},
                             upsert = True)
        print self.url + '     end'


if __name__ == '__main__':
    #url = 'http://www.163.com'

    with open('test.txt') as f:
        u = f.readlines()
        for uu in u:
            url = uu.strip('\r').strip('\n')
            print url
            cdn = Url_Check(url)
            print cdn.check()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,277评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,777评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,946评论 0 245
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,271评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,636评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,767评论 1 221
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,989评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,733评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,457评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,674评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,155评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,518评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,160评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,114评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,898评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,822评论 2 280
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,705评论 2 273

推荐阅读更多精彩内容