2016-03-13 18 views
0

我一直試圖從http://www.nasdaq.com/symbol/dal/historical自動使用Python(版本3.5.1)獲取數據。作爲其中的一部分,我需要使用網站的下拉菜單將時間範圍從默認的3個月改爲2年。該人士是這樣的:使用python來抓取基於下拉菜單更改的網頁

<h4>Get up to 10 years of daily historical stock prices &amp; volumes.</h4> 
<div class="floatL"> 
    <p>Select the Timeframe:</p> 
</div> 
<div class="floatL marginT10px fontS14px"> 
    <select id="ddlTimeFrame" name="ddlTimeFrame" onchange="getQuotes(false)"> 
     <option value="5d">5 Days</option> 
     <option value="1m">1 Month</option> 
     <option value="3m" selected="selected">3 Months</option> 
     <option value="6m">6 Months</option> 
     <option value="1y">1 Year</option> 
     <option value="18m">18 Months</option> 
     <option value="2y">2 Years</option> 
     <option value="3y">3 Years</option> 
     <option value="4y">4 Years</option> 
     <option value="5y">5 Years</option> 
     <option value="6y">6 Years</option> 
     <option value="7y">7 Years</option> 
     <option value="8y">8 Years</option> 
     <option value="9y">9 Years</option> 
     <option value="10y">10 Years</option> 
    </select> 
</div> 
<div class="clearB"></div> 
<div class="realtiveP"> 
    <div id="ajaxloader" class="ajax_loading_wrap" style="display:none"> 
     <img src="http://www.nasdaq.com/images/ajax-loader-2.gif" width="32" height="32" alt="ajax loader" /> 
    </div> 
</div> 

我已經寫代碼,成功讀取的網頁,但我一直沒能在時限3個月改變。實際上,從列表中手動選擇會更改頁面而不是源代碼。這裏是我使用的代碼:

import urllib.request 
import urllib.parse 
url="http://www.nasdaq.com/symbol/dal/historical" 
pageInputs={"ddlTimeFrame":"2y"} 
pageGets = urllib.parse.urlencode(pageInputs) 
pageGets=pageGets.encode("ascii") 
serReq=urllib.request.Request(url,pageGets) 
opReq=urllib.request.urlopen(serReq) 
rdReq=opReq.read() 
dcReq=rdReq.decode() 

就像我說的,通過網頁閱讀工作就好了。我需要找到一種方法來改變默認值的時間範圍。

+0

http://niimh.nic.in/ebooks/ecaraka/?mod=read – Gowthaman

+0

怎麼湊上述網站,請幫我 – Gowthaman

回答

0

如果你只是想收集數據(而不是整個頁面),下面是函數getQuotes(下載)的源代碼,你會考慮。使用

function getQuotes(download) { 
     if (!download) 
      showLoadingSpinner(); 

     var data = $("[id$='ddlTimeFrame']").val(); 
     var submitString = data + '|' + download + "|" + quoteBoxSelectedSymbol; if (!download) { 
      $.ajax({ 
       type: "POST", 
       url: baseUrl, 
       data: submitString, 
       contentType: "application/json", 
       success: function (response) { 
        $("[id$='historicalContainer']").html(response); 
        $(".genTable tbody tr:odd").addClass("genTablealt"); 
        hideLoadingSpinner(); 
       } 
      }); 
     } 
     else { 
      $("[id$='submitString']").val(submitString); 
      $("#getFile").submit(); 
     } 
    } 

實際參數:

url: "http://www.nasdaq.com/symbol/dal/historical", 
data: "2y|false|DAL" 

但你必須處理跨來源資源共享的問題,因爲他們似乎拒絕來自其他主機的資源請求。

+0

如果這個或任何回答已經解決了您的問題,請考慮[接受它( http://meta.stackexchange.com/q/5234/179419)點擊複選標記。這向更廣泛的社區表明,您已經找到了解決方案,併爲答覆者和您自己提供了一些聲譽。沒有義務這樣做。 –

0

的一點要注意的是onchange="getQuotes(false)"

如果CTRL-F 「getQuotes」,你會發現Ajax調用:

function getQuotes(download) { 
    if (!download) 
     showLoadingSpinner(); 

    var data = $("[id$='ddlTimeFrame']").val(); 
    var submitString = data + '|' + download + "|" + quoteBoxSelectedSymbol; if (!download) { 
     $.ajax({ 
      type: "POST", 
      url: baseUrl, 
      data: submitString, 
      contentType: "application/json", 
      success: function (response) { 
       $("[id$='historicalContainer']").html(response); 
       $(".genTable tbody tr:odd").addClass("genTablealt"); 
       hideLoadingSpinner(); 
      } 
     }); 
    } 
    else { 
     $("[id$='submitString']").val(submitString); 
     $("#getFile").submit(); 
    } 
} 

要轉換一個AJAX調用蟒蛇看到convert an ajax http post to python

響應將包含<tr>中的數據標籤

示例:

import requests, bs4 

r = requests.post('http://www.nasdaq.com/symbol/aapl/historical', 
     data='10y|false|AAPL', headers={'content-type': 'application/json'}) 
soup = bs4.BeautifulSoup(r.text, 'lxml') 
rows = soup.select('tr') 
for row in rows[1:]: 
    td = row.find_all('td') 
    date = td[0].text.strip() 
    open = td[1].text.strip() 
    high = td[2].text.strip() 
    low = td[3].text.strip() 
    close = td[4].text.strip() 
    volume = td[5].text.strip() 
    ...