过滤特定日期后使用Python检索网站表数据

时间:2017-08-28 15:34:32

标签: python-2.7 web-scraping calendar

我正在尝试构建一个python脚本来从此site

中检索历史风力数据 我之前做过类似的事情。在这种情况下,日期和相关参数明确地输入到URL地址中。

正如您在上一个链接中所看到的,例如日期是从日历中选择的,不会显示为网址的一部分。

如何使用python选择特定日期并分别输入字段Settlement DateNGC BM Unit Id的ID?

例如:

Settlement Date = 2017-08-01

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)

但在这种情况下它并不那么简单,因为过滤器参数不会通过网址传递。

感谢。

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

是的,我在评论中提出的建议真的非常糟糕。沙欣是对的。我要补充的是你可以在json中获得相对容易处理的结果。到目前为止,我花了这么长时间。

convert image.png -crop 229x367+39+0 +repage image_cropped.png

>>> 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]> 的结果是json,这看起来很可怕。但是,在检查时,它被证明是一系列嵌套的词典。最后,如果你挖洞,你发现r是48个词典的列表,你可以从中轻松提取你想要的任何词典。

'item'

您可以将>>> 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'

附录:如果你不知道我是如何得到那个网址的,那就是它。我使用的是Chrome浏览器。我右键单击任何元素,然后点击'Inspect'。然后我点击了右侧窗格中的“网络”标签,然后点击了“XHR”。现在我点击了“查看”按钮。正如您在下面的小屏幕视图中看到的,我可以在表格中看到'?q = tablegen'。我右键单击并将其复制到编辑器中进行研究。

Chrome Network tab