Архив ‘spynner’ тега
Multiprocessing
Узнал про модуль spynner, это такой управляемый браузер. Если на страничке много трудноподдающегося JavaScript-а, то вместо urllib2 или curl можно попробовать натравить на него spynner. Основы работы с ним можно почитать здесь. В общем был он нужен мне, но проблема в том, что он достаточно медленный, а работать в несколько потоков с ним не представляется возможным, так он берет своё начало от GUI-класса библиотеки Qt, которые в свою очередь можно использовать только в main-потоке. Поэтому вместо многопоточности пришлось думать о многопроцессовости. Ну это тоже самое если сделать однопоточный скрипт и
запустить одновременно N его копий. Про многопоточность я уже написал один пост, который полностью состоит из быдлокода=) С тех пор, я чутка поумнел и для организации потоков наследуюсь от класса Thread. С многопроцессовостью всё аналогично, только классы другие, а методы и структура вся та же.
# coding: utf8 import spynner from spynner import browser import multiprocessing from multiprocessing import Process class Serfer(multiprocessing.Process): def __init__(self,queue): multiprocessing.Process.__init__(self) self.__queue = queue # наша очередь заданий self.kill_received = False # На всякий случай переменная, вдруг надо будет всё остановить def run(self): while not self.kill_received: try: item = self.__queue.get_nowait() # ждём данные except Queue.Empty: break error = True try: error = self.serfing(item) except: traceback.print_exc() time.sleep(0.1) self.__queue.task_done() # задача завершена if error: self.__queue.put(item) # Если была ошибка, то еще раз с этими данными return def serfing(self,url): br = browser.Browser() # запускаем браузер br.create_webview() br.show() # отображаем br.load(url) # загружаем страницу br.wait_a_little(75) br.destroy_webview() br.close() # закрываем браузер def main(): queue = multiprocessing.JoinableQueue() # создаем очередь заданий processes = 5 # Урлы по которым надо будет перейти в браузере urls = ["http://ya.ru","http://google.ru","http://yahoo.com", "http://bing.com","http://rambler.ru"] for url in urls: queue.put(url) # заносим данные в очередь for i in xrange(processes): t = Serfer(queue) # создаем процесс t.start() # стартуем time.sleep(0.1) queue.join() # приостанавливаем дальнейшее выполнение кода, пока очередь не опустошится print "Done" if __name__ == '__main__': main()