-1

などの大学の URL のリストがwww.harvard.edu, www.berkeley.eduあります。それぞれの Web サイトで CSE 部門の URL を見つける必要があります。最初にやろうとしたことは、指定された URL のリンクをクロールし、深さを指定することでした。3 と言って、リンクをたどって試します。 cse、computer、またはそのページでスクレイピングされたリンク内の単語のリストを見つけるには、一致するリンクとそのアンカー テキストが結果として csv ファイルに返されます。cse などの単語を含むリンクがない場合は、not found を返す必要があります。そのような考えは、csv ファイルを後でデータベースにプッシュすることです。これどうやってするの?

4

2 に答える 2

0

問題を解決するには、scrapyフレームワークを使用できます。

スクレイピーウェブから抽出:

Scrapy は、高速で高レベルのスクリーン スクレイピングおよび Web クローリング フレームワークであり、Web サイトをクロールし、そのページから構造化データを抽出するために使用されます。データマイニングからモニタリング、自動テストまで幅広い用途に使用できます。

于 2012-11-07T11:00:28.150 に答える
0

これは非常に複雑な作業であり、次のような構造を使用してデータベースを使用することをお勧めします。

TABLE pages (
    `absolute_url` VARCHAR(255) NOT NULL,
    `visited` TINYINT(1) DEFAULT 0,
    -- Additional fields
    UNIQUE KEY (`absolute_url`)
)

少し説明:

  • absolute_urlページへの完全な URL ( で始まるhttp[s]://) が含まれており、一意のインデックスが配置されています。このようにして、再帰に陥ったり、複数のリンクを2回処理したりしないようにします
  • visitedサイトが既に訪問されたかどうか (および処理されたかどうか) を通知します。このフィールドは、2 回の訪問を防ぐために重要であり、プログラムがクラッシュした場合 (つまり、ネットワークのダウンタイム) に正常に回復できるようにします。

CSV を介して独自に実装することも、配列を関連付けることもできますが、データベースは私にとって最も馴染みのあるソリューションです。

アルゴリズムは次のようになります。

database.insert( 'http://www.harvard.edu')
database.insert( 'http://www.berkeley.edu')

# In case of failure you'll start at this point:
while database.get_count( WHERE visited = 0) < 0:

    for url in database.get_records( WHERE visited = 0):
        content = http_client.load(url)
        time.sleep(5) # You don't want to flood server

        # Problematic URLs will be parsed later
        if (not content) or (http_client.is_error):
            continue; 

        for i in content.get_all_urls():
            i = make_absolute(i, url)

            # Also don't crawl remote sites, images, ...
            if not is_valid_url(i):
                continue
            database.insert(i)

これは疑似コードです。すべてを実装するわけではありません。

于 2012-11-07T11:10:18.330 に答える