Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 12, 2015 17:35:21

artemmsu4
Зарегистрирован: 2015-10-12
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

парсинг с помощью selenuim

содержимое страницы генерируется с помощью яваскрипта, необходимо обработать порядка 1000 ссылок, ставлю после каждого browser.get(url) принудительное ожидание time.sleep(2). Программа работает произвольное количество времени а потом падает видимо потому что в какой то момент не успевает загрузить содержимое страницы, вариант ставить время ожидания побольше не вариант т.к. программа полностью работает в среднем часа 3-4 (один раз она у меня дожила до конца) и увеличение времени еще на секунду скажется весьма неблаготворно на времени моего ночного сна и проблему не решит. Чуть позже выложу код и текст ошибки. Помогите кто чем может

Офлайн

#2 Окт. 12, 2015 18:51:24

artemmsu4
Зарегистрирован: 2015-10-12
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

парсинг с помощью selenuim

browser.get(b)
print('обрабатываю страницу %s' %a)
time.sleep(4)
h.write(browser.find_element_by_id('col-content').find_element_by_tag_name('h1').text+' ‘)
h.write(browser.find_element_by_id(’col-content').find_element_by_tag_name('p').text+' ‘)
h.write(browser.find_element_by_id(’col-content').find_element_by_tag_name('strong').text+'\n')

и где то спустя 30 минут работы программы а иногда больше или меньше выдает следующее
File “aaa.py”, line 25, in main
h.write(browser.find_element_by_id('col-content').find_element_by_tag_name('h1').text+' ‘)
File “/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/selenium/webdriver/remote/webdriver.py”, line 234, in find_element_by_id
return self.find_element(by=By.ID, value=id_)
File “/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/selenium/webdriver/remote/webdriver.py”, line 712, in find_element
{’using': by, ‘value’: value})
File “/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/selenium/webdriver/remote/webdriver.py”, line 201, in execute
self.error_handler.check_response(response)
File “/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/selenium/webdriver/remote/errorhandler.py”, line 181, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: {“method”:“id”,“selector”:“col-content”}
Stacktrace:
at FirefoxDriver.prototype.findElementInternal_ (file//var/folders/h3/6vjdbcc10mdbc63dl_wzqqfm0000gn/T/tmpdomtiibk/extensions/fxdriver@googlecode.com/components/driver-component.js:10647)
at FirefoxDriver.prototype.findElement (file//var/folders/h3/6vjdbcc10mdbc63dl_wzqqfm0000gn/T/tmpdomtiibk/extensions/fxdriver@googlecode.com/components/driver-component.js:10656)
at DelayedCommand.prototype.executeInternal_/h (file//var/folders/h3/6vjdbcc10mdbc63dl_wzqqfm0000gn/T/tmpdomtiibk/extensions/fxdriver@googlecode.com/components/command-processor.js:12617)
at DelayedCommand.prototype.executeInternal_ (file//var/folders/h3/6vjdbcc10mdbc63dl_wzqqfm0000gn/T/tmpdomtiibk/extensions/fxdriver@googlecode.com/components/command-processor.js:12622)
at DelayedCommand.prototype.execute/< (file//var/folders/h3/6vjdbcc10mdbc63dl_wzqqfm0000gn/T/tmpdomtiibk/extensions/fxdriver@googlecode.com/components/command-processor.js:12564)

Офлайн

#3 Окт. 12, 2015 19:32:12

WoMax
Зарегистрирован: 2014-05-26
Сообщения: 124
Репутация: +  9  -
Профиль   Отправить e-mail  

парсинг с помощью selenuim

В селениуме можно установить тайм ауты, гугли pageLoadTimeout.

Также когда то в одном из первых своих пауков я делал такой говно-костыль:

    def parse(self, response):
        """
        start parsing, launch filters via Selenium
        """      
        
        # click on "наша мега кнопка" via Selenium
        i = 0
        error = None
        while i < 20:
            try:
                self.driver.find_element_by_xpath(
                    '//a[text() = "наша мега кнопка"]'
                ).click()
                break
            except (StaleElementReferenceException,
                    NoSuchElementException) as e:
                i += 1
                error = e
        # raise exception if Selenium doesn't find DOM element 20 times
        if i == 20:
            raise error
        # page parsing
        return self.scrapy_parse()

То есть вместо sleep, паук использовал цикл, в котором он искал кнопку и либо находил ее и выходил из цикла, либо не находил 20 раз подряд и тогда тоже выходил из цикла но вызывал StaleElementReferenceException/NoSuchElementException, дескать нет элемента.

А вообще истинные джедаи парсят без селениума.

Отредактировано WoMax (Окт. 12, 2015 19:45:46)

Офлайн

#4 Окт. 12, 2015 22:41:21

artemmsu4
Зарегистрирован: 2015-10-12
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

парсинг с помощью selenuim

Спасибо сейчас почитаем, я искал много способов парсинга, но когда содержимое страницы генерируется c помощью ajax то чтобы вытянуть содержимое приходится имитировать сессию клиента. И с помощью какой же библиотеки можно познать истинную силу парсинга и при этом не перейти на темную сторону?

Офлайн

#5 Окт. 12, 2015 22:52:47

WoMax
Зарегистрирован: 2014-05-26
Сообщения: 124
Репутация: +  9  -
Профиль   Отправить e-mail  

парсинг с помощью selenuim

я scrapy использую.

Отредактировано WoMax (Окт. 12, 2015 22:53:10)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version