2017-08-02 1 views
0

Ich versuche, Python requests Modul zu verwenden, um die Schmelztemperatur von einigen Abfrage DNA-Sequenz von this Website durch Klicken auf zu analysieren. Ich verwende den folgenden Code.Python Anfragen Inhalt enthält keine Antwort

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 

jedoch die „MELT TEMP“ und alle anderen Felder sind in der r.content der Antwort leer. Dies ist trotz der "Response" -Registerkarte unter dem Namen "analyze" in Chrome inspect mit dem Inhalt, nach dem ich bin.

Siehe das inspizierte Element hier.

Chrome inspect element

Wenn ich die die Registerkarte Antwort des obigen Bildes navigieren, finde ich die folgenden, die genau enthält die Informationen, die ich nach bin.

{"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

Diese besondere Abfrage eines "MELT TEMP" von 61,4 Grad geben soll. – henneray

+0

'requests.post (...' ** ist nicht ** ein _ ** click ** _. Es gibt einige 'javascript', die auf den Klick reagieren. – stovfl

+0

Guter Punkt! Ich habe oben aktualisiert. Es scheint nur zu sei ein Name ('analyze'), das ist eine' post' Anfrage, die die relevanten Informationen gibt. Wo finde ich/javascript für den Klick? – henneray

Antwort

0

Frage: Wo könnte ich find/JavaScript für den Klick anfordern?

  1. in Seitenquelle, die entsprechenden javascript function vom 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. Finden Sie die entsprechende Funktion click: useTool in Seite Quelle in < 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)) 
    

    Es gibt NO Spiel!

  3. Finden Sie alle '< script src = ...> </script> `

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

    Ausgang:
    /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

    Eines der Skripts beginnend mit /calc ist wahrscheinlich das Relevante Skript.

  4. Laden Sie /calc/Areas/Analyzer/Scripts/Analyzer3.js?v=5 herunter und suchen Sie nach der relevanten Funktion useTool. bei Line 495 Gefunden:

    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. Rebuild die $.ajax(... Anfrage mit requests.
    Die url = /calc/analyzer/home/analyze ist anders als Ihre.
    Dies könnte der Grund sein, warum Ihre Anfrage nicht erkannt wird!
    Aber mit Hilfe dieser url Ergebnisse in: Seite nicht gefunden

    Die contentType: 'application/json nicht von requests von Standard unterstützt.
    Konnte das noch nicht beantworten.
    Relevante SO Antwort: how to POST multipart

Verwandte Themen