Данные, обработанные в Интернете, работают только иногда

#python #web-scraping #beautifulsoup

Вопрос:

Я пытаюсь удалить данные о доходах акций с веб-сайта. В нерабочее время код работает. В часы работы рынка код большую часть времени будет указывать «индекс списка вне диапазона». Я понимаю, что это связано с тем, что html-код веб-сайта над частью данных, которые я хочу изменить, или выпадает для загрузки чего-то другого, но есть ли что-нибудь с этим поделать? Или я просто во власти того, что делает сайт?

 import requests
from bs4 import BeautifulSoup
headers = {'User Agent':'Mozilla/5.0'}
stocks = ['AAPL']
for stock in stocks:
    url = f'https://www.marketwatch.com/investing/stock/{stock}/analystestimates?mod=mw_quote_tab'
    res = requests.get(url, headers = headers)
    soup = BeautifulSoup(res.text, 'lxml')
    thisyear = soup.findAll('th', class_ = "table__cell")[8].text
    print(thisyear)
 

Заранее спасибо.

Ответ №1:

Вы в основном находитесь во власти веб-сайта. Было бы предпочтительнее найти API с теми же/похожими данными, если это возможно.

Не видя трассировки, IndexError это, скорее всего , из [8] или, более конкретно, из soup.findAll('th', class_ = "table__cell") возвращаемого списка с менее чем 9 элементами.

Вы можете назначить items = soup.findAll(..) и проверить if len(items) >= 9 , прежде чем получать это значение, и/или вызвать другой метод очистки. Вы также можете завернуть его в блок try-catch:

 def main():
    for stock in stocks:
        try2scrape(stock)

def try2scrape(stock):
    try:
        return scrape_data(stock)
    except IndexError as e:
        return scrape_data_another_way(stock) # or just error