0

これが私のコードです(リンク):

import urllib, urllib2, re
import threading, Queue

somewebsite = 'xxx' 

urls5 = []
for i in range(50001, 60000):
    url = somewebsite + str(i)
    urls5.append(url)

class MultiUrl(threading.Thread):  
    def __init__(self, queue):  
        threading.Thread.__init__(self)  
        self.queue = queue
    def run(self):  
        while True:  
            url = self.queue.get()
            try:  
                Go(url)
            except:  
                continue  
            self.queue.task_done()


def main():
    queue = Queue.Queue()
    for i in range(16):  
        t = MultiUrl(queue)  
        t.setDaemon(True)   
        t.start() 

    for url in urls5:
        queue.put(url) 
    queue.join()

def Go(url):
    try:
        print "Now grabbing...", url
        getArticle(url)
        if (OriginalContentList != []):
            writeContent()
    except:
        pass

def getArticle(url):
    global content, Content
    i = re.findall('\d+', url)[0]
    ArticleID = str(i)
    try:
        content = urllib2.urlopen(url).read()
        Content = urllib.unquote(content)
    except:
        OriginalContentList = []
        pass

def writeContent():
    # Origin Content
    try:
        filename = ArticleID + '.txt'
        file_out = open(filename, 'w')
        file_out.write(Content)
        file_out.write('\n')
        file_out.close()
    except:
        pass

if __name__ == '__main__':
    main()

シングル スレッド クロールではそれほど多くの記事 (>=200000) を処理できないため、Google でスレッドとキューを選択しました。

問題は、プログラムがコンテンツを対応するファイルに書き込めないことです。たとえば、No.55555 の内容を 55666.txt に書き込む可能性があります。

私の説明が正確でない場合はコメントしてください。

4

2 に答える 2

0

グローバル変数は複数のスレッドで共有されます。1 つのスレッドが変数を上書きしている間に、別のスレッドが変数を読み取っている可能性があります。

可能であれば、グローバル変数を使用しないでください。

于 2013-06-12T05:56:54.303 に答える
0

マルチスレッドを実装する簡単な方法がありますが、どこから来たのか忘れてしまいました..

from multiprocessing.dummy import Pool as ThreadPool
pool = ThreadPool(5)
results = pool.map(function_name, url_list)
pool.close()
pool.join()

欠点は、エラーを処理できないことです。そのため、その関数を適切に記述する方法を検討する必要があります。ipdbは優れたツールです。

また、Web コンテンツにアクセスするためのより便利なライブラリ: requests

およびコンテンツ ストレージ: PyMongo

于 2015-02-10T07:22:56.950 に答える