2016-06-19 4 views
0

Я написал код, чтобы получить таблицы с веб-сайта, но мне нужно, чтобы получить доступ к дополнительной таблице по:Выберите раскрывающийся вариант и отправить форму

  1. выбора времени кадра из выпадающего списка.
  2. отправки путем нажатия кнопки «фильтр».

Сайт:

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

Осмотрите элемент на раскрывающемся меню показывает это:

<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 часа, а затем нажмите на фильтр.

Я знаю, как получить HTML с помощью метода request.get, но проблема, с которой я столкнулась, заключается в том, что URL-адрес не изменяется, когда я выбираю выпадающее значение.

Я пробовал использовать request.post, но я, очевидно, не знаю, как его использовать. Я пишу эту программу, используя «КАК АВТОМАТИЗИРОВАТЬ СКОРОСТЬ ИСПОЛЬЗОВАНИЯ ПИТОНА» в качестве учебника, и автор не объясняет, как программно нажимать раскрывающиеся меню и кнопки.

Он объясняет использование Selenium, но я должен повторить этот процесс более 30 раз, и каждый раз открывать новую страницу занимает слишком много времени.

Буду признателен, если бы вы могли показать, как это может быть достигнуто с помощью модуля запросов (если это возможно).

ответ

4

Вы не можете нажмите кнопку с запросами, что вы можете сделать, это мнемонические запросы, которые получают данные, когда вы выбираете период времени щелчка фильтровать Ajax запрос сделан:

enter image description here

Так чтобы имитировать, что и получить HTML, мы должны пройти Params ниже:

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

Но я не см. логику этого, поскольку длительность в минутах, и вам нужно знать свою продолжительность для данных.

Смежные вопросы