Разбор таблицы с пандами

#python #pandas #parsing #web-scraping #beautifulsoup

Вопрос:

Я пытаюсь разобрать таблицу с https://alreits.com/screener

Я уже пробовал это:

 main_url = 'https://alreits.com/screener'
r = requests.get(main_url)
df_list = pd.read_html(r.text)
df = df_list[0]
print(df)
 

но панды не могут найти стол.
Я также пробовал использовать BeautifulSoup4, но, похоже, это не дало лучших результатов.
Это селектор: #__далее > div.MuiContainer-root.MuiContainer-maxWidthLg > div.MuiBox-root.jss9.Карта__CardContainer-feksr6-0.fpbzHQ.Экранная таблица__CardContainer-sc-1c5wxgl-0.GRrTj > div >> таблица >>> тело

Это полный XPath: /html/body/div/div[2]/div[2]/div/таблица/тело

Я пытаюсь получить символ акции (под названием),сектор,оценку и рыночную капитализацию. Другие данные было бы неплохо иметь, но в этом нет необходимости.

Спасибо!

Комментарии:

1. Вы не можете использовать requests / bs4 , вы должны использовать Selenium , потому что данные загружаются с помощью вызова API . Или поддельный сеанс, агент пользователя и прямой вызов api с помощью requests

Ответ №1:

Я нашел один URL-адрес JSON из инструмента разработки. Это простой способ извлечь таблицу вместо использования селена. Используйте post-запрос для извлечения данных.

 import requests

headers = {
    'authority': 'api.alreits.com:8080',
    'sec-ch-ua': '"Google Chrome";v="93", " Not;A Brand";v="99", "Chromium";v="93"',
    'sec-ch-ua-mobile': '?0',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36',
    'sec-ch-ua-platform': '"Windows"',
    'content-type': 'application/json',
    'accept': '*/*',
    'origin': 'https://alreits.com',
    'sec-fetch-site': 'same-site',
    'sec-fetch-mode': 'cors',
    'sec-fetch-dest': 'empty',
    'referer': 'https://alreits.com/',
    'accept-language': 'en-US,en;q=0.9',
}

params = (
    ('page', '0'),
    ('size', '500'),
    ('sort', ['marketCap,desc', 'score,desc', 'ffoGrowth,desc']),
)

data = '{"filters":[]}'

response = requests.post('https://api.alreits.com:8080/api/reits/screener', headers=headers, params=params, data=data)

df = pd.DataFrame(response.json())
 

Комментарии:

1. Отличное спасибо!!

Ответ №2:

Приведенный ниже код вернет данные, которые вы ищете.

 import requests
import pprint
import json

headers = {'content-type': 'application/json',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'}

r = requests.post(
    'https://api.alreits.com:8080/api/reits/screener?page=0amp;size=500amp;sort=marketCap,descamp;sort=score,descamp;sort=ffoGrowth,desc',
    headers=headers, data=json.dumps({'filters':[]}))
if r.status_code == 200:
    pprint.pprint(r.json())
    # Now you have the data - do what you want with it
else:
    print(r.status_code)