2013-06-16 5 views
5

나는 160.000 개 이상의 URL로 된 파일을 가지고 있는데, 그 중 일부 정보를 긁어 내고 싶다. 스크립트는 다음과 같이 대략 같습니다 작동하지만, 아주, 아주 느린스크랩 160.000 페이지 - 너무 느리다

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) 

합니다. 모든 160.000 페이지를 긁는 데 4 일 이상 걸립니다. 속도를 높이려면 어떤 제안이 필요합니까?

+2

를 사용하여 멀티 스레딩 또는 (https://github.com/kennethreitz/grequests) – Blender

+2

또는 단편적인 사용 [grequests] 같은 비동기 HTTP 요청 라이브러리. http://scrapy.org/ – Darek

+0

의견을 보내 주셔서 감사합니다. 그러나 나는 grequetsts 또는 치료법을 사용하는 방법을 모릅니다. 나는 거대한 파이썬 초보자입니다 ... – ticktack

답변

2

코드에 대한 몇 가지 조언 : 당신이 정규식 패턴을 컴파일 할 때, 당신은 또한 컴파일 된 객체를 사용하십시오

. 그리고 각 처리 루프에서 정규 표현식을 컴파일하지 마십시오. 다른 프레임 워크를 사용하지 않도록하려면 너무 병렬에가는 여러 HTTP 연결을 얻기 위해 표준 스레딩 라이브러리를 사용하여 최대

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

, 가장 좋은 방법은 일을 속도를. 이 같은

뭔가 :

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

와우, 고마워요. 그것은 매력처럼 작동합니다! – ticktack

관련 문제