2

こんにちはみんな!私は小さなウェブページクローラー関数を書きました。しかし、私はマルチスレッドに不慣れであり、それを最適化することができませんでした。私のコードは次のとおりです。

alreadySeenURLs = dict() #the dictionary of already seen crawlers
candidates = set() #the set of URL candidates to crawl

def initializeCandidates(url):

    #gets page with urllib2
    page = getPage(url)

    #parses page with BeautifulSoup
    parsedPage = getParsedPage(page)

    #function which return all links from parsed page as set
    initialURLsFromRoot = getLinksFromParsedPage(parsedPage)

    return initialURLsFromRoot 

def updateCandidates(oldCandidates, newCandidates):
    return oldCandidates.union(newCandidates)

candidates = initializeCandidates(rootURL)

for url in candidates:

    print len(candidates)

    #fingerprint of URL
    fp = hashlib.sha1(url).hexdigest()

    #checking whether url is in alreadySeenURLs
    if fp in alreadySeenURLs:
        continue

    alreadySeenURLs[fp] = url

    #do some processing
    print url

    page = getPage(url)
    parsedPage = getParsedPage(page, fix=True)
    newCandidates = getLinksFromParsedPage(parsedPage)

    candidates = updateCandidates(candidates, newCandidates)

ご覧のとおり、ここでは特定の時間に候補者から1つのURLを取得します。このスクリプトをマルチスレッド化して、候補から少なくともN個のURLを取得し、その作業を実行できるようにしたかったのです。誰かが私を導くことができますか?リンクや提案はありますか?

4

1 に答える 1

1

次の 2 つのリンクから開始できます。

  1. Python でのスレッド化に関する基本的なリファレンス http://docs.python.org/library/threading.html

  2. Python でマルチスレッド URL クローラーを実際に実装するチュートリアル http://www.ibm.com/developerworks/aix/library/au-threadingpython/

さらに、すでに Python 用のクローラーがあります: http://scrapy.org/

于 2012-05-23T14:59:39.047 に答える