Python+DNS+MySQL

Python+DNS+MySQL

具体任务和上一次一样,不过这次更细致具体
1.先在数据库中创建好Domain_info表格
打开数据库使用WJX数据库创建表

CREATE TABLE Domain_info(
ID int(12) AUTO_INCREMENT,
Domain char(20),
A_record char(20),
NS_record char(30),
Domain_local char(10),
Insert_time char(30),
PRIMARY KEY(ID))
ENGINE = InnoDB, CHARSET = 'UTF8';

这样一张表就创建好了
先在表中对自增变量插入数据

USE WJX;
INSERT INTO Domain_info(ID)VALUES(1);

插入数据后是这样
这里写图片描述
下面用Python插入我们想要的数据(前面的程序完全可以在Python中完成)
我们要使用的模块

import DNS
import MySQLdb
import requests
import re
import sys
import time
from time import ctime

第一步,使用在主函数中通过读取文件获得的域名,通过DNS请求获得对应域名的A_record,也就是IP地址

def FindIp(Domain):
    query = sys.argv[0]
    DNS.DiscoverNameServers()
    reqobj = DNS.Request(Domain)
    answerobj = reqobj.req(name = query, qtype = DNS.Type.A)
    if not len(answerobj.answers):
        return 
    for item in answerobj.answers:
        A_record = "%s" % item['data'] 
    return A_record

同样的NS_reocrd也能通过同样的方式来获取、

def FindNS(Domain):
    query = sys.argv[0]
    DNS.DiscoverNameServers()
    reqobj = DNS.Request(Domain)
    answerobj = reqobj.req(name = query, qtype = DNS.Type.NS)
    if not len(answerobj.answers):
        return 
    for item in answerobj.answers:
        NS_record = "%s" % item['data'] 
    return NS_record

然后继续寻找Domain对应的地理位置
在这里我们使用requests.get()函数来爬取页面信息
我们知道ip138网站可以查询ip地理位置,并且其URL是
http://www.ip138.com/ips138.asp?ip=“要查询的ip地址”&action=2的模式,所以我们不难要得到我们想要的ip地理位置信息

def FindAdre(A_record):
    if A_record:
        try:
            adre_url= "http://www.ip138.com/ips138.asp?ip="+A_record+"&action=2"
            adre_get= requests.get(adre_url)
            adre_get.raise_for_status()
            adre_get.encoding = "gb2312"
            keyword = re.compile(r'''<td align="center"><ul class="ul1"><li>(.*?)</li><li>''', re.U|re.S)
            unic = keyword.findall(adre_get.text)
            Domain_local = ''.join(unic)
            return Domain_local[5:]
        except:
            print "error"
    else :
        return  0

通过爬取页面,我们得到了我们想要到地理位置信息
“本站数据:XXXX”
为了简化Domain_local,使用了字符串处理Domain_local[5:]来对地理位置信息简化,去掉了前面的“本站数据:”

接来下是向创建好的数据库插入数据

def MySQLSave(NS_record, Domain, A_record, Domain_local):
    db = MySQLdb.connect("XXX.XX.XXX.X","root","******","WJX",charset = "utf8")
    '''db = MySQLdb.connect("localhost","root","949501","WJX",charset = "utf8")'''
    cursor = db.cursor()
    cursor.execute('INSERT INTO Domain_info (Domain, A_record, Domain_local, NS_record, Insert_time) \
     values ( %s, %s, %s, %s, %s)', [Domain, A_record, Domain_local, NS_record,  ctime()])
    db.commit()
    return 

最后是主函数

def main():
    start = time.time()
    a = open("URL.txt",'r')
    '''fo_0 = open("adre.txt",'w')'''
    '''fo_1 = open("ip.txt",'w') '''
    num = 0
    while (num < 4000):
            Domain = a.readline()[:-1]#去掉每一行最后的空格
            num = num +1
            A_record = FindIp(Domain)
            if A_record:
                NS_record = FindNS(Domain)
                Domain_local = FindAdre(A_record)
                '''fo_1.write(ip+'\n')  '''
                print "%-4d %-40s %-40s  %-40s %-40s" % (
                    num, Domain, A_record, NS_record, 
                     Domain_local) , ctime()
                MySQLSave(NS_record, Domain, A_record, Domain_local)
            else:
                '''fo_1.write("NULL"+'\n')'''
                print "%-4d %-30s %-40s"  %  (num, Domain, "NotFound")
    a.close()
    '''fo_0.close()'''
    '''fo_1.close()'''
    end = time.time()
    print "TIME:  ",end - start, "S"
if __name__=='__main__':
    main()

这个程序还有待改进,单线程总是跑到很慢,而且db.commit() 存储的频率太快,降低了程序的运行速度。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

突然想到前几天有人问我DNS能不能刷浏览量
不可以
因为一旦DNS服务器接收到了你网站的IP地址,他给你返回IP的同时,他会对IP进行缓存,那么你下一次同样的请求他会直接从数据库获取这个映射,返回给你对应IP地址,而不是再一次访问目的网站。
刷浏览量还是通过爬虫或者其他方式吧。

路漫漫,共勉之。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值