Найти - Пользователи
Полная версия: парсинг с помощью selenuim
Начало » Python для новичков » парсинг с помощью selenuim
1
artemmsu4
содержимое страницы генерируется с помощью яваскрипта, необходимо обработать порядка 1000 ссылок, ставлю после каждого browser.get(url) принудительное ожидание time.sleep(2). Программа работает произвольное количество времени а потом падает видимо потому что в какой то момент не успевает загрузить содержимое страницы, вариант ставить время ожидания побольше не вариант т.к. программа полностью работает в среднем часа 3-4 (один раз она у меня дожила до конца) и увеличение времени еще на секунду скажется весьма неблаготворно на времени моего ночного сна и проблему не решит. Чуть позже выложу код и текст ошибки. Помогите кто чем может
artemmsu4
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)
WoMax
В селениуме можно установить тайм ауты, гугли 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, дескать нет элемента.

А вообще истинные джедаи парсят без селениума.
artemmsu4
Спасибо сейчас почитаем, я искал много способов парсинга, но когда содержимое страницы генерируется c помощью ajax то чтобы вытянуть содержимое приходится имитировать сессию клиента. И с помощью какой же библиотеки можно познать истинную силу парсинга и при этом не перейти на темную сторону?
WoMax
я scrapy использую.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB