如何加速Python中的网页抓取?

时间:2014-04-01 13:45:37

标签: python web-services web-crawler urllib

我使用urllib.urlopen()方法和BeautfulSoup进行抓取。我对浏览速度不满意,并且我正在考虑urllib正在解析什么,猜测它只能加载超过html。无法在文档中找到默认情况下读取或检查更大数据(图像,闪光灯......)。

那么,如果urllib必须加载ie images,flash,js ......如何避免对这些数据类型的GET请求?

2 个答案:

答案 0 :(得分:3)

尝试requests - 它实现了HTTP连接池,加快了抓取速度。

此外,它还可以比urllib更好地处理cookie,auth等其他内容,并且可以与BeautfulSoup配合使用。

答案 1 :(得分:2)

使用线程!这非常简单。这是一个例子。您可以根据需要更改连接数。

import threading, Queue
import urllib

urls = [
    'http://www.google.com',
    'http://www.amazon.com',
    'http://www.ebay.com',
    'http://www.google.com',
    'http://www.amazon.com',
    'http://www.ebay.com',
    'http://www.google.com',
    'http://www.amazon.com',
    'http://www.ebay.com',    
    ]

queue = Queue.Queue()
for x,url in enumerate(urls):
    filename = "datafile%s-%s" % (x,url)
    queue.put((url, filename))


num_connections = 10

class WorkerThread(threading.Thread):
    def __init__(self, queue):
        threading.Thread.__init__(self)
        self.queue = queue

    def run(self):
        while 1:
            try:
                url, filename = self.queue.get_nowait()
            except Queue.Empty:
                raise SystemExit

            urllib.urlretrieve(url,filename.replace('http://',''))

# start threads
threads = []
for dummy in range(num_connections):
    t = WorkerThread(queue)
    t.start()
    threads.append(t)


# Wait for all threads to finish
for thread in threads:
    thread.join()