def dif_html(a, b, lower_criteria = 0.5, upper_criteria = 0.6, link_criteria = 0.4, img_criteria = 0.2, script_criteria = 0.2): from urllib2 import urlopen from difflib import SequenceMatcher from my_stats import jaccard as jac #詳細にページをみる try: html_a, html_b = urlopen(a).read(), urlopen(b).read() matcher = SequenceMatcher() matcher.set_seq1(html_a) matcher.set_seq2(html_b) if matcher.ratio() >= lower_criteria: #lower_criteria以上だけどupper_criteria以下の場合にはリンク構造など詳しく調査する if matcher.ratio() >= upper_criteria: print "white", matcher.ratio(), upper_criteria, lower_criteria, a, b return True else: #ここにnon-negative-matrix-factorizationを入れてより精緻に分析する予定だったけど、まだあまりうまく行かないのでペンディング(T.B.D.) print "grey", matcher.ratio(), upper_criteria, lower_criteria, a, b links_a, titles_a, imgs_a, scripts_a = analyze_html(html_a) links_b, titles_b, imgs_b, scripts_b = analyze_html(html_b) j_links, j_imgs, j_scripts = jac(links_a, links_b), jac(imgs_a, imgs_b), jac(imgs_a, imgs_b) if j_links >= link_criteria and j_imgs >= img_criteria and j_scripts >= script_criteria: return True else: return False #lower_criteria以上に似てない部分がある場合には似てないと判断する else: print "black", matcher.ratio(), upper_criteria, lower_criteria, a, b return False except: #クローリングできない場合には異なるページと見なす return False
def analyze_urls(urls, url_criteria, url_weight): from urlparse import urlparse from my_stats import jaccard_weight as jac sites = [] for url in urls.keys(): sites.append(url) if len(sites) > 1: for i in range(len(sites) - 1): for j in range(i + 1, len(sites)): parsed0, parsed1 = urlparse(sites[i]), urlparse(sites[j]) vec0, vec1 = get_url_vector(parsed0, url_weight), get_url_vector(parsed1, url_weight) similarity = jac(vec0, vec1) if similarity < url_criteria: return True else: return False