2017-08-02 158 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