#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)