Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
 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
Ejemplo n.º 3
0
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