J'essaie de configurer un script pour extraire quotidiennement les données d'un site Web et j'ai du mal à faire en sorte que Python lise réellement le tableau - je ne suis pas un codeur professionnel. J'ai essayé deux méthodes:
1) Grattez le tableau (en-têtes, lignes, etc.) en utilisant Beautiful Soup, et
2) Utilisez l'exportation du site Web avec le bouton Excel
Voici le site précis: https://scgenvoy.sempra.com/index .html # nav = / Public / ViewExternalLowOFO.getLowOFO% 3Frand% 3D200
Jusqu'à présent, mon code est:
xpath //*[@id="content"]/form/div[2]/div/table/tbody/tr/td[4]/table/tbody/tr/td[1]/a
Je pense que le La méthode la plus simple serait de déclencher la fonction "export" avec le
#Imports import requests import urllib.request import pandas as pd from lxml import html import lxml.html as lh from bs4 import BeautifulSoup `URL ='https://scgenvoy.sempra.com/index.html#nav=/Public/ViewExternalLowOFO.getLowOFO%3Frand%3D200'` #Create a handle, page, to handle the contents of the website requests.packages.urllib3.disable_warnings() page = requests.get(URL, verify=False)
Toute l'aide est grandement appréciée!
3 Réponses :
J'essaierais d'identifier l'API qui "exporte vers Excel" et utiliser cette API. Vous pouvez l'identifier à partir des outils de développement du navigateur. Par exemple, voici ce que donne la Copy as Curl de Google Chrome:
FileName: LowOFO05302019Cycle2 Class: com.sempra.krypton.common.saveas.constants.FancyExcelExportType pageSize: letter pageOrientation: portrait HiddenGasFlowDateField: 05/30/2019 HiddenCycleField: 2 gasFlowDate: 05/30/2019 cycle: 2
L'URL de l'API est https://scgenvoy.sempra.com/Public/ViewExternalLowOFO.submitLowOfoSaveAs p >
et les paramètres d'entrée sont:
curl 'https://scgenvoy.sempra.com/Public/ViewExternalLowOFO.submitLowOfoSaveAs' -H 'Connection: keep-alive' -H 'Pragma: no-cache' -H 'Cache-Control: no-cache' -H 'Origin: https://scgenvoy.sempra.com' -H 'Upgrade-Insecure-Requests: 1' -H 'DNT: 1' -H 'Content-Type: application/x-www-form-urlencoded' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3' -H 'Referer: https://scgenvoy.sempra.com/index.html' -H 'Accept-Encoding: gzip, deflate, br' -H 'Accept-Language: en-US,en;q=0.9' -H 'Cookie: FAROFFSession=537EB1587E4A063416D5F2206890A2B6.managed2' --data 'FileName=LowOFO05302019Cycle2&Class=com.sempra.krypton.common.saveas.constants.FancyExcelExportType&pageSize=letter&pageOrientation=portrait&HiddenGasFlowDateField=05%2F30%2F2019&HiddenCycleField=2&gasFlowDate=05%2F30%2F2019&cycle=2' --compressed
et la méthode de requête est POST.
Vous pouvez maintenant utiliser la bibliothèque de requêtes python ou la bibliothèque beautifulsoup pour faites cette demande, en passant les valeurs appropriées pour le paramètre.
Vous donnant une idée, sans résoudre le tout moi-même.
Votre site Web est en cours d'ajout données de table dynamique avec le bouton d'exportation. Donc, fondamentalement, vous devez utiliser le package Selenium
pour gérer les données dynamiques. télécharger le pilote Web sélénium selon votre navigateur.
pour le navigateur Chrome:
http://chromedriver.chromium.org/downloads
Installer le pilote Web pour le navigateur Chrome:
from selenium import webdriver import time driver = webdriver.Chrome('/usr/bin/chromedriver') driver.get('https://scgenvoy.sempra.com/index.html#nav=/Public/ViewExternalLowOFO.getLowOFO%3Frand%3D200') time.sleep(3) excel_button = driver.find_element_by_xpath("//div[@id='content']/form/div[2]/div/table/tbody/tr/td[4]/table/tbody/tr/td[2]/a") print(excel_button.click())
Voici le code que j'ai obtenu:
# pause to give time to think load time.sleep(5) # Loops through the dates for d in datelist: # Finds Date Box and Date Box Go Button date_box = driver.find_element_by_xpath('//*[@id="content"]/form/div[2]/table/tbody/tr/td[1]/table/tbody/tr/td[2]/input') date_clicker = driver.find_element_by_xpath('//*[@id="content"]/form/div[2]/table/tbody/tr/td[2]/table/tbody/tr/td/a') # Input date into datebox date_box.clear() date_box.send_keys(d.strftime("%m/%d/%Y")) # Click date_box date_clicker.click() # Pause to allow to load time.sleep(5) # Clicks download csv_button = driver.find_element_by_xpath('//*[@id="content"]/form/div[2]/div/table/tbody/tr/td[4]/table/tbody/tr/td[1]/a') csv_button.click() driver.close()
driver.get ('https://scgenvoy.sempra.com/index.html#nav=/Public/ViewExternalLowOFO .getLowOFO% 3Frand% 3D200 ')
## Input parameters start_date = '5/28/19' end_date = '5/31/19' #### Loops through date range and pulls data ## Date Range ## datelist = pd.date_range(start=start_date, end=end_date, freq='D',dtype='datetime64[ns]') print(datelist) from selenium import webdriver from selenium.webdriver.common.keys import Keys import time # opens chrome and opens up Gas Envoy driver =webdriver.Chrome('C:/Users/tmrt/Documents/chromedriver_win32/chromedriver.exe')