2017-08-02 169 views
0

我試圖使用python requests模塊通過單擊分析來從this網站獲取某些查詢DNA序列的解鏈溫度。我正在使用下面的代碼。Python請求內容不包含響應

import requests 

referer = "http://sg.idtdna.com/calc/analyzer" 
data = {"settings":{"Sequence":"GGGGGGGAAAAAAGGGGGG","NaConc":50,"MgConc":0,"DNTPsConc":0,"OligoConc":0.25,"NucleotideType":"DNA"}} 

r = requests.post(referer, params=data) 
print r.content 

然而,「熔化溫度」等各個領域都在響應的r.content空白。儘管Chrome檢查中名爲「分析」的「響應」標籤中包含我所追求的內容。

查看檢查的元素在這裏。

Chrome inspect element

如果我瀏覽上面的圖像的響應選項卡,我發現其中含有正好我之後的信息如下。

{"Sequence":"GGG GGG GAA AAA AGG GGG G","NaConc":50,"MgConc":0,"dNTPsConc":0,"Complement":"CCC CCC TTT TTT CCC CCC C","Length":19,"GCContent":68.4,"MeltTemp":61.4,"MolecularWeight":6097,"ExtCoefficient":205900,"NmoleOD":4.86,"UgOD":29.61,"NucleotideType":"DNA","OligoConc":0.25,"HasErrors":false,"HasModelErrors":false,"ModelErrors":null,"MinMeltTemp":0,"MaxMeltTemp":0,"Mods":[{"ExtensionData":{},"IntProductId":1012,"ProductName":"DNA","ProductType":0,"PublishedProductNbr":1012,"ShortName":"","TotalProductCount":19}],"Errors":[]} 
+0

這個特定的查詢應該給的61.​​4度的 「熔化溫度」。 – henneray

+0

'requests.post(...'**不是** _ **點擊** _。有一些'javascript'響應點擊。 – stovfl

+0

好點!我已經更新上面。是一個名稱('analyze'),它是一個提供相關信息的'post'請求。我可以在哪裏找到/請求javascript的點擊? – henneray

回答

0

問題:我在哪裏可以找到/要求的JavaScript的點擊?

  1. button Analyze

    <button class="btn btn-primary btn-md btn-block" 
        id="analyze-button" 
        style="width:150px;" 
        data-bind="click: useTool.bind($data, 'analyze') " 
        onclick="TrackPageEvent('Analyze button')"> 
        Analyze 
    </button> 
    
  2. 在頁面源代碼的相關javascript function查找查找相關功能click: useTool在頁面源代碼裏'< SCRIPT> ... </SCRIPT>`。

    from bs4 import BeautifulSoup 
    soup = BeautifulSoup(r.content, "lxml") 
    for script in soup.find_all("script"):  
        for f in ['useTool', 'TrackPageEvent']: 
         if script.find(f): 
          print('MATCH({}) in {}'.format(f, script)) 
    

    NO比賽!

  3. 找到所有'< SCRIPT SRC = ...> </SCRIPT>`

    for script in soup.find_all("script"):  
        src = script.get('src') 
        if src: 
         print('{}'.format(src)) 
    

    輸出
    /site/Scripts/knockout-2.2.1.js
    /site/Scripts/amplify/amplify.core.min.js
    /site/Scripts/amplify/amplify.store.min.js
    /site/scripts/idtdna/Common/RequireJSConfig.js?v=1
    /bootstrap/3.1.1/js/bootstrap.min.js
    /JScripts/idtdna-searchcloudV6.js?v=2
    /JScripts/knockout-3.4.0.js
    /JScripts/uAnalyticsLoad2.js ?v = 2
    /JScripts/IDTHeader.js?v=11
    /calc/Scripts/json2.min.js
    /calc/Areas/Analyzer/Scripts/Analyzer3.js?v=5

    其中一個以/calc開頭的腳本可能是相關腳本。

  4. 下載/calc/Areas/Analyzer/Scripts/Analyzer3.js?v=5並搜索相關函數useTool。 發現在495線:

    self.useTool = function (tool) { 
        ... 
        var url = '/calc/analyzer/home/'; 
        var postData = self.analyzePostData(); 
        ... 
         case 'analyze': 
          url += 'analyze'; 
        ... 
        $.ajax({ 
          url: url, 
          data: JSON.stringify(postData), 
          type: 'POST', 
          dataType: 'json', 
          contentType: 'application/json; charset=utf-8' 
    
  5. 重建使用requests$.ajax(...請求。
    url = /calc/analyzer/home/analyze與你的不同。
    這可能是您的請求未被識別的原因!
    但是使用這個url結果:找不到網頁

    contentType: 'application/json不是從requests默認支持。
    還未能解答。
    相關SO答:how to POST multipart