Страница синтаксического анализа Python с динамическим содержимым

#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’] []