1
votes

Scraping d'une table dynamique à l'aide de Selenium dans Python3

J'essaie de récupérer les symboles de cette page, https: //www.barchart.com/stocks/indices/sp/sp400?page=all

Quand je regarde la source dans le navigateur Firefox (en utilisant Ctrl-U), aucun des symboles n'apparaît. Pensant que Selenium pourrait peut-être obtenir la table dynamique, j'ai exécuté le code suivant.

sp400_url= "https://www.barchart.com/stocks/indices/sp/sp400?page=all"

from bs4 import BeautifulSoup
from selenium import webdriver
driver = webdriver.Firefox()
driver.get(sp400_url)

html = driver.page_source
soup = BeautifulSoup(html)
print(soup)

La commande d'impression ne montre aucun des symboles que nous voyons sur la page. Existe-t-il un moyen de gratter les symboles de cette page?

Modifié pour clarifier: je ne suis intéressé que par les symboles et non par les prix. La liste doit donc se lire: AAN, AAXN, ACC, ACHC, ...


2 commentaires

Quels symboles recherchez-vous? Je regarde la page et c'est principalement du texte ... Le plus proche que je peux penser que vous voulez dire est la valeur de ce caractère à barres - Je peux obtenir cela: left: 84.0351%; correspondant à Ouvrez 1 945,28 ... Heureux de revoir si vous clarifiez ce dont vous avez besoin :-)


Clarifié ma question ci-dessus avec ma sortie attendue.


3 Réponses :


5
votes

Vous pouvez facilement alimenter ceci dans .read_html () de pandas pour obtenir le tableau et transformer la colonne de symboles en une liste. Remarque: j'ai utilisé chromedriver au lieu de firefox

print(symbolsList)
['AAN', 'AAXN', 'ACC', 'ACHC', 'ACIW', 'ACM', 'ADNT', 'ADS', 'AEO', 'AFG', 'AGCO', 'ALE', 'AM', 'AMCX', 'AMED', 'AMG', 'AN', 'ARW', 'ARWR', 'ASB', 'ASGN', 'ASH', 'ATGE', 'ATI', 'ATR', 'AVNS', 'AVNT', 'AVT', 'AYI', 'BC', 'BCO', 'BDC', 'BHF', 'BJ', 'BKH', 'BLD', 'BLKB', 'BOH', 'BRO', 'BRX', 'BXS', 'BYD', 'CABO', 'CACI', 'CAR', 'CASY', 'CATY', 'CBRL', 'CBSH', 'CBT', 'CC', 'CCMP', 'CDAY', 'CDK', 'CFR', 'CFX', 'CGNX', 'CHDN', 'CHE', 'CHH', 'CHX', 'CIEN', 'CIT', 'CLGX', 'CLH', 'CLI', 'CMC', 'CMD', 'CMP', 'CNK', 'CNO', 'CNX', 'COHR', 'COLM', 'CONE', 'COR', 'CPT', 'CR', 'CREE', 'CRI', 'CRL', 'CRS', 'CRUS', 'CSL', 'CTLT', 'CUZ', 'CVLT', 'CW', 'CXW', 'CZR', 'DAN', 'DAR', 'DCI', 'DECK', 'DEI', 'DKS', 'DLPH', 'DLX', 'DNKN', 'DOC', 'DY', 'EBS', 'EGP', 'EHC', 'EME', 'ENPH', 'ENR', 'ENS', 'EPC', 'EPR', 'EQT', 'ESNT', 'ETRN', 'ETSY', 'EV', 'EVR', 'EWBC', 'EXEL', 'EXP', 'FAF', 'FCFS', 'FCN', 'FDS', 'FFIN', 'FHI', 'FHN', 'FICO', 'FIVE', 'FL', 'FLO', 'FLR', 'FNB', 'FR', 'FSLR', 'FULT', 'GATX', 'GBCI', 'GEF', 'GEO', 'GGG', 'GHC', 'GMED', 'GNRC', 'GNTX', 'GNW', 'GO', 'GRUB', 'GT', 'HAE', 'HAIN', 'HCSG', 'HE', 'HELE', 'HIW', 'HNI', 'HOG', 'HOMB', 'HPP', 'HQY', 'HR', 'HRC', 'HUBB', 'HWC', 'HXL', 'IART', 'IBKR', 'IBOC', 'ICUI', 'IDA', 'IDCC', 'IIVI', 'INGR', 'INT', 'ITT', 'JACK', 'JBGS', 'JBL', 'JBLU', 'JCOM', 'JEF', 'JHG', 'JLL', 'JW.A', 'JWN', 'KAR', 'KBH', 'KBR', 'KEX', 'KMPR', 'KMT', 'KNX', 'KRC', 'LAMR', 'LANC', 'LEA', 'LECO', 'LFUS', 'LGND', 'LHCG', 'LII', 'LITE', 'LIVN', 'LOGM', 'LOPE', 'LPX', 'LSI', 'LSTR', 'MAC', 'MAN', 'MANH', 'MASI', 'MAT', 'MCY', 'MD', 'MDU', 'MIDD', 'MKSI', 'MLHR', 'MMS', 'MOH', 'MPW', 'MPWR', 'MRCY', 'MSA', 'MSM', 'MTX', 'MTZ', 'MUR', 'MUSA', 'NATI', 'NAVI', 'NCR', 'NDSN', 'NEU', 'NFG', 'NGVT', 'NJR', 'NKTR', 'NNN', 'NSP', 'NTCT', 'NUS', 'NUVA', 'NVT', 'NWE', 'NYCB', 'NYT', 'OC', 'OFC', 'OGE', 'OGS', 'OHI', 'OI', 'OLED', 'OLLI', 'OLN', 'ORI', 'OSK', 'OZK', 'PACW', 'PB', 'PBF', 'PBH', 'PCH', 'PCTY', 'PDCO', 'PEB', 'PEN', 'PENN', 'PII', 'PK', 'PNFP', 'PNM', 'POOL', 'POST', 'PPC', 'PRAH', 'PRI', 'PRSP', 'PSB', 'PTC', 'PZZA', 'QDEL', 'QLYS', 'R', 'RAMP', 'RBC', 'RGA', 'RGEN', 'RGLD', 'RH', 'RIG', 'RLI', 'RNR', 'RPM', 'RS', 'RYN', 'SABR', 'SAFM', 'SAIC', 'SAM', 'SBH', 'SBNY', 'SBRA', 'SCI', 'SEDG', 'SEIC', 'SF', 'SFM', 'SGMS', 'SIGI', 'SIX', 'SKX', 'SLAB', 'SLGN', 'SLM', 'SMG', 'SMTC', 'SNV', 'SNX', 'SON', 'SR', 'SRC', 'SRCL', 'STL', 'STLD', 'STOR', 'STRA', 'SVC', 'SWX', 'SXT', 'SYNA', 'SYNH', 'TCBI', 'TCF', 'TCO', 'TDC', 'TDS', 'TECH', 'TER', 'TEX', 'TGNA', 'THC', 'THG', 'THO', 'THS', 'TKR', 'TMHC', 'TOL', 'TPH', 'TPX', 'TR', 'TREE', 'TREX', 'TRIP', 'TRMB', 'TRMK', 'TRN', 'TTC', 'TTEK', 'TXRH', 'UBSI', 'UE', 'UFS', 'UGI', 'UMBF', 'UMPQ', 'UNVR', 'URBN', 'UTHR', 'VAC', 'VC', 'VLY', 'VMI', 'VSAT', 'VSH', 'VVV', 'WAFD', 'WBS', 'WEN', 'WERN', 'WEX', 'WH', 'WOR', 'WPX', 'WRI', 'WSM', 'WSO', 'WTFC', 'WTRG', 'WW', 'WWD', 'WWE', 'WYND', 'X', 'XEC', 'XPO', 'Y', 'YELP', 'Symbol']

Sortie:

import pandas as pd
from selenium import webdriver


sp400_url= "https://www.barchart.com/stocks/indices/sp/sp400?page=all"
driver = webdriver.Chrome('C:/chromedriver_win32/chromedriver.exe')
driver.get(sp400_url)

html = driver.page_source

df = pd.read_html(html)[-1]

driver.close()

symbolsList = list(df['Symbol'])


2 commentaires

Cela marche. Je l'ai changé pour Firefox pour voir si le problème est dû à Firefox. Je suis curieux de savoir ce que j'ai fait de mal. Pourquoi ne s'affiche-t-il pas lorsque je l'ai transmis à BeautifulSoup?


tu n'es pas sûr. Cela aurait dû être dans votre objet soupe.



0
votes

2 commentaires

Merci pour cette tentative, mais cela me donne des éléments supplémentaires à l'avant: $ IDX, voir devis, graphique complet, graphique complet, graphique complet, graphique complet, graphique complet, graphique complet.


@ Spinor8, oh. Ouais. mis à jour avec un localisateur plus spécifique



0
votes

Je ne sais pas pourquoi vous souhaitez supprimer la page de la concurrence. si vous n'avez besoin que de symboles. Vous pouvez simplement obtenir la liste de tous ces éléments, puis les mettre dans une liste.

driver = webdriver.Firefox(executable_path=r'..\drivers\geckodriver.exe')
driver.get("https://www.barchart.com/stocks/indices/sp/sp400?page=all")

# Waiting for table to laod
WebDriverWait(driver, 30).until(EC.visibility_of_all_elements_located((By.XPATH, "//h4[contains(text(),'S&P 400  Components')]")))
symbols = driver.find_elements_by_xpath("//div[@class='bc-table-scrollable-inner']//a[@data-ng-bind='cell']")
symbolList = []
for symbol in symbols:
    symbolList.append(symbol.text)

print(len(symbolList)) #Length of list
print(symbolList) #Content of list

Sortie:

 entrez la description de l'image ici


0 commentaires