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,顺便说一句。
答案 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()