2
votes

Comment utiliser Python pour déclencher le téléchargement d'un fichier à partir d'un site Web?

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!


0 commentaires

3 Réponses :


0
votes

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.


0 commentaires

0
votes

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


0 commentaires

0
votes

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


0 commentaires