Форум сайта python.su
0
содержимое страницы генерируется с помощью яваскрипта, необходимо обработать порядка 1000 ссылок, ставлю после каждого browser.get(url) принудительное ожидание time.sleep(2). Программа работает произвольное количество времени а потом падает видимо потому что в какой то момент не успевает загрузить содержимое страницы, вариант ставить время ожидания побольше не вариант т.к. программа полностью работает в среднем часа 3-4 (один раз она у меня дожила до конца) и увеличение времени еще на секунду скажется весьма неблаготворно на времени моего ночного сна и проблему не решит. Чуть позже выложу код и текст ошибки. Помогите кто чем может
Офлайн
0
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)
Офлайн
9
В селениуме можно установить тайм ауты, гугли 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()
Отредактировано WoMax (Окт. 12, 2015 19:45:46)
Офлайн
0
Спасибо сейчас почитаем, я искал много способов парсинга, но когда содержимое страницы генерируется c помощью ajax то чтобы вытянуть содержимое приходится имитировать сессию клиента. И с помощью какой же библиотеки можно познать истинную силу парсинга и при этом не перейти на темную сторону?
Офлайн
9
я scrapy использую.
Отредактировано WoMax (Окт. 12, 2015 22:53:10)
Офлайн