你会如何让这个脚本运行得更快?

时间:2014-02-10 03:45:11

标签: python web-scraping webpage performance processing-efficiency

import urllib2
import time

def hunt(url, start="<blockquote>", end="</blockquote>"):
    while 1:
        x = urllib2.urlopen(url)
        y = x.read()
        print y[y.find(start):y.find(end)]
        time.sleep(1)

我正在尝试不断更新网页上的单个元素,包括避免被服务器禁止的时间间隔。它不一定是python,顺便说一句。

1 个答案:

答案 0 :(得分:0)

让我们尝试一下实验来比较str.find()re.search()的速度:

import timeit

setup = '''
import urllib2
import re
start = "<body>"
end = "</body>"
url = 'http://www.stackoverflow.com'
req = urllib2.urlopen(url)
res = req.read()
regex = re.compile('%s.+?%s' % (start, end))
'''

timeit.timeit('''res[res.find(start):res.find(end)]''',
    setup = setup, number = 1000)

timeit.timeit('''res[res.find(start):res.rfind(end)]''',
    setup = setup, number = 1000)

timeit.timeit('''regex.search(res)''',
    setup = setup, number = 1000)

有了这个,我们得到:

0.16357661195633

0.08454644330907968

0.2768974693601649

所以看起来str.find()速度相当不错,但是如果你知道你的结尾语句会比开头更接近结尾,你可以使用str.rfind()加快速度。

您可以做的另一件事是使用多个线程。启动一个不断获取URL并将其放入队列的线程,然后让另一个线程处理队列。这样,当第一个线程在等待IO时休眠时,第二个线程将处理来自前一个URL的字符串。大致沿着这些方向的东西:

import Queue
import threading
import urllib2

q = Queue.Queue()
results = []

url = 'http://www.google.com/'
start = '<body>'
end = '</body>'

def get_urls():
    while 1:
        req = urllib2.urlopen(url)
        res = req.read()
        print "putting data len", len(res)
        q.put(res)

def process_url():
    url_data = q.get()
    result = url_data[url_data.find(start):url_data.find(end)]
    results.append(result)
    q.task_done()

putter_thread = threading.Thread(target = get_urls)
getter_thread = threading.Thread(target = process_url)

putter_thread.start()
getter_thread.start()