2017-08-28 79 views
1

我想建立一個python腳本從這個site使用Python過濾特定的日期

之前,我已經做了某種類似的事情檢索歷史風力發電數據後檢索網站的表格數據。在這種情況下,日期和相關參數被顯式輸入到URL地址中。

正如您在上一個鏈接中看到的,例如該日期是從日曆中選擇的,並且不會顯示爲網址的一部分。

如何使用python分別選擇一個特定的日期和類型爲Settlement DateNGC BM Unit Id的字段?

例如:

Settlement Date = 2017年8月1日

NGC BM Unit Id = ANSUW-1

我沒有MWE,因爲我不知道如何着手。我試圖重新使用其他腳本我會用來獲取氣象資料代碼:

from lxml import html 
    from lxml import etree 
    import urllib 

    def gettabledata(): 

    web= urllib.urlopen("https://www.bmreports.com/bmrs/?q=actgenration/actualgeneration") 
    s = web.read() 
    html = etree.HTML(s) 

但在這種情況下,它沒有那麼簡單,因爲濾波器參數不通過URL通過。

謝謝。

+0

很可能你可以用硒做。如果您想要示例代碼,請輸入'at'符號並從下拉菜單中選擇我的名字以回覆此消息。請注意,您還可以安排以xml文件或csv的形式下載結果,這樣可以保存解析HTML。 –

+0

@BillBell如果你能幫我一個很好的示例代碼。我沒有嘗試網站的下載選項,因爲這個想法是要獲得好幾個月的數據。 – Arraval

回答

1

是的,我的意見提出的建議是真正可怕的。 Shahin是對的。我要補充的是,你可以在json中得到相對容易處理的結果。爲了達到這一點,我花了很長時間。

>>> import requests 
>>> parameter={"flowid":"b1610","start_date":"2017-08-02","period":"*","bmu_id":"ANSUW-1"} 
>>> arg = 'https://www.bmreports.com/bmrs/?q=tablegen&parameter=%s' % str(parameter).replace("'",'"').replace(' ','') 
>>> r = requests.get(arg) 
>>> r 
<Response [200]> 

r的結果是json,這確實看起來很可怕。然而,在檢查時,它被證明是一系列嵌套字典。最終,如果你在洞穴中發現'item'是48個字典的列表,你可以從中輕鬆提取任何你想要的東西。

>>> r.json()['responseBody']['responseList']['item'][0] 
{'quantity': '1.414', 'marketGenerationBMUId': 'T_ANSUW-1', 'timeSeriesID': 'ELX-EMFIP-AGOG-TS-14842', 'powerSystemResourceType': 'Generation', 'resolution': 'PT30M', 'documentRevNum': '1', 'bMUnitID': 'T_ANSUW-1', 'registeredResourceEICCode': '48W00000ANSUW-1E', 'businessType': 'Production', 'settlementPeriod': '48', 'curveType': 'Sequential fixed size block', 'marketGenerationUnitEICCode': '48W00000ANSUW-1E', 'activeFlag': 'Y', 'nGCBMUnitID': 'ANSUW-1', 'processType': 'Realised', 'documentID': 'ELX-EMFIP-AGOG-17134615', 'marketGenerationNGCBMUId': 'ANSUW-1', 'settlementDate': '2017-08-02', 'documentType': 'Actual generation'} 
>>> r.json()['responseBody']['responseList']['item'][47] 
{'quantity': '1.088', 'marketGenerationBMUId': 'T_ANSUW-1', 'timeSeriesID': 'ELX-EMFIP-AGOG-TS-172', 'powerSystemResourceType': 'Generation', 'resolution': 'PT30M', 'documentRevNum': '1', 'bMUnitID': 'T_ANSUW-1', 'registeredResourceEICCode': '48W00000ANSUW-1E', 'businessType': 'Production', 'settlementPeriod': '1', 'curveType': 'Sequential fixed size block', 'marketGenerationUnitEICCode': '48W00000ANSUW-1E', 'activeFlag': 'Y', 'nGCBMUnitID': 'ANSUW-1', 'processType': 'Realised', 'documentID': 'ELX-EMFIP-AGOG-17134615', 'marketGenerationNGCBMUId': 'ANSUW-1', 'settlementDate': '2017-08-02', 'documentType': 'Actual generation'} 

您可以設置items'item'字典,然後從那裏走。

>>> items = r.json()['responseBody']['responseList']['item'] 
>>> items[0]['settlementPeriod'] 
'48' 
>>> items[47]['quantity'] 
'1.088' 

附錄:萬一你不知道我是如何得到這個網址的,那就是它。我使用了Chrome瀏覽器。我右鍵單擊任何元素,然後點擊'檢查'。然後,我點擊右側窗格中的「網絡」選項卡,然後點擊「XHR」。現在我點擊'查看'按鈕。正如你在下面的小屏幕視圖中看到的,我可以在表格中看到'?q = tablegen'。我右鍵單擊並將其複製到編輯器中供學習。

Chrome Network tab

2

我覺得下面的腳本將獲取你想要的迴應:

import requests 

payload = {"flowid":"b1610","start_date":"2017-08-01","period":"*","bmu_id":"ANSUW-1"} 

headers={ 
"User-Agent":"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36", 
"X-Requested-With":"XMLHttpRequest" 
} 

page = requests.get("https://www.bmreports.com/bmrs/?", params=payload, headers=headers).text 

print(page) 
+0

你大概在我前面13分鐘! –