Запросы Python -сеанс html ПОЛУЧАЕТ правильное использование

#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