{"id":587,"date":"2018-11-06T12:26:00","date_gmt":"2018-11-06T18:26:00","guid":{"rendered":"https:\/\/blog.felineflock.com\/?p=587"},"modified":"2024-01-01T12:27:47","modified_gmt":"2024-01-01T18:27:47","slug":"how-to-connect-to-salesforce-from-a-python-jupyter-notebook","status":"publish","type":"post","link":"https:\/\/blog.felineflock.com\/index.php\/2018\/11\/06\/how-to-connect-to-salesforce-from-a-python-jupyter-notebook\/","title":{"rendered":"How to Connect to Salesforce from a Python\/Jupyter Notebook"},"content":{"rendered":"\n<p>It might be useful to extract data from Salesforce directly into Python and manipulate the data as a Pandas dataframe.<\/p>\n\n\n\n<p>First, you need to create a Connected App in Salesforce and copy the consumer key and consumer secret.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"538\" src=\"https:\/\/blog.felineflock.com\/wp-content\/uploads\/2024\/01\/pythonSF1-1024x538.png\" alt=\"\" class=\"wp-image-588\" srcset=\"https:\/\/blog.felineflock.com\/wp-content\/uploads\/2024\/01\/pythonSF1-1024x538.png 1024w, https:\/\/blog.felineflock.com\/wp-content\/uploads\/2024\/01\/pythonSF1-300x158.png 300w, https:\/\/blog.felineflock.com\/wp-content\/uploads\/2024\/01\/pythonSF1-768x403.png 768w, https:\/\/blog.felineflock.com\/wp-content\/uploads\/2024\/01\/pythonSF1-1536x807.png 1536w, https:\/\/blog.felineflock.com\/wp-content\/uploads\/2024\/01\/pythonSF1.png 1824w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Then start your Jupyter Notebook and create a Python notebook.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"828\" height=\"550\" src=\"https:\/\/blog.felineflock.com\/wp-content\/uploads\/2024\/01\/pythonSF2.png\" alt=\"\" class=\"wp-image-589\" srcset=\"https:\/\/blog.felineflock.com\/wp-content\/uploads\/2024\/01\/pythonSF2.png 828w, https:\/\/blog.felineflock.com\/wp-content\/uploads\/2024\/01\/pythonSF2-300x199.png 300w, https:\/\/blog.felineflock.com\/wp-content\/uploads\/2024\/01\/pythonSF2-768x510.png 768w\" sizes=\"auto, (max-width: 828px) 100vw, 828px\" \/><\/figure>\n\n\n\n<p>Start coding your Python notebook as follows:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>import requests <\/p>\n\n\n\n<p>import json ## Authorization <\/p>\n\n\n\n<p>consumer_key = &#8220;enter the consumer key from your connected app here&#8221; <\/p>\n\n\n\n<p>consumer_secret = &#8220;enter the consumer secret from your connected app here&#8221; <\/p>\n\n\n\n<p>username = &#8220;enter your Salesforce username here&#8221; <\/p>\n\n\n\n<p>password = &#8220;enter your Salesforce password here&#8221;\u00a0 <\/p>\n\n\n\n<p>headers = { &#8216;Content-Type&#8217;: &#8216;application\/x-www-form-urlencoded&#8217; } <\/p>\n\n\n\n<p>body = &#8220;grant_type=password&amp;client_id=&#8221; + consumer_key \\<\/p>\n\n\n\n<p> \u00a0 \u00a0 + &#8220;&amp;client_secret=&#8221; + consumer_secret + &#8220;&amp;username=&#8221; \\<\/p>\n\n\n\n<p> \u00a0 \u00a0 + username + &#8220;&amp;password=&#8221; + password <\/p>\n\n\n\n<p>url = &#8220;https:\/\/login.salesforce.com\/services\/oauth2\/token&#8221; <\/p>\n\n\n\n<p>resp = requests.post( url, headers= headers, data= body ) <\/p>\n\n\n\n<p>print( &#8216;Status: &#8216; + str( resp.status_code ) ) <\/p>\n\n\n\n<p>print( json.dumps( resp.json(), indent= 4 ) ) <\/p>\n\n\n\n<p>print( resp.json()[ &#8220;access_token&#8221; ] )<\/p>\n<\/blockquote>\n\n\n\n<p>When executing, you should get results like below:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Status: 200 <\/p>\n\n\n\n<p>{ <\/p>\n\n\n\n<p>    &#8220;access_token&#8221;: &#8220;00D&#8230; really long string here &#8230;&#8221;, <\/p>\n\n\n\n<p>    &#8220;instance_url&#8221;: &#8220;https:\/\/na35.salesforce.com&#8221;, <\/p>\n\n\n\n<p>    &#8220;id&#8221;: &#8220;https:\/\/login.salesforce.com\/id\/00D &#8230;&#8221;, <\/p>\n\n\n\n<p>    &#8220;token_type&#8221;: &#8220;Bearer&#8221;, <\/p>\n\n\n\n<p>    &#8220;issued_at&#8221;: &#8220;1541562541782&#8221;, <\/p>\n\n\n\n<p>    &#8220;signature&#8221;: &#8220;&#8230; encoded string &#8230;&#8221; <\/p>\n\n\n\n<p>} <\/p>\n\n\n\n<p>00D &#8230; really long string here &#8230;<\/p>\n<\/blockquote>\n\n\n\n<p>Continue adding the code below:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>session_id = resp.json()[ &#8220;access_token&#8221; ] <\/p>\n\n\n\n<p>headers = { &#8216;Authorization&#8217;: &#8216;Bearer &#8216; + session_id\u00a0 } <\/p>\n\n\n\n<p>instance_url = resp.json()[ &#8220;instance_url&#8221; ] <\/p>\n\n\n\n<p>query = &#8216;SELECT ID, Name, BillingCity FROM Account&#8217; <\/p>\n\n\n\n<p># using Bulk API 1.0 <\/p>\n\n\n\n<p>url = instance_url + &#8216;\/services\/data\/v36.0\/query?q=&#8217; + query <\/p>\n\n\n\n<p>resp = requests.get( url, headers= headers ) <\/p>\n\n\n\n<p>jsonResponse = resp.json() <\/p>\n\n\n\n<p>print( &#8216;Status: &#8216; + str( resp.status_code ) ) <\/p>\n\n\n\n<p>print( json.dumps( jsonResponse, indent= 4 ) )<\/p>\n<\/blockquote>\n\n\n\n<p>And the resulting execution should look like this:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Status: 200 <\/p>\n\n\n\n<p>{ &#8220;totalSize&#8221;: 12, <\/p>\n\n\n\n<p>    &#8220;done&#8221;: true, <\/p>\n\n\n\n<p>    &#8220;records&#8221;: [ { &#8220;attributes&#8221;: { <\/p>\n\n\n\n<p>        &#8220;type&#8221;: &#8220;Account&#8221;, <\/p>\n\n\n\n<p>        &#8220;url&#8221;: &#8220;\/services\/data\/v36.0\/sobjects\/Account\/001&#8230;.&#8221; <\/p>\n\n\n\n<p>    }, <\/p>\n\n\n\n<p>    &#8220;Id&#8221;: &#8220;001&#8230;.&#8221;, <\/p>\n\n\n\n<p>    &#8220;Name&#8221;: &#8220;GenePoint&#8221;, <\/p>\n\n\n\n<p>    &#8220;BillingCity&#8221;: &#8220;Mountain View&#8221; <\/p>\n\n\n\n<p>}, &#8230;&#8230;&#8230;&#8230;..<\/p>\n<\/blockquote>\n\n\n\n<p>If you want to you can work with the data in JSON as is:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p># first record <\/p>\n\n\n\n<p>print( jsonResponse[ &#8220;records&#8221; ][ 0 ] ) <\/p>\n\n\n\n<p># first record id <\/p>\n\n\n\n<p>print( jsonResponse[ &#8220;records&#8221; ][ 0 ][ &#8220;Id&#8221; ] )<\/p>\n<\/blockquote>\n\n\n\n<p>But you can convert the JSON data to a Panda dataframe, which is a lot more powerful:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>import pandas as pd <\/p>\n\n\n\n<p>from pandas.io.json import json_normalize <\/p>\n\n\n\n<p>data \u200b= jsonResponse[ &#8220;records&#8221; ] <\/p>\n\n\n\n<p>df = pd.DataFrame.from_dict( json_normalize( data ), orient= &#8216;columns&#8217; ) <\/p>\n\n\n\n<p>df<\/p>\n<\/blockquote>\n\n\n\n<p>And get a dataframe like this:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"443\" src=\"https:\/\/blog.felineflock.com\/wp-content\/uploads\/2024\/01\/pythonSF3-1024x443.png\" alt=\"\" class=\"wp-image-590\" srcset=\"https:\/\/blog.felineflock.com\/wp-content\/uploads\/2024\/01\/pythonSF3-1024x443.png 1024w, https:\/\/blog.felineflock.com\/wp-content\/uploads\/2024\/01\/pythonSF3-300x130.png 300w, https:\/\/blog.felineflock.com\/wp-content\/uploads\/2024\/01\/pythonSF3-768x332.png 768w, https:\/\/blog.felineflock.com\/wp-content\/uploads\/2024\/01\/pythonSF3-1536x664.png 1536w, https:\/\/blog.felineflock.com\/wp-content\/uploads\/2024\/01\/pythonSF3.png 1850w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Alternatively, you can use a Python library like simple-salesforce:&nbsp;<a href=\"https:\/\/pypi.org\/project\/simple-salesforce\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/pypi.org\/project\/simple-salesforce\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>It might be useful to extract data from Salesforce directly into Python and manipulate the data as a Pandas dataframe. First, you need to create a Connected App in Salesforce and copy the consumer key and consumer secret. Then start your Jupyter Notebook and create a Python notebook. Start coding your Python notebook as follows: [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-587","post","type-post","status-publish","format-standard","hentry","category-blog"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/blog.felineflock.com\/index.php\/wp-json\/wp\/v2\/posts\/587","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.felineflock.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.felineflock.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.felineflock.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.felineflock.com\/index.php\/wp-json\/wp\/v2\/comments?post=587"}],"version-history":[{"count":1,"href":"https:\/\/blog.felineflock.com\/index.php\/wp-json\/wp\/v2\/posts\/587\/revisions"}],"predecessor-version":[{"id":591,"href":"https:\/\/blog.felineflock.com\/index.php\/wp-json\/wp\/v2\/posts\/587\/revisions\/591"}],"wp:attachment":[{"href":"https:\/\/blog.felineflock.com\/index.php\/wp-json\/wp\/v2\/media?parent=587"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.felineflock.com\/index.php\/wp-json\/wp\/v2\/categories?post=587"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.felineflock.com\/index.php\/wp-json\/wp\/v2\/tags?post=587"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}