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

Python: Web

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

Threading и selenium - Python

01.01.2017, 03:13. Просмотров 284. Ответов 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()
. В чем моя ошибка?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.01.2017, 03:13     Threading и selenium
Посмотрите здесь:

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

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

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

Изменить размер окна в Selenium - Python
Не могу понять from selenium import webdriver import time driver = webdriver.Firefox() ...

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

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

Selenium. Клик по Java объекту - Python
Доброго времени суток,товарищи. У меня есть Powershell скрипт для реализации клика по Java обьекту на сайте. Но требуется сделать...

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

P.S вообще не уверен, что получится так работать с selenium.
Zuzik
235 / 220 / 38
Регистрация: 11.06.2012
Сообщений: 1,433
02.01.2017, 19:58     Threading и selenium #3
Посмотрите на вот такой пример - https://github.com/stefanbacon/pynew...ster/pynews.py
weblord
1 / 1 / 0
Регистрация: 16.10.2016
Сообщений: 111
03.01.2017, 02:14  [ТС]     Threading и selenium #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 минуты
Так подскажете?)
alex925
2451 / 2117 / 498
Регистрация: 19.03.2012
Сообщений: 8,200
03.01.2017, 02:28     Threading и selenium #5
weblord, Zuzik тебе уже кинул пример, что ещё надо то?
weblord
1 / 1 / 0
Регистрация: 16.10.2016
Сообщений: 111
03.01.2017, 10:01  [ТС]     Threading и selenium #6
Цитата Сообщение от alex925 Посмотреть сообщение
weblord, Zuzik тебе уже кинул пример, что ещё надо то?
Я кинул еще 1 вопрос, по multiprocessing. Он чуть выше
Zuzik
235 / 220 / 38
Регистрация: 11.06.2012
Сообщений: 1,433
03.01.2017, 14:17     Threading и selenium #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', все так же. В чем причина?
Данный код отработал без каких либо ошибок и задержек.
weblord
1 / 1 / 0
Регистрация: 16.10.2016
Сообщений: 111
03.01.2017, 15:15  [ТС]     Threading и selenium #8
Странно, у меня все стоит на месте и бесконечно песочные часики в области меню интерпретора
alex925
2451 / 2117 / 498
Регистрация: 19.03.2012
Сообщений: 8,200
03.01.2017, 15:49     Threading и selenium #9
У меня тоже работает все.

Не надо пользоваться idle, это бесконечное позорище и геморой, от него только проблемы. Работай из консоли системной или pycharm.
weblord
1 / 1 / 0
Регистрация: 16.10.2016
Сообщений: 111
03.01.2017, 16:58  [ТС]     Threading и selenium #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.
alex925
2451 / 2117 / 498
Регистрация: 19.03.2012
Сообщений: 8,200
03.01.2017, 17:12     Threading и selenium #11
weblord, сейчас под виртуалкой с видной запустил, тоже наблюдаю тоже самое, какие проблемы именно с виндой. С мастдайкой как всегда проблемы.
Garry Galler
635 / 515 / 135
Регистрация: 28.10.2013
Сообщений: 1,184
03.01.2017, 18:08     Threading и selenium #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() не обязательно, но приветствуется, так как такой код становится независимым от платформы исполнения"
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.01.2017, 18:31     Threading и selenium
Еще ссылки по теме:

Поиск текста на странице с Selenium - Python
Привет камрады. Решил засесть за web с питоном, появился вопросик. Работаю с Selenium, разобрался как вводить логопасы и тд, но...

Python + Selenium, как переключится на окно? - Python
Вставляю текст в input, он вставляется как комментарий (на скрине видно) Все исправляется когда в ручную кликну мышкой по нему или по...

Python, Selenium - как прокликать страницы - Python
Добрый вечер. Подскажите, пожалуйста, как пройтись по всем страницам на сайте. Страницы переключаются js скриптом: &lt;li&gt; ...

Ускорить программу написаную с использованием selenium - Python
написал часть программы по парсингу сайта, используя селениум вебдрайвер(нужны были функции клика мыши на элемент &quot;показать&quot; для сбора...

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


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

Или воспользуйтесь поиском по форуму:
weblord
1 / 1 / 0
Регистрация: 16.10.2016
Сообщений: 111
03.01.2017, 18:31  [ТС]     Threading и selenium #13
Огромное спасибо, код наконец-то отрабатывает!
Yandex
Объявления
03.01.2017, 18:31     Threading и selenium
Ответ Создать тему
Опции темы

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