0x 00 前言
前天自己在玩的時候,自己通過百度搜索主機的二級域名感覺好麻煩,自已要一頁頁的去翻
而且人工識別是否是重復的二級域名也夠蛋疼的,正好最近在學正則表達式,權當練手了
0x 00 代碼
# coding=utf-8 # author:Anka9080
# environment:Eclipse
import urllib import urllib2 import cookielib import re #site = 'baidu.com' print 'Please input the root site like "baidu.com":' site = raw_input() siteFormat1 = site siteFormat1 = siteFormat1.replace('.', '\.') #print siteFormat1 urlPage = 'http://www.haosou.com/s?src=360sou_newhome&q=site:'+site req = urllib2.Request(urlPage) res = urllib2.urlopen(req) html = res.read().decode('utf-8') # 獲得搜索結果的頁面數 pageStr = re.search(ur'找到相關結果約(.*?)個',html) page = pageStr.group(1) formatNum = '0123456789' for c in page: if not c in formatNum: page = page.replace(c,'') page = int(page) / 10 print 'Total Page: ' + str(page) if page > 6: page = 6 newItems = [] for p in range(1, page): urlDomain = 'http://www.haosou.com/s?src=360sou_newhome&q=site:'+site+'&pn='+str(p) req = urllib2.Request(urlDomain) res = urllib2.urlopen(req) html = res.read().decode('utf-8') tmp = 'linkinfo\"\>\<cite\>(.+?\.'+siteFormat1+')'; pattern = re.compile(tmp) items = re.findall(pattern, html) # 去重操作 for item in items: if item not in newItems: newItems.append(item) print 'SubDomain Count: '+ str(len(newItems) - 1) for item in newItems: # 獲得對應 IP 信息 pattern = re.compile(ur'\>\>\ (.*?)\<\/font[\s|\S]*?本站主數據:(.*?)\<\/li\>') urlIP = 'http://www.ip138.com/ips138.asp?ip='+item req = urllib2.Request(urlIP) res = urllib2.urlopen(req) html = res.read().decode('gb2312') result = re.search(pattern,html) print item + ' ' + result.group(1) + ' ' + result.group(2)
測試結果如下:
Please input the root site like "baidu.com": baidu.com Total Page: 2 SubDomain Count: 9 www.baidu.com 61.135.169.121 北京市 百度蜘蛛 聯通 tieba.baidu.com 123.125.65.93 北京市 聯通 fanyi.baidu.com 202.108.23.153 北京市 聯通 wenku.baidu.com 123.125.70.102 北京市 百度蜘蛛 聯通 map.baidu.com 112.80.248.48 江蘇省南京市 聯通 music.baidu.com 123.125.114.14 北京市 聯通 zhidao.baidu.com 123.125.65.91 北京市 聯通 baike.baidu.com 123.125.70.105 北京市 百度蜘蛛 聯通 yun.baidu.com 123.125.65.51 北京市 聯通 pan.baidu.com 202.108.23.29 北京市 聯通
0x 02 總結
思路大概是這個樣子:
先通過urllib2.Request() 和 urllib2.urlopen()訪問url
再從返回結果中得到搜索結果頁面數
為了提高效率 頁面數 大於 5 會只爬行搜索結果的前5個頁面
后面 又做了去重操作 然后就得到二級域名列表咯 : )
中間蛋疼的 地方倒是 Py 的 轉義符號問題 身邊能有個可以問問的大牛多好~
后期 准備使用 http://dns.aizhan.com/的查詢結果 直接獲得 IP以及旁站信息
==================6.13號更新====================
在知乎上請教后已經解決轉義問題,之前的邏輯沒有理清導致出錯,和編碼並沒有神馬關系(晚上敲代碼很容易出錯哈 ⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄
現在已經可以查出二級域名對應的IP地址以及地理位置信息
感覺http://dns.aizhan.com 的調用比較麻煩,接口已經換成 http://www.ip138.com
文中圖片引自:http://developer.51cto.com/art/201403/431104.htm(原博客鏈接失效)