Python技术栈

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 8063|回复: 100

[爬取案例] Python爬虫自动获取whois信息的方法源码

  [复制链接]

17

主题

20

帖子

61

积分

注册会员

Rank: 2

积分
61
发表于 2018-12-12 09:49:22 | 显示全部楼层 |阅读模式
通过Python代码自动获取域名查询服务信息的方法。Python爬虫自动获取whois信息的方法源码示例提供。以前有看过python通过socket查询whois的方法,这次我们要使用的方法python 模块是subprocess、Spider等,python whois 查询具体操作方法大家可自行先学习下。
下面开始正式的Python爬虫自动获取whois信息的方法源码部分:
[Python] 纯文本查看 复制代码
#!/usr/bin/python
#Python 解释器路径 
 
# -*- coding: utf-8 -*-
#编码声明 
 
 
import subprocess
from webauth.common.spider.base import Spider
#导入方法模块 获取whois信息
 
#代码块如下:
def get_whois(domain):
    try:
        p = subprocess.Popen(["whois %s" % domain], stdout=subprocess.PIPE, shell=True)
        out = p.communicate()[0]
        return get_info(out)
    except:
        return None, None
         
def get_info(content):
    """获取whois 信息"""
    url = ''
    templates = [
        {
          'email': ur'''(?P<email>[0-9a-zA-Z_-]*?@[0-9a-zA-Z\.]*)''',
         }
    ]
    spider = Spider(url, templates)
     
    msg = 'success'
    cmp, name, addr, email, phone = None, None, None, None, None
 
    lines = content.split('\n')
 
    if content.find('Registrant Contact:') != -1:
        add_start, start = False, False
        index = 0
 
        for line in lines:
            if not email and start:
                email_info = spider.get_info(line, spider.templates[0]['email'])
                if email_info:
                    email = email_info['email']
 
            if line.find("Registrant Contact:") != -1:
                start = True
                continue
 
            if start and index <= 6:
                if index == 0:
                    cmp = line.strip()
                elif index == 1:
                    name = line.strip()
                elif not line.strip():
                    pass
                elif line.strip().startswith('Fax:'):
                    add_start = True
                    addr = ''
                elif add_start:
                    addr += ' %s' % line.strip()
                index += 1
 
    elif content.find('Registrars.') != -1:
 
        for line in lines:
            line = line.strip()
            if line.startswith('Organisation Name....'):
                name = line[len('Organisation Name....'):].strip()
                cmp = name
 
            elif line.startswith("Organisation Address."):
                addr = addr if addr else ''
                addr += " %s" % line[len("Organisation Address."):].strip()
 
            elif line.startswith("Admin Email.........."):
 
                email = line[len('Admin Email..........'):].strip()
            elif line.startswith("Admin Phone.........."):
                phone = line[len('Admin Phone..........'):].strip()
 
    elif content.startswith('Domain Name'):
 
        for line in lines:
            line = line.strip()
 
            if line.startswith('Registrant Organization:'):
                cmp = line[len('Registrant Organization:'):].strip()          
 
            elif line.startswith('Registrant Name:'):
                name = line[len('Registrant Name:'):].strip().decode('utf8')
 
            elif line.startswith('Administrative Email:'):
                email = line[len('Administrative Email:'):].strip()
 
            elif line.startswith('Registrant Organization:'):
                cmp = line[len('Registrant Organization:'):].strip()
 
                #[url]www.iplaypy.com[/url] 玩蛇网
     
    elif content.find("Registrant Name") != -1 and content.find("Registrant Organization") != -1 \
         and content.find("Registrant Country") != -1:
        street, city, state, post, country = '', '', '', '', ''
 
        for line in lines:
 
            if line.startswith('Registrant Name:'):
                name = line[len('Registrant Name:'):].strip()          
 
            elif line.startswith('Registrant Organization:'):
                cmp = line[len('Registrant Organization:'):].strip().decode('utf8')
 
            elif line.startswith('Registrant Phone:'):
                phone = line[len('Registrant Phone:'):].strip()
 
            elif line.startswith('Registrant Email:'):
                email = line[len('Registrant Email:'):].strip() 
 
            elif line.startswith('Registrant Street1'):
                street = line[len('Registrant Street1'):].strip()
 
            elif line.startswith('Registrant City:'):
                city = line[len('Registrant City:'):].strip()
 
            elif line.startswith('Registrant State/Province:'):
                state = line[len('Registrant State/Province:'):].strip()
  
           elif line.startswith('Registrant Postal Code:'):
                post = line[len('Registrant Postal Code:'):].strip()
 
            elif line.startswith('Registrant Country:'):
2000
 
                country = line[len('Registrant Country:'):].strip()
        addr = '%s %s %s %s %s' % (street, city, state, post, country)         
 
    elif content.find('NOT FOUND') != -1 or content.find('no matching record') != -1:
        msg = 'error'    
 
    else:
        msg = 'exception'
         
    if not email:
        email_info = spider.get_info(content, spider.templates[0]['email'])
 
        if email_info:
            email = email_info['email']
 
    if name:
        name = name.replace("()", "")
               
    return msg, {'addr': addr, 'name': name, 'email': email, 'phone': phone, 'raw_data': content}
 
if __name__ == '__main__':
    import sys
 
    if len(sys.argv) == 2:
        print get_whois(sys.argv[1])
    else:
        print "pleas pass a domain"

Python 总 群
回复

使用道具 举报

0

主题

2

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2018-12-12 09:50:31 | 显示全部楼层
发发呆,回回帖,工作结束~
Python 总 群
回复

使用道具 举报

0

主题

5

帖子

20

积分

新手上路

Rank: 1

积分
20
发表于 2018-12-12 14:12:35 | 显示全部楼层
学习下
Python 总 群
回复

使用道具 举报

0

主题

2

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2018-12-12 19:30:24 | 显示全部楼层
发发呆,回回帖,工作结束~
Python 总 群
回复

使用道具 举报

4

主题

12

帖子

42

积分

新手上路

Rank: 1

积分
42
发表于 2018-12-12 21:09:39 | 显示全部楼层
高手云集 果断围观
Python 总 群
回复

使用道具 举报

0

主题

3

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2018-12-12 22:56:32 | 显示全部楼层
看起来不错
Python 总 群
回复

使用道具 举报

0

主题

6

帖子

22

积分

新手上路

Rank: 1

积分
22
发表于 2018-12-13 08:10:18 | 显示全部楼层
LZ是天才,坚定完毕
Python 总 群
回复

使用道具 举报

0

主题

5

帖子

20

积分

新手上路

Rank: 1

积分
20
发表于 2018-12-13 13:51:34 | 显示全部楼层
啊啊啊啊啊啊啊啊啊啊啊
Python 总 群
回复

使用道具 举报

0

主题

5

帖子

20

积分

新手上路

Rank: 1

积分
20
发表于 2018-12-13 15:47:25 | 显示全部楼层
传说中的沙发???哇卡卡
Python 总 群
回复

使用道具 举报

0

主题

8

帖子

18

积分

新手上路

Rank: 1

积分
18
发表于 2018-12-13 16:00:39 | 显示全部楼层
鼎力支持!!
Python 总 群
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


QQ|Archiver|手机版|小黑屋|Python.BBS ( 鲁ICP备18046958号 )

GMT+8, 2020-1-21 18:00 , Processed in 0.283406 second(s), 42 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表