选择下拉选项并提交表单

时间:2016-06-19 06:40:56

标签: python-requests

我已编写代码从网站获取表格,但我需要通过以下方式访问其他表格:

  1. 从下拉列表中选择时间范围。
  2. 点击“过滤器”按钮提交。
  3. 网站是:

    http://www.myfxbook.com/forex-market/currencies/nzdchf-historical-data

    下拉列表上的Inspect元素显示:

    <select id="timeScales" class="selectField" onfocus="borderChange(this); "onblur="borderReturn(this);" style="border: 1px solid rgb(226, 225, 225);">
    <option id="timeScale1" value="1">1 Minute</option>
    <option id="timeScale5" value="5">5 Minutes</option>
    <option id="timeScale15" value="15">15 Minutes</option>
    <option id="timeScale30" value="30">30 Minutes</option>
    <option id="timeScale60" value="60">1 Hour</option>
    <option id="timeScale240" value="240">4 Hours</option>
    <option id="timeScale1440" value="1440" selected="">1 Day</option>
    <option id="timeScale10080" value="10080">1 Week</option>
    <option id="timeScale43200" value="43200">1 Month</option>
    

    从时间范围下拉列表中,我想选择4个小时,然后点击过滤器按钮。

    我知道如何使用requests.get方法获取HTML,但我遇到的问题是,当我选择下拉值时,URL不会改变。

    我尝试过使用requests.post,但我显然不知道如何使用它。 我正在编写这个程序使用“如何使用PYTHON自动化镗孔”作为教程,作者没有解释如何以编程方式单击下拉菜单和单击按钮。

    他确实解释了Selenium的使用,但我必须重复这个过程超过30次,每次打开一个新页面需要太长时间。

    如果你能说明如何使用请求模块(如果可能的话)来实现这一点,我将不胜感激。

1 个答案:

答案 0 :(得分:5)

你不能点击一个带有请求的按钮,你可以做的是模仿获取数据的请求,当你选择一个时间段时,点击过滤一个ajax请求:

enter image description here

所以为了模仿那个并获得html,我们需要通过下面的参数:

import requests

params = {"start": "2016-02-02 00:00",
          "end": "2016-06-20 00:00",
          "symbol": "NZDCHF",
          "timeScale": "240",
          "userTimeFormat": "0"}
head = {
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36",
    "X-Requested-With": "XMLHttpRequest"}

url = "http://www.myfxbook.com/getHistoricalDataByDate.json"
js = requests.get(url, params=params, headers=head).json()

然后要获取该表,请访问js["content"]["historyData"]

print(js["content"]["historyData"])

它为您提供了表格:

<table id="symbolMarket" class="sortable maxWidth center dataTable">
    <tr style="height:26px">
        <th sort="string">
            <a class="dotted font11 pointer">Date</a><span id="symbolMarketImg0"></span>
        </th>
        <th><span class="font11">Open</span></th>
        <th><span class="font11">High</span></th>
        <th><span class="font11">Low</span></th>
        <th width="63"><span class="font11">Close</span></th>
        <th sort="float" >
            <a class="dotted font11 pointer">Change (Pips)</a><span id="symbolMarketImg5"></span>
        </th>
        <th sort="float" >
            <a class="dotted font11 pointer">Change (%)</a><span id="symbolMarketImg6"></span>
        </th>
    </tr>
                <tr onmouseover="this.className='normalActive';" onmouseout="this.className='';">
            <td><span name="timeNZDCHF">Jun 20, 2016 00:00</span></td>
            <td><span name="openNZDCHF">0.67771</span></td>
            <td><span name="highNZDCHF">0.68133</span></td>
            <td><span name="lowNZDCHF">0.67771</span></td>
            <td><span name="closeNZDCHF">0.68057</span></td>
            <td class="bold"><span name="changePipsNZDCHF"><span class='green'>+28.6</span></span></td>
            <td class="bold"><span name="changePercentNZDCHF"><span class='green'>+0.42%</span></span></td>
        </tr>

  ......................................

您可以使用 Beautifulsoup 轻松解析原始页面以获取标记中的值:

In [7]: from bs4 import BeautifulSoup

In [8]: h = """<select id="timeScales" class="selectField" onfocus="borderChange(this); "onblur="borderReturn(this);" style="border: 1px solid rgb(226, 225, 225);">
   ...: <option id="timeScale1" value="1">1 Minute</option>
   ...: <option id="timeScale5" value="5">5 Minutes</option>
   ...: <option id="timeScale15" value="15">15 Minutes</option>
   ...: <option id="timeScale30" value="30">30 Minutes</option>
   ...: <option id="timeScale60" value="60">1 Hour</option>
   ...: <option id="timeScale240" value="240">4 Hours</option>
   ...: <option id="timeScale1440" value="1440" selected="">1 Day</option>
   ...: <option id="timeScale10080" value="10080">1 Week</option>
   ...: <option id="timeScale43200" value="43200">1 Month</option>"""

In [9]: soup = BeautifulSoup(h,"html.parser")

In [10]: durations = ([opt["value"] for opt in soup.select("#timeScales option")])

In [11]: durations
Out[11]: [u'1', u'5', u'15', u'30', u'60', u'240', u'1440', u'10080', u'43200']

但我不明白其背后的逻辑,因为持续时间以分钟为单位,您需要知道数据的持续时间。