2013-06-16 33 views
5

Tôi có tệp có hơn 160.000 url, trong đó các trang tôi muốn xóa một số thông tin. Kịch bản trông gần như thế này:Cạo 160.000 trang - quá chậm

htmlfile = urllib2.urlopen(line) 
htmltext = htmlfile.read() 
regexName = '"></a>(.+?)</dd><dt>' 
patternName = re.compile(regexName) 
name = re.findall(patternName,htmltext) 
if name: 
    text = name[0] 
else: 
    text = 'unknown' 

nf.write(text) 

Tác phẩm nào, nhưng rất, rất chậm. Nó sẽ mất hơn bốn ngày để cạo tất cả 160.000 trang. Bất kỳ đề xuất để tăng tốc độ nó lên?

+2

Sử dụng đa luồng hoặc một yêu cầu không đồng bộ http thư viện như [grequests] (https://github.com/kennethreitz/grequests) – Blender

+2

Hoặc sử dụng hay gây sự. http://scrapy.org/ – Darek

+0

Cảm ơn các đề xuất của bạn, nhưng tôi không biết cách sử dụng grequetsts hoặc scrapy. Tôi là một người mới rất lớn ... – ticktack

Trả lời

2

Một số lời khuyên về mã của bạn:

Khi bạn biên dịch mẫu regex, hãy đảm bảo bạn cũng sử dụng đối tượng được biên dịch. Và tránh biên dịch regex của bạn trong mỗi vòng lặp xử lý.

pattern = re.compile('"></a>(.+?)</dd><dt>') 
# ... 
links = pattern.findall(html) 

Nếu bạn muốn tránh sử dụng các khuôn khổ khác, giải pháp tốt nhất để tăng tốc nó để sử dụng thư viện tiêu chuẩn luồng để có được nhiều kết nối HTTP đi song song.

Something như thế này:

from Queue import Queue 
from threading import Thread 

import urllib2 
import re 

# Work queue where you push the URLs onto - size 100 
url_queue = Queue(10) 
pattern = re.compile('"></a>(.+?)</dd><dt>') 

def worker(): 
    '''Gets the next url from the queue and processes it''' 
    while True: 
     url = url_queue.get() 
     print url 
     html = urllib2.urlopen(url).read() 
     print html[:10] 
     links = pattern.findall(html) 
     if len(links) > 0: 
      print links 
     url_queue.task_done() 

# Start a pool of 20 workers 
for i in xrange(20): 
    t = Thread(target=worker) 
    t.daemon = True 
    t.start() 

# Change this to read your links and queue them for processing 
for url in xrange(100): 
    url_queue.put("http://www.ravn.co.uk") 

# Block until everything is finished. 
url_queue.join() 
+0

Wow, cảm ơn nhiều bạn! Điều đó hoạt động như một sự quyến rũ! – ticktack