def survey(top_url, h = 3, max_state = 10000, similarity = 0.95): #コントロール変数 target_netloc = _get_netloc(top_url) elements = [] result = {} history = {} cl = urlclass.fisherclassifier(urlclass.GetUrlFeatures) #初期要素 element = {'url' : top_url, 'step' : 0, 'referer' : '_SearchEngine'} elements.append(element) history.setdefault(top_url, 1) #クローリングしてリンクを抽出する j = 0 while len(elements) > 0 and len(result) < max_state: e = elements.pop(0) if j % 10 == 0: print j, e['step'], len(elements), len(result) #URLと遷移数とリンク元をデータとして保存する if result.has_key(e['url']) == False: try: site = urlopen(e['url']).read() soup = BeautifulSoup(site) links = soup.findAll('a') result.setdefault(e['url'], {}) result[e['url']].setdefault(e['step'], []) result[e['url']][e['step']].append(e['referer']) for link in links: try: url = link['href'] netloc = _get_netloc(url) #netlocが自分のサイトであり、遷移数が設定値以下で、未調査URLの場合には新たな調査候補として加える if netloc.find(target_netloc) != -1 and e['step'] + 1 < h and result.has_key(url) == False: exist, redirect_url = httpExists(url) #リンクが存在するかをチェックする #リダイレクト先が存在していなければ、調査候補として加える if exist == True and result.has_key(redirect_url) == False and history.has_key(redirect_url) == False: elements.append({'url' : redirect_url, 'step' : e['step'] + 1, 'referer' : e['url']}) history.setdefault(redirect_url, 1) except: pass except: print 'Crawling ERROR', e['url'] else: result.setdefault(e['url'], {}) result[e['url']].setdefault(e['step'], []) result[e['url']][e['step']].append(e['referer']) j += 1 result = find_similar(result, similarity = similarity) return result
def url_train(self, url, criteria = 0.8): result, redirect_url = httpExists(url) if result == True: if redirect_url == url: self.train(url, 'exist') self.setminimum('exist', criteria) else: self.train(redirect_url, redirect_url) self.setminimum(redirect_url, criteria) else: self.train(url, 'none') self.setminimum('none', criteria) return result, url, redirect_url
def _cut_by_uu(data, uu_volume = 0.01): for h, s in data.items(): for state, v in s.items(): rate = float(v['uu']) / float(v['netloc_uu']) if v['netloc_uu'] != 0 else 0 if rate >= uu_volume: data[h][state]['is_state'] = True else: #PV自体は多くないが正規表現でまとめると一定数以上あるstateはstateとして採用する rate_state = float(v['state_uu']) / float(v['netloc_uu']) if v['netloc_uu'] != 0 else 0 if rate_state >= uu_volume: data[h][state]['is_state'] = True res, redirect = httpExists(state) data[h][state]['is_regular'] = True if res == False else False #正規表現でまとめ場合には下位階層に関してはstateとして採用しないようにする if data[h][state]['is_regular'] == True: data[h][state]['next_adopt'] = False else: data[h][state]['is_state'] = False return data