2014-04-01 3 views
1

Я использую метод urllib.urlopen() и BeautfulSoup для ползания. Я не доволен скоростью просмотра, и я думаю о том, что анализирует urllib, предполагая, что он загружает больше, чем только html. Не удалось найти в документах, читает ли он или проверяет большие данные (изображения, вспышки, ...) по умолчанию.Как ускорить сканирование веб-страниц в Python?

Итак, если urllib должен загружать i.e изображения, flash, js ... как избежать запроса GET для таких типов данных?

+0

Вы пытаетесь загрузить несколько сайтов одновременно? – Floris

+0

Да, спасибо, что спросили. – Alex

+1

Взгляните на вопрос [здесь] (http://stackoverflow.com/questions/4119680/multiple-asynchronous-connections-with-urllib2-or-other-http-library) - возможно, вы можете использовать эти методы для больше запросов одновременно. Может иметь большое значение (с достаточной пропускной способностью, большая часть задержки «ждет»). – Floris

ответ

2

Используйте резьбу! Это супер просто. Вот пример. Вы можете изменить количество подключений в соответствии с вашими потребностями.

import threading, Queue 
import urllib 

urls = [ 
    'http://www.google.com', 
    'http://www.amazon.com', 
    'http://www.ebay.com', 
    'http://www.google.com', 
    'http://www.amazon.com', 
    'http://www.ebay.com', 
    'http://www.google.com', 
    'http://www.amazon.com', 
    'http://www.ebay.com',  
    ] 

queue = Queue.Queue() 
for x,url in enumerate(urls): 
    filename = "datafile%s-%s" % (x,url) 
    queue.put((url, filename)) 


num_connections = 10 

class WorkerThread(threading.Thread): 
    def __init__(self, queue): 
     threading.Thread.__init__(self) 
     self.queue = queue 

    def run(self): 
     while 1: 
      try: 
       url, filename = self.queue.get_nowait() 
      except Queue.Empty: 
       raise SystemExit 

      urllib.urlretrieve(url,filename.replace('http://','')) 

# start threads 
threads = [] 
for dummy in range(num_connections): 
    t = WorkerThread(queue) 
    t.start() 
    threads.append(t) 


# Wait for all threads to finish 
for thread in threads: 
    thread.join() 
+0

Как я вижу, это решение с несколькими потоками. Интересно, как устранить не html-контент. – Alex

+0

Вы можете использовать «черный список», чтобы пропустить URL-адреса, у которых есть контент, который вам не нужен. Например ... blacklist = ['.jpeg', '. Jpg', '. Gif'] – Genome

3

Попробуйте requests - он реализует HTTP пулов соединений, которые ускоряет сканирование.

Кроме того, он заботится о других вещах, таких как печенье, авторизация и т.д. намного лучше, чем URLLIB и прекрасно работает с BeautfulSoup ..

Смежные вопросы