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(d),选择线程和队列。

问题是:程序无法将内容写入相应的文件。例如,它可以将 No.55555 的内容写入 55666.txt 。

如果我的描述不准确,请发表评论。

4

2 回答 2

0

有一个简单的方法来实现多线程,但我忘记它是从哪里来的..

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

不足之处在于,它无法处理错误,因此您应该考虑如何正确编写该函数。ipdb是一个很棒的工具。

还有更方便的访问 Web 内容的库:请求

和内容存储:PyMongo

于 2015-02-10T07:22:56.950 回答
0

全局变量由多个线程共享。一个线程可以覆盖一个变量,而另一个线程正在读取它。

尽可能避免使用全局变量。

于 2013-06-12T05:56:54.303 回答