#python #ajax #parsing
#python #ajax #синтаксический анализ
Вопрос:
Могу ли я проанализировать страницу с динамическим содержимым с помощью Python?
Например, я начинающий инвестор и хочу анализировать последние заявки SEC в скрипте и отправлять результаты через Telegram API, чтобы получать их по телефону, как только они появятся.
Так что я могу разобрать https://www.sec.gov/edgar/search/#/entityName=TSLA для последней рекламной акции TSLA, например, но она загружает результаты в таблицу с помощью ajax после рендеринга страницы, поэтому я получаю пустую таблицу, если я делаю:
soup = BeautifulSoup(requests.get(sec_url).text, 'lxml')
table = soup.find(id="hits").table.tbody
rows = table.find_all('tr')
(строки здесь пустые)
Комментарии:
1. Вы проверили, доступны ли данные через один из этих ресурсов: sec.gov/sec-data-resources ? Если нет, то взгляните на selenium , чтобы автоматизировать доступ через браузер.
2. Спасибо! Отличная ссылка. Я уже нашел решение, используя старый список Edgar вместо нового, но в любом случае вопрос важен, я попробую Selenium
Ответ №1:
Вы можете загрузить эту страницу с помощью Selenium
:
from selenium import webdriver
import time
from bs4 import BeautifulSoup
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
url="https://www.sec.gov/edgar/search/#/entityName=TSLA"
wd = webdriver.Chrome('chromedriver',options=options)
wd.get(url)
time.sleep(5) # sleep for a few seconds to allow loading the data
soup = BeautifulSoup(wd.page_source, 'lxml')
table = soup.find(id="hits").table.tbody
rows = table.find_all('tr')
Но лучшим решением является прямая загрузка json. Похоже, что сайт использует a post request
по этому URL: https://efts.sec.gov/LATEST/search-index
import requests
data = '{"entityName":"TSLA","startdt":"2016-03-02","enddt":"2021-03-02"}'
response = requests.post('https://efts.sec.gov/LATEST/search-index', data=data).json()
Вы можете найти данные в response["hits"]["hits"]
. Загружается в фрейм данных Pandas,
import pandas as pd
df = pd.json_normalize(response["hits"]["hits"])
Это будет df.head()
результатом:
_index | _type | _id | _score | сортировка | _source.ciks | _source.period_ending | _source.root_form | _source.file_num | _source.display_names | _source.xsl | _source.sequence | _source.file_date | _source.biz_states | _source.sics | _source.form | _source.adsh | _source.film_num | _source.biz_locations | _source.file_type | _source.file_description | _source.inc_states | _source.items | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | edgar_file | _doc | 0001771364-21-000002:edgardoc.xml | [1613692800000] | [‘0001771364’, ‘0001318605’] | 2021-02-17 | 4 | [‘001-34756’] | [‘Kirkhorn Zachary (CIK 0001771364)’, ‘Tesla, Inc. (TSLA) (CIK 0001318605)’] | xslF345X03 | 1 | 2021-02-19 | [‘CA’] | [‘3711’] | 4 | 0001771364-21-000002 | [‘21658000’] | [», ‘Palo Alto, CA’] | 4 | PRIMARY DOCUMENT | [», ‘DE’] | [] | |
1 | edgar_file | _doc | 0001422849-21-000072:SEC13G_Filing.htm | [1613433600000] | [‘0001318605’, ‘0001422849’] | SC 13G | [‘005-85943’] | [‘Tesla, Inc. (TSLA) (CIK 0001318605)’, ‘Capital World Investors (CIK 0001422849)’] | 1 | 2021-02-16 | [‘CA’] | [‘3711’] | SC 13G/A | 0001422849-21-000072 | [‘21635287’] | [‘Palo Alto, CA’, ‘Los Angeles, CA’] | SC 13G/A | SEC SCHEDULE 13G | [‘DE’, ‘DE’] | [] | |||
2 | edgar_file | _doc | 0001104659-21-023576:tm216465d19_sc13ga.htm | [1613433600000] | [‘0001318605’, ‘0001446580’] | SC 13G | [‘005-85943’] | [‘Tesla, Inc. (TSLA) (CIK 0001318605)’, ‘SUSQUEHANNA SECURITIES, LLC (CIK 0001446580)’] | 1 | 2021-02-16 | [‘CA’, ‘PA’] | [‘3711’] | SC 13G/A | 0001104659-21-023576 | [‘21635713’] | [‘Palo Alto, CA’, ‘Bala Cynwyd, PA’] | SC 13G/A | SC 13G/A | [‘DE’] | [] | |||
3 | edgar_file | _doc | 0001104659-21-024148:tm215669d5_sc13g.htm | [1613433600000] | [‘0001318605’, ‘0001721695’] | SC 13G | [‘005-85943’] | [‘Tesla, Inc. (TSLA) (CIK 0001318605)’, ‘Citadel Securities GP LLC (CIK 0001721695)’] | 1 | 2021-02-16 | [‘CA’, ‘IL’] | [‘3711’] | SC 13G/A | 0001104659-21-024148 | [‘21639215’] | [‘Palo Alto, CA’, ‘Chicago, IL’] | SC 13G/A | SCHEDULE 13G/A | [‘DE’, ‘DE’] | [] | |||
4 | edgar_file | _doc | 0001495158-21-000002:edgardoc.xml | [1613088000000] | [‘0001584518’, ‘0001318605’] | 2021-02-10 | 4 | [‘001-34756’] | [‘Guillen Jerome M (CIK 0001584518)’, ‘Tesla, Inc. (TSLA) (CIK 0001318605)’] | xslF345X03 | 1 | 2021-02-12 | [‘CA’] | [‘3711’] | 4 | 0001495158-21-000002 | [‘21631266’] | [», ‘Palo Alto, CA’] | 4 | PRIMARY DOCUMENT | [», ‘DE’] | [] |