使用Python过滤特定的日期
我想建立一个python脚本从这个site使用Python过滤特定的日期
之前,我已经做了某种类似的事情检索历史风力发电数据后检索网站的表格数据。在这种情况下,日期和相关参数被显式输入到URL地址中。
正如您在上一个链接中看到的,例如该日期是从日历中选择的,并且不会显示为网址的一部分。
如何使用python分别选择一个特定的日期和类型为Settlement Date
和NGC 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通过。
谢谢。
是的,我的意见提出的建议是真正可怕的。 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¶meter=%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'。我右键单击并将其复制到编辑器中供学习。
我觉得下面的脚本将获取你想要的回应:
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)
你大概在我前面13分钟! –
很可能你可以用硒做。如果您想要示例代码,请输入'at'符号并从下拉菜单中选择我的名字以回复此消息。请注意,您还可以安排以xml文件或csv的形式下载结果,这样可以保存解析HTML。 –
@BillBell如果你能帮我一个很好的示例代码。我没有尝试网站的下载选项,因为这个想法是要获得好几个月的数据。 – Arraval