Веб-скребок finviz для получения фундаментальных данных о рыночной капитализации

#python #beautifulsoup #scrape

Вопрос:

Я пытаюсь наскрести финвиза(https://finviz.com/quote.ashx?t=aapl) для рыночной цены в фундаментальной таблице, но я ни за что на свете не смог бы найти стол или класс с красивым супом. Кажется, что каждый раз, когда я использую soup.find_all (), Он работает для «div», «td», «таблицы» и т. Д., Но он возвращает пустой список, когда я пытаюсь добавить класс, например {«класс»: «снимок-td2»}. Кто-нибудь знает, как я могу это исправить?

 import requests
from bs4 import BeautifulSoup
import bs4

def parseMarketCap():
    response = requests.get("https://finviz.com/quote.ashx?t=aapl")
    soup = bs4.BeautifulSoup(response.content, "lxml")
    table = soup.find_all('td', {'class':'snapshot-td2'})
    print(table)
 

Я также попробовал следующее для таблицы, но тоже безуспешно:

 table = soup.find_all('table', {'class': "snapshot-table2"})
 

Осмотр

фундаментальная таблица

Ответ №1:

как QHarr, предлагаю вам добавить user-agent для правильного ответа

 response = requests.get("https://finviz.com/quote.ashx?t=aapl",headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'})

soup = BeautifulSoup(response.text, "lxml")
content_table = soup.find('table', {'class':'snapshot-table2'})
tabel_rows = content_table.find_all('tr')
market_cap = tabel_rows[1].find_all('td')[1].text

print(market_cap)
 

Ответ №2:

Попробуйте использовать User-Agent для вашего запроса следующим образом:

 user_agent = {'User Agent':'YOUR_USER_AGENT'}
r = requests.get('YOURURL', headers=user_agent)
...
 

Ответ №3:

Вам нужен заголовок агента пользователя, который вы можете использовать -soup-contains: для таргетинга на предыдущий td по его тексту, а затем перейти к нужному полю значения:

 import requests
from bs4 import BeautifulSoup as bs

r = requests.get('https://finviz.com/quote.ashx?t=aapl', headers = {'User-Agent':'Mozilla/5.0'})
soup = bs(r.content, 'lxml')
print(soup.select_one('td:-soup-contains("Market Cap")').find_next('b').text)