0
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

我会试着找出服务器的速率限制,但在客户端我也想更快地进行解析。我的意思是像华尔街一样快速。 – paranoidhominid

+0

该网站是否有API?也许你可以获得价值,而无需拉动整个页面。 –

回答

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并将它们放入队列的线程,然后让另一个线程处理Queue。这样,当第一个线程在等待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()