#python #ubuntu #web-scraping #python-requests #python-requests-html
#python #ubuntu #очистка веб-страниц #python-запросы #python-запросы-html
Вопрос:
Я работаю над веб-скребком, которому нужно открыть несколько тысяч страниц и получить некоторые данные. Поскольку одно из полей данных, которое мне нужно больше всего, загружается только после загрузки всех javascripts сайта, я использую html-запросы для рендеринга страницы, а затем получаю нужные мне данные.
Я хочу знать, каков наилучший способ сделать это?
1- Откройте сеанс в начале скрипта, выполните всю очистку, а затем закройте сеанс, когда скрипт завершится после тысяч «кликов» и нескольких часов?
2- Или я должен открывать сеанс каждый раз, когда я открываю ссылку, отображаю страницу, получаю данные, а затем закрываю сеанс и повторяю n раз в цикле?
В настоящее время я использую 2-й вариант, но у меня возникает проблема. Это код, который я использую:
def getSellerName(listingItems):
for item in listingItems:
builtURL = item['href']
try:
session = HTMLSession()
r = session.get(builtURL,timeout=5)
r.html.render()
sleep(1)
sellerInfo = r.html.search("<ul class="seller_name"></ul></div><a href="{user}" target=")["user"]
##
##Do some stuff with sellerinfo
##
session.close()
except requests.exceptions.Timeout:
log.exception("TimeOut Ex: ")
continue
except:
log.exception("Gen Ex")
continue
finally:
session.close()
break
Это работает довольно хорошо и довольно быстро. Однако примерно через 1,5 или 2 часа я начинаю получать исключение ОС, подобное этому:
Ошибка операционной системы: [Ошибка 24] Слишком много открытых файлов
И тогда все, я просто получаю это исключение снова и снова, пока не убью скрипт.
Я предполагаю, что мне нужно закрывать что-то еще после каждого получения и рендеринга, но я не уверен, что или если я делаю это правильно.
Любая помощь и / или предложения, пожалуйста?
Спасибо!
Ответ №1:
Вы должны создать объект сеанса вне цикла
def getSellerName(listingItems):
session = HTMLSession()
for item in listingItems:
//code