Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Python: Web

Войти
Регистрация
Восстановить пароль
 
weblord
1 / 1 / 0
Регистрация: 16.10.2016
Сообщений: 111
#1

Threading и selenium - Python

01.01.2017, 03:13. Просмотров 322. Ответов 12
Метки нет (Все метки)

Приветствую форумчан, никак не могу понять, в чем проблема. Собственно, вот мой код:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import threading
from queue import Queue
from selenium import webdriver
 
#driver = webdriver.PhantomJS(executable_path=r'C:\phantomjs-2.1.1-windows\bin\phantomjs.exe')
#driver = webdriver.Firefox(executable_path=r'C:\geckodriver\geckodriver.exe')
 
class visiter(threading.Thread):
    def worker():
        url = my_urls.get()
        driver = webdriver.Firefox(executable_path=r'C:\geckodriver\geckodriver.exe')
        driver.get(url)
        urls.task_done()
 
urls = ['https://www.python.org/',
        'http://www.cyberforum.ru/',
        'http://deer.io/',
        'https://www.google.com.ua/'
        ]
 
my_urls = Queue()
 
for url in urls:
    my_urls.put(url)
 
thread1 = visiter()
thread2 = visiter()
 
thread1.start()
thread2.start()
По задумке, ссылки должны открываться в 2 созданных мною потоках, однако при запуске программы проходит несколько секунд и мне показывает, что она выполнена (хотя даже браузеры не были открыты!), даже ошибок нет. В чем может быть проблема?

Добавлено через 29 минут
В общем, кое-что поменял на 26 и 27 строке кода:

Python
1
2
thread1 = visiter.worker()
thread2 = visiter.worker()]
В итоге запускает браузеры (но почему-то не в 2 потока, а по очереди), в каждом запущенном открывает по одной ссылке, а потом выбивает ошибку, что "NoneType object has no attribute "start"". Ну и еще подправил ошибку на строке 13, правильно
Python
1
my_urls.task_done()
. В чем моя ошибка?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.01.2017, 03:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Threading и selenium (Python):

Selenium - Python
Не могу понять в чем проблема. Вылетает Firefox. Версия ФФ 45.0.2, python 3.4.3, selenium 2.53.6 Создается инстанс веб драйвера, и иногда...

Не работает selenium - Python
Пытаюсь запустить программу, написанную при помощи selenium и выдает такое: Traceback (most recent call last): File...

Selenium + PhantomJS + прокси - Python
Как подружить вебдрайвер селениума и фантомжс с прокси? # -*- coding: utf8 -*- import os import sys from selenium import...

Selenium не запускает браузер - Python
Установил Selenium 3.0.0b3. Но до запуска браузера дело не доходит... Выдает следующее. Traceback (most recent call last): ...

Selenium не находит элемент - Python
Приветствую форум, есть следущий код: from selenium import webdriver from selenium.webdriver.common.keys import Keys ...

Прокси в Selenium (PhantomJS) - Python
Привет всем, нуждаюсь в помощи касательно того, как задать прокси в Selenium (PhantomJS). Пробовал разные методы, найденные в интернете и...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alex925
2506 / 2157 / 507
Регистрация: 19.03.2012
Сообщений: 8,356
02.01.2017, 18:20 #2
weblord, по коду не похоже, что ошибка появляется в нем.
Цитата Сообщение от weblord Посмотреть сообщение
В итоге запускает браузеры (но почему-то не в 2 потока, а по очереди), в каждом запущенном открывает по одной ссылке,
Потому что ты не правильно пользуешься потоками. Код который должен запускаться в отдельном потоке должен быть расположен в методе класса run (раз уж ты пошёл по пути наследования класса, правда причин для этого я не вижу ни 1) и ни каком другом.
Почитай документацию https://docs.python.org/3/library/th...thread-objects
+ все методы класса должны принимать аргумент self, а у тебя этого нет + прочитай про метод join, без него у тебя программа завершиться раньше чем ты думаешь.

P.S вообще не уверен, что получится так работать с selenium.
1
Zuzik
237 / 222 / 38
Регистрация: 11.06.2012
Сообщений: 1,446
02.01.2017, 19:58 #3
Посмотрите на вот такой пример - https://github.com/stefanbacon/pynew...ster/pynews.py
1
weblord
1 / 1 / 0
Регистрация: 16.10.2016
Сообщений: 111
03.01.2017, 02:14  [ТС] #4
Спасибо за ответ, я еще хотел узнать кое-что. Вот мой другой код:

Python
1
2
3
4
5
6
7
8
from multiprocessing import Pool
 
def printer(word):
    print(word)
 
words = ['green', 'blue', 'yellow', 'pink']
pool = Pool(5)
pool.map(printer, words)
Почему-то при запуске программы ЦП грузит на все 100%, но при этом никакой работы не идет. То есть программа даже не зависает, а просто как будто бездельничает, ни ошибок, ничего. Также пробовал использовать вместо Pool кое-что другое - 'Process', все так же. В чем причина?

Добавлено через 4 минуты
Цитата Сообщение от alex925 Посмотреть сообщение
P.S вообще не уверен, что получится так работать с selenium.
Это я просто пробовал. Поскольку код multiprocessing вообще не выполняется, программа тупо стоит на месте, а Threading пока я недостаточно освоил, то думаю юзать multiprocessing.dummy, причем у меня на нем уже есть некоторые простые рабочие программы

Добавлено через 5 часов 43 минуты
Так подскажете?)
0
alex925
2506 / 2157 / 507
Регистрация: 19.03.2012
Сообщений: 8,356
03.01.2017, 02:28 #5
weblord, Zuzik тебе уже кинул пример, что ещё надо то?
0
weblord
1 / 1 / 0
Регистрация: 16.10.2016
Сообщений: 111
03.01.2017, 10:01  [ТС] #6
Цитата Сообщение от alex925 Посмотреть сообщение
weblord, Zuzik тебе уже кинул пример, что ещё надо то?
Я кинул еще 1 вопрос, по multiprocessing. Он чуть выше
0
Zuzik
237 / 222 / 38
Регистрация: 11.06.2012
Сообщений: 1,446
03.01.2017, 14:17 #7
Цитата Сообщение от weblord Посмотреть сообщение
Спасибо за ответ, я еще хотел узнать кое-что. Вот мой другой код:
Python
Выделить код
1
2
3
4
5
6
7
8
from multiprocessing import Pool
def printer(word):
print(word)
words = ['green', 'blue', 'yellow', 'pink']
pool = Pool(5)
pool.map(printer, words)
Почему-то при запуске программы ЦП грузит на все 100%, но при этом никакой работы не идет. То есть программа даже не зависает, а просто как будто бездельничает, ни ошибок, ничего. Также пробовал использовать вместо Pool кое-что другое - 'Process', все так же. В чем причина?
Данный код отработал без каких либо ошибок и задержек.
0
weblord
1 / 1 / 0
Регистрация: 16.10.2016
Сообщений: 111
03.01.2017, 15:15  [ТС] #8
Странно, у меня все стоит на месте и бесконечно песочные часики в области меню интерпретора
0
alex925
2506 / 2157 / 507
Регистрация: 19.03.2012
Сообщений: 8,356
03.01.2017, 15:49 #9
У меня тоже работает все.

Не надо пользоваться idle, это бесконечное позорище и геморой, от него только проблемы. Работай из консоли системной или pycharm.
1
weblord
1 / 1 / 0
Регистрация: 16.10.2016
Сообщений: 111
03.01.2017, 16:58  [ТС] #10
Запустил из консоли, бесконечно шлет:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\Users\Глеб\AppData\Local\Programs\Python\Python35\lib\multiprocessing\spawn.py", line 106, in spawn_main
    exitcode = _main(fd)
  File "C:\Users\Глеб\AppData\Local\Programs\Python\Python35\lib\multiprocessing\spawn.py", line 115, in _main
    prepare(preparation_data)
  File "C:\Users\Глеб\AppData\Local\Programs\Python\Python35\lib\multiprocessing\spawn.py", line 226, in prepare
    _fixup_main_from_path(data['init_main_from_path'])
  File "C:\Users\Глеб\AppData\Local\Programs\Python\Python35\lib\multiprocessing\spawn.py", line 278, in _fixup_main_from_path
    run_name="__mp_main__")
  File "C:\Users\Глеб\AppData\Local\Programs\Python\Python35\lib\runpy.py", line 254, in run_path
    pkg_name=pkg_name, script_name=fname)
  File "C:\Users\Глеб\AppData\Local\Programs\Python\Python35\lib\runpy.py", line 96, in _run_module_code
    mod_name, mod_spec, pkg_name, script_name)
  File "C:\Users\Глеб\AppData\Local\Programs\Python\Python35\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "C:\Users\Глеб\Desktop\REALLY_MULTIPROCESSING!.py", line 8, in <module>
    pool = Pool(5)
  File "C:\Users\Глеб\AppData\Local\Programs\Python\Python35\lib\multiprocessing\context.py", line 118, in Pool
    context=self.get_context())
  File "C:\Users\Глеб\AppData\Local\Programs\Python\Python35\lib\multiprocessing\pool.py", line 168, in __init__
    self._repopulate_pool()
  File "C:\Users\Глеб\AppData\Local\Programs\Python\Python35\lib\multiprocessing\pool.py", line 233, in _repopulate_pool
    w.start()
  File "C:\Users\Глеб\AppData\Local\Programs\Python\Python35\lib\multiprocessing\process.py", line 105, in start
    self._popen = self._Popen(self)
  File "C:\Users\Глеб\AppData\Local\Programs\Python\Python35\lib\multiprocessing\context.py", line 313, in _Popen
    return Popen(process_obj)
  File "C:\Users\Глеб\AppData\Local\Programs\Python\Python35\lib\multiprocessing\popen_spawn_win32.py", line 34, in __init__
    prep_data = spawn.get_preparation_data(process_obj._name)
  File "C:\Users\Глеб\AppData\Local\Programs\Python\Python35\lib\multiprocessing\spawn.py", line 144, in get_preparation_data
    _check_not_importing_main()
  File "C:\Users\Глеб\AppData\Local\Programs\Python\Python35\lib\multiprocessing\spawn.py", line 137, in _check_not_importing_main
    is not going to be frozen to produce an executable.''')
RuntimeError:
        An attempt has been made to start a new process before the
        current process has finished its bootstrapping phase.
 
        This probably means that you are not using fork to start your
        child processes and you have forgotten to use the proper idiom
        in the main module:
 
            if __name__ == '__main__':
                freeze_support()
                ...
 
        The "freeze_support()" line can be omitted if the program
        is not going to be frozen to produce an executable.
0
alex925
2506 / 2157 / 507
Регистрация: 19.03.2012
Сообщений: 8,356
03.01.2017, 17:12 #11
weblord, сейчас под виртуалкой с видной запустил, тоже наблюдаю тоже самое, какие проблемы именно с виндой. С мастдайкой как всегда проблемы.
1
Garry Galler
759 / 581 / 158
Регистрация: 28.10.2013
Сообщений: 1,370
03.01.2017, 18:08 #12
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
С "мастдайкой" все в порядке. Просто у Unix и Windows разные реализации создания процессов.
Вот так работает:
Python
1
2
3
4
5
6
7
8
9
from multiprocessing import Pool
 
def printer(word):
    print(word)
 
if __name__ == '__main__':
    words = ['green', 'blue', 'yellow', 'pink']
    pool = Pool(5)
    pool.map(printer, words)
Цитата с ibm.com:
"Windows в качестве кода процесса используется уже компилированный байт-код приложения, поэтому использование конструкции: if __name__ == '__main__' - становится обязательным! Без этого фрагмента код порождённого дочернего процесса начнёт снова выполнять код главной ветви приложения, что породит бесконечную рекурсию из-за "размножения" процессов. Использование этой конструкции в операционных системах, реализующих вызов fork() не обязательно, но приветствуется, так как такой код становится независимым от платформы исполнения"
1
weblord
1 / 1 / 0
Регистрация: 16.10.2016
Сообщений: 111
03.01.2017, 18:31  [ТС] #13
Огромное спасибо, код наконец-то отрабатывает!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.01.2017, 18:31
Привет! Вот еще темы с ответами:

Selenium не делает скриншот - Python
Приветствую форум, возникла проблема со скринами в Selenium. У меня такой код: from selenium import webdriver import time ...

Selenium, выделение текста на странице - Python
Всем привет! Суть вопроса такова. Есть сайт, с генерируемой текстовой информацией. Мне нужно зайти на этот сайт, найти конкретный...

Selenium: переход на новыю вкладку - Python
Имееться 2 вкладки. В первой выполнен запрос и успешно открыта страница. Вторая вкладка открыта и на данный момент активна. Выполняю поиск,...

Selenium PhantomJS. Прокси с авторизацией - Python
Всем привет, столкнулся с проблемой по установке прокси для фантомжс (прокси именно с авторизацией). В инете особо инфы по этому не нашел,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
03.01.2017, 18:31
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru