這個模塊在很多爬蟲項目里應該還是挺實用的,不過我是用來批量查詢whois和備案單位的,因為庫里有大量的子域名,所以只需要對同頂級域名的其中一個域名獲取信息即可,否則會造成數據庫大量冗余信息,而且在后期更新的時候還會造成系統及網絡不必要的壓力。

找了這么個提取頂級域名的模塊,當然也可以提取二級,三級。

這個模塊本來時python2.7版本,我改了urlparse模塊和其他的一些語法

代碼量不大,就直接貼上來了

ExtractLevelDomain

github地址:https://github.com/rfyiamcool/ExtractLevelDomain.git

 

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re
from urllib.parse import urlparse
class ExtractLevelDomain():

 def __init__(self):
 self.topHostPostfix = [
 '.com','.la','.io',
 '.co', '.cn','.info',
 '.net', '.org','.me',
 '.mobi', '.us', '.biz',
 '.xxx', '.ca', '.co.jp',
 '.com.cn', '.net.cn', '.org.cn',
 '.mx','.tv', '.ws',
 '.ag', '.com.ag', '.net.ag',
 '.org.ag','.am','.asia',
 '.at', '.be', '.com.br',
 '.net.br',
 '.name',
 '.live',
 '.news',
 '.bz',
 '.tech',
 '.pub',
 '.wang',
 '.space',
 '.top',
 '.xin',
 '.social',
 '.date',
 '.site',
 '.red',
 '.studio',
 '.link',
 '.online',
 '.help',
 '.kr',
 '.club',
 '.com.bz',
 '.net.bz',
 '.cc',
 '.band',
 '.market',
 '.com.co',
 '.net.co',
 '.nom.co',
 '.lawyer',
 '.de',
 '.es',
 '.com.es',
 '.nom.es',
 '.org.es',
 '.eu',
 '.wiki',
 '.design',
 '.software',
 '.fm',
 '.fr',
 '.gs',
 '.in',
 '.co.in',
 '.firm.in',
 '.gen.in',
 '.ind.in',
 '.net.in',
 '.org.in',
 '.it',
 '.jobs',
 '.jp',
 '.ms',
 '.com.mx',
 '.nl','.nu','.co.nz','.net.nz',
 '.org.nz',
 '.se',
 '.tc',
 '.tk',
 '.tw',
 '.com.tw',
 '.idv.tw',
 '.org.tw',
 '.hk',
 '.co.uk',
 '.me.uk',
 '.org.uk',
 '.vg']

 self.extractPattern = r'[\.]('+'|'.join([h.replace('.',r'\.') for h in self.topHostPostfix])+')$'
 self.pattern = re.compile(self.extractPattern,re.IGNORECASE)
 self.level = "*"

 def parse_url(self,url):
 parts = urlparse(url)
 host = parts.netloc
 m = self.pattern.search(host)
 return m.group() if m else host

 def parse_url_level(self,url,level="*"):
 extractRule = self._parse_regex(level)
 parts = urlparse(url)
 host = parts.netloc
 pattern = re.compile(extractRule,re.IGNORECASE)
 m = pattern.search(host)
 self.level = level
 return m.group() if m else host

 def set_level(self,level):
 extractRule = self._parse_regex(level)
 self.extractPattern = extractRule
 self.pattern = re.compile(self.extractPattern,re.IGNORECASE)
 self.level = level

 def add_top_domain(self,top):
 if not top.startswith('.'):
 raise ValueError('top_domain must have . (.com|.com.cn|.net)')
 if top not in self.topHostPostfix:
 self.topHostPostfix.append(top)
 self._reset()
 return True
 else:
 return False

 def _reset(self):
 set_level(self.level)

 def _parse_regex(self,level):
 extractRule = r'(\w*\.?)%s('+'|'.join([h.replace('.',r'\.') for h in self.topHostPostfix])+')$'
 level = level if level == "*" else "{%s}"%level
 extractRule = extractRule%(level)
 return extractRule

if __name__ == "__main__":
 filter = ExtractLevelDomain()
 #默認等級
 print(filter.level)
 #默認直接輸出域名,剔除url,
 print(filter.parse_url('http://www.pojnfb.tw/tag/linux%E5%B7%A5%E5%85%B7'))
 #可以在參數中定義幾級域名,1代表頂級域名
 print(filter.parse_url_level('http://www.pojnfb.tw/tag/linux%E5%B7%A5%E5%85%B7',level=1))
 #也可以定義屬性
 filter.set_level(1)
 print(filter.parse_url_level('http://www.pojnfb.tw/tag/linux%E5%B7%A5%E5%85%B7',level=1))
 print(filter.level)

您的支持將鼓勵我們繼續創作!

[微信] 掃描二維碼打賞

[支付寶] 掃描二維碼打賞