<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://bhishan.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://bhishan.github.io/" rel="alternate" type="text/html" /><updated>2026-03-23T11:13:36+00:00</updated><id>https://bhishan.github.io/feed.xml</id><title type="html">Bhishan Bhandari / Product and Engineering</title><subtitle>Bhishan Bhandari&apos;s portfolio</subtitle><author><name>Bhishan Bhandari</name><email>bhishan.bhandari@yaypply.com, bbhishan@gmail.com</email></author><entry><title type="html">Python and Excel</title><link href="https://bhishan.github.io/posts/2018-12/python-and-excel/" rel="alternate" type="text/html" title="Python and Excel" /><published>2018-12-09T00:00:00+00:00</published><updated>2018-12-09T00:00:00+00:00</updated><id>https://bhishan.github.io/posts/2018-12/python-and-excel</id><content type="html" xml:base="https://bhishan.github.io/posts/2018-12/python-and-excel/"><![CDATA[<p>I intend to host a set of examples on using python to interact and work with excel files. This article in particular will use openpyxl module in python throughout the examples.</p>

<h1 id="installing-openpyxl">Installing openpyxl</h1>
<p>I am using python3 throughout the examples, however it should work similarly with python2. As a good development practice, we should segregate dependencies between various projects and therefore is advised to use virtual environment or some sort.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>python3 -m venv excelenv
source excelenv/bin/activate
pip install openpyxl
</code></pre></div></div>

<h1 id="open-an-existing-document-in-python">Open an existing document in python</h1>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&gt;&gt;&gt; import openpyxl
&gt;&gt;&gt; wb = openpyxl.load_workbook('example.xlsx')
&gt;&gt;&gt; wb
&lt;openpyxl.workbook.workbook.Workbook object at 0x7f010dce4240&gt;
&gt;&gt;&gt;
</code></pre></div></div>

<h1 id="selecting-sheets-from-the-workbookdocument">Selecting sheets from the workbook/document</h1>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&gt;&gt;&gt; wb.get_sheet_names()
['Sheet1']
&gt;&gt;&gt;
&gt;&gt;&gt; sheet = wb.get_sheet_by_name("Sheet1")
&gt;&gt;&gt; sheet
&lt;Worksheet "Sheet1"&gt;
&gt;&gt;&gt;
&gt;&gt;&gt; sheet.max_column
3
&gt;&gt;&gt; sheet.max_row
3
&gt;&gt;&gt; sheet.min_row
1
&gt;&gt;&gt; sheet.min_column
2
&gt;&gt;&gt;
&gt;&gt;&gt; sheet['A1'].value
'thetaranights.com'
&gt;&gt;&gt; sheet['B1'].value
102345
&gt;&gt;&gt; sheet['A2'].value
'thetaranights.com'
&gt;&gt;&gt; sheet['B2'].value
123443
&gt;&gt;&gt;
</code></pre></div></div>

<h1 id="when-the-cell-being-accessed-doesnt-have-a-value">When the cell being accessed doesn’t have a value</h1>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&gt;&gt;&gt; a = sheet['A4'].value
&gt;&gt;&gt; a
&gt;&gt;&gt; type(a)
&lt;class 'NoneType'&gt;
&gt;&gt;&gt;
</code></pre></div></div>

<p>OpenPyXL will automatically interpret the types of the values in the cells of the sheet and return them as an object of that type. string , int, dates, etc.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&gt;&gt;&gt; type(sheet['A3'].value)
&lt;class 'str'&gt;
&gt;&gt;&gt; type(sheet['B3'].value)
&lt;class 'int'&gt;
</code></pre></div></div>

<h1 id="accessing-cell-values-using-row-column-directive">Accessing cell values using row, column directive</h1>
<p>Although we can access the values of the cell using alphabetic letters directive, we can also access them using row number and column numbers. An excel row and column starts at 1, not 0.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&gt;&gt;&gt; sheet.cell(row=0, column=0)
Traceback (most recent call last):
  File "&lt;stdin&gt;", line 1, in &lt;module&gt;
  File "/home/bhishan-1504/excelinpython/excelenv/lib/python3.6/site-packages/openpyxl/worksheet/worksheet.py", line 296, in cell
    raise ValueError("Row or column values must be at least 1")
ValueError: Row or column values must be at least 1
&gt;&gt;&gt;

&gt;&gt;&gt; sheet.cell(row=1, column=1)
&lt;Cell 'Sheet1'.A1&gt;
&gt;&gt;&gt; sheet.cell(row=1, column=1).value
'thetaranights.com'
&gt;&gt;&gt;
</code></pre></div></div>

<h1 id="reading-values-from-excel-sheet">Reading values from excel sheet</h1>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&gt;&gt;&gt; wb = openpyxl.load_workbook('example.xlsx')
&gt;&gt;&gt; sheet = wb.get_sheet_by_name("Sheet1")
&gt;&gt;&gt; for each_row in range(sheet.min_row, sheet.max_row + 1):
...     for each_col in range(sheet.min_column, sheet.max_column + 1):
...         print(sheet.cell(row=each_row, column=each_col).value)
...
thetaranights.com
102345
thetaranights.com
123443
thetaranights.com
102234
&gt;&gt;&gt;
</code></pre></div></div>

<h1 id="creating-excel-document">Creating excel document</h1>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&gt;&gt;&gt; import openpyxl
&gt;&gt;&gt; wb = openpyxl.Workbook()
&gt;&gt;&gt; wb.get_sheet_names()
['Sheet']
&gt;&gt;&gt; sheet = wb.get_sheet_by_name('Sheet')
&gt;&gt;&gt; sheet
&lt;Worksheet "Sheet"&gt;
&gt;&gt;&gt; sheet.title = 'Custom Created worksheet'
&gt;&gt;&gt; wb.get_sheet_names()
['Custom Created worksheet']
&gt;&gt;&gt; sheet
&lt;Worksheet "Custom Created worksheet"&gt;
&gt;&gt;&gt; sheet['A1'] = 'thetaranights.com'
&gt;&gt;&gt; sheet['A1'].value
'thetaranights.com'
&gt;&gt;&gt;
&gt;&gt;&gt; sheet.append(['thetaranights.com', '102948']) # adding rows to sheet
&gt;&gt;&gt; wb.save('createdbyopenpyxl.xlsx')
&gt;&gt;&gt;
</code></pre></div></div>]]></content><author><name>Bhishan Bhandari</name><email>bhishan.bhandari@yaypply.com, bbhishan@gmail.com</email></author><category term="python" /><category term="excel" /><category term="openpyxl" /><category term="data-processing" /><summary type="html"><![CDATA[I intend to host a set of examples on using python to interact and work with excel files. This article in particular will use openpyxl module in python throughout the examples.]]></summary></entry><entry><title type="html">Idiomatic Python - Use of Falsy and Truthy Concepts</title><link href="https://bhishan.github.io/posts/2018/12/idiomatic-python-use-of-falsy-and-truthy-concepts/" rel="alternate" type="text/html" title="Idiomatic Python - Use of Falsy and Truthy Concepts" /><published>2018-12-05T00:00:00+00:00</published><updated>2018-12-05T00:00:00+00:00</updated><id>https://bhishan.github.io/posts/2018/12/idiomatic-python-use-of-falsy-and-truthy-concepts</id><content type="html" xml:base="https://bhishan.github.io/posts/2018/12/idiomatic-python-use-of-falsy-and-truthy-concepts/"><![CDATA[<p>Out of many, one reason for python’s popularity is the readability. Python has code style guidelines and idioms and these allow future readers of the code to comprehend to the intentions of it. It is highly important that the code is readable and concise. One such important tip is to use falsy and truthy concepts.</p>

<p>It should be at our best interest to avoid direct comparison to True, False, None. As such we should be well known about truthy and falsy concepts.</p>

<p>Truthy refers to the values that shall always be considered true. Similarly falsy refers to the values that shall always be considered false.</p>

<p>An empty sequence such as an empty list [], empty dictionaries, 0 for numeric, None are considered false values or falsy. Almost anything excluding the earlier mentioned are considered truthy.</p>

<h2 id="an-example-of-a-code-snippet-that-is-considered-bad">An example of a code snippet that is considered bad:</h2>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">i</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">if</span> <span class="n">i</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
    <span class="n">foo</span><span class="p">()</span>
    <span class="c1"># do something
</span><span class="k">else</span><span class="p">:</span>
    <span class="n">bar</span><span class="p">()</span>
    <span class="c1"># do something else
</span>
<span class="n">x</span> <span class="o">=</span> <span class="bp">True</span>
<span class="k">if</span> <span class="n">x</span> <span class="o">==</span> <span class="bp">True</span><span class="p">:</span>
    <span class="n">foo</span><span class="p">()</span>
    <span class="c1"># do something
</span><span class="k">else</span><span class="p">:</span>
    <span class="n">bar</span><span class="p">()</span>
    <span class="c1"># do something else
</span>
<span class="n">numbers_list</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">]</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">numbers_list</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
    <span class="n">foo</span><span class="p">()</span>
    <span class="c1"># do something
</span></code></pre></div></div>

<h2 id="an-example-of-code-snippet-that-is-considered-relatively-wise">An example of code snippet that is considered relatively wise:</h2>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">i</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">i</span><span class="p">:</span>
    <span class="n">foo</span><span class="p">()</span>
    <span class="c1"># do something
</span><span class="k">else</span><span class="p">:</span>
    <span class="n">bar</span><span class="p">()</span>
    <span class="c1"># do something else
</span>
<span class="n">x</span> <span class="o">=</span> <span class="bp">True</span>
<span class="k">if</span> <span class="n">x</span><span class="p">:</span>
    <span class="n">foo</span><span class="p">()</span>
    <span class="c1"># do something
</span><span class="k">else</span><span class="p">:</span>
    <span class="n">bar</span><span class="p">()</span>
    <span class="c1"># do something else
</span>
<span class="n">numbers_list</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">]</span>
<span class="k">if</span> <span class="n">numbers_list</span><span class="p">:</span>
    <span class="n">foo</span><span class="p">()</span>
    <span class="c1"># do something
</span></code></pre></div></div>]]></content><author><name>Bhishan Bhandari</name><email>bhishan.bhandari@yaypply.com, bbhishan@gmail.com</email></author><category term="Python" /><category term="Truthy" /><category term="Falsy" /><category term="Idiomatic Python" /><category term="Code Style" /><summary type="html"><![CDATA[Out of many, one reason for python’s popularity is the readability. Python has code style guidelines and idioms and these allow future readers of the code to comprehend to the intentions of it. It is highly important that the code is readable and concise. One such important tip is to use falsy and truthy concepts.]]></summary></entry><entry><title type="html">Basic File Operations - Golang</title><link href="https://bhishan.github.io/posts/2018/12/basic-file-operations-golang/" rel="alternate" type="text/html" title="Basic File Operations - Golang" /><published>2018-12-05T00:00:00+00:00</published><updated>2018-12-05T00:00:00+00:00</updated><id>https://bhishan.github.io/posts/2018/12/basic-file-operations-in-golang</id><content type="html" xml:base="https://bhishan.github.io/posts/2018/12/basic-file-operations-golang/"><![CDATA[<p>One of the most basic task when working on a server is the ability to effectively operate with the files and file system. Like many languages, Golang has convenient methods to work with files. The intentions of this post is to host a minimalist set of examples on working with files using Golang.</p>

<h2 id="creating-an-empty-file">Creating an empty file</h2>

<div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">package</span> <span class="n">main</span>

<span class="k">import</span> <span class="p">(</span>
  <span class="s">"log"</span>
  <span class="s">"os"</span>
<span class="p">)</span>

<span class="k">func</span> <span class="n">createFile</span><span class="p">(){</span>
  <span class="n">newFile</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">os</span><span class="o">.</span><span class="n">Create</span><span class="p">(</span><span class="s">"testfile.txt"</span><span class="p">)</span>
  <span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span><span class="p">{</span>
     <span class="n">log</span><span class="o">.</span><span class="n">Fatal</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
  <span class="p">}</span>
  <span class="k">defer</span> <span class="n">newFile</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span>

  <span class="n">log</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="n">newFile</span><span class="p">)</span>
  <span class="c">// operations on file follows</span>
<span class="p">}</span>


<span class="k">func</span> <span class="n">main</span><span class="p">(){</span>
  <span class="n">createFile</span><span class="p">()</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="reading-a-file">Reading a File</h2>

<div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">func</span> <span class="n">readFile</span><span class="p">(){</span>
  <span class="n">fileReader</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">os</span><span class="o">.</span><span class="n">Open</span><span class="p">(</span><span class="s">"test.txt"</span><span class="p">)</span>
  <span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span><span class="p">{</span>
     <span class="n">log</span><span class="o">.</span><span class="n">Fatal</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
  <span class="p">}</span>
   <span class="k">defer</span> <span class="n">fileReader</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span>
  <span class="n">content</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">ioutil</span><span class="o">.</span><span class="n">ReadAll</span><span class="p">(</span><span class="n">fileReader</span><span class="p">)</span>
  <span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span><span class="p">{</span>
     <span class="n">log</span><span class="o">.</span><span class="n">Fatal</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
  <span class="p">}</span>
  <span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="s">"Number of bytes read"</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">content</span><span class="p">))</span>
  <span class="n">fmt</span><span class="o">.</span><span class="n">Printf</span><span class="p">(</span><span class="s">"Data as string : %s"</span><span class="p">,</span> <span class="n">content</span><span class="p">)</span>


<span class="p">}</span>
</code></pre></div></div>

<h2 id="writing-to-a-file">Writing to a file</h2>

<div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">func</span> <span class="n">writeToFile</span><span class="p">(){</span>
  <span class="n">err</span> <span class="o">:=</span> <span class="n">ioutil</span><span class="o">.</span><span class="n">WriteFile</span><span class="p">(</span><span class="s">"testwrite.txt"</span><span class="p">,</span> <span class="p">[]</span><span class="kt">byte</span><span class="p">(</span><span class="s">"Dumping bytes to a file</span><span class="se">\n</span><span class="s">"</span><span class="p">),</span> <span class="m">0666</span><span class="p">)</span>
  <span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span><span class="p">{</span>
     <span class="n">log</span><span class="o">.</span><span class="n">Fatal</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
  <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="truncate-file">Truncate File</h2>

<div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">func</span> <span class="n">TruncateFile</span><span class="p">(){</span>
  <span class="n">err</span> <span class="o">:=</span> <span class="n">os</span><span class="o">.</span><span class="n">Truncate</span><span class="p">(</span><span class="s">"test.txt"</span><span class="p">,</span> <span class="m">100</span><span class="p">)</span>
  <span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span><span class="p">{</span>
     <span class="n">log</span><span class="o">.</span><span class="n">Fatal</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
  <span class="p">}</span><span class="k">else</span><span class="p">{</span>
     <span class="n">fmt</span><span class="o">.</span><span class="n">Print</span><span class="p">(</span><span class="s">"File Truncated"</span><span class="p">)</span>
  <span class="p">}</span>

<span class="p">}</span>
</code></pre></div></div>

<h2 id="file-information">File Information</h2>

<div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">func</span> <span class="n">FileInformation</span><span class="p">(){</span>
  <span class="n">fileInfo</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">os</span><span class="o">.</span><span class="n">Stat</span><span class="p">(</span><span class="s">"test.txt"</span><span class="p">)</span>
  <span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
     <span class="n">log</span><span class="o">.</span><span class="n">Fatal</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
  <span class="p">}</span>
  <span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="s">"File name:"</span><span class="p">,</span> <span class="n">fileInfo</span><span class="o">.</span><span class="n">Name</span><span class="p">())</span>
  <span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="s">"Size in bytes:"</span><span class="p">,</span> <span class="n">fileInfo</span><span class="o">.</span><span class="n">Size</span><span class="p">())</span>
  <span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="s">"Permissions:"</span><span class="p">,</span> <span class="n">fileInfo</span><span class="o">.</span><span class="n">Mode</span><span class="p">())</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="check-if-file-exists-or-not">Check if file exists or not</h2>

<div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">package</span> <span class="n">main</span>

<span class="k">import</span> <span class="p">(</span>
    <span class="s">"os"</span>
    <span class="s">"fmt"</span>
<span class="p">)</span>

<span class="k">func</span> <span class="n">main</span><span class="p">(){</span>
    <span class="k">if</span> <span class="n">_</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">os</span><span class="o">.</span><span class="n">Stat</span><span class="p">(</span><span class="s">"test.txt"</span><span class="p">);</span> <span class="n">os</span><span class="o">.</span><span class="n">IsNotExist</span><span class="p">(</span><span class="n">err</span><span class="p">){</span>
        <span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="s">"The file does not exist"</span><span class="p">)</span>
    <span class="k">return</span>
    <span class="p">}</span>
    <span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="s">"The file exists!"</span><span class="p">)</span>
    <span class="c">//perform operations on the file/file contents</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="moverename-file">Move/Rename File</h2>

<div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">package</span> <span class="n">main</span>
 
<span class="k">import</span> <span class="p">(</span>
    <span class="s">"log"</span>
    <span class="s">"os"</span>
<span class="p">)</span>
 
<span class="k">func</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">currentFileLocation</span> <span class="o">:=</span> <span class="s">"/home/bhishan-1504/golangfilehandling/test.txt"</span>
    <span class="n">toMoveLocation</span> <span class="o">:=</span> <span class="s">"/home/bhishan-1504/golangrestapi/test.txt"</span>
    <span class="n">err</span> <span class="o">:=</span> <span class="n">os</span><span class="o">.</span><span class="n">Rename</span><span class="p">(</span><span class="n">currentFileLocation</span><span class="p">,</span> <span class="n">toMoveLocation</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
        <span class="n">log</span><span class="o">.</span><span class="n">Fatal</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="copy-file">Copy File</h2>

<div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">package</span> <span class="n">main</span>

<span class="k">import</span> <span class="p">(</span>
  <span class="s">"io"</span>
  <span class="s">"log"</span>
  <span class="s">"os"</span>
  <span class="s">"fmt"</span>
<span class="p">)</span>

<span class="k">func</span> <span class="n">main</span><span class="p">(){</span>
  <span class="n">source</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">os</span><span class="o">.</span><span class="n">Open</span><span class="p">(</span><span class="s">"test.txt"</span><span class="p">)</span>
  <span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span><span class="p">{</span>
    <span class="n">log</span><span class="o">.</span><span class="n">Fatal</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
  <span class="p">}</span>
  <span class="k">defer</span> <span class="n">source</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span>

  <span class="n">sourceCopied</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">os</span><span class="o">.</span><span class="n">OpenFile</span><span class="p">(</span><span class="s">"copiedtest.txt"</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">O_RDWR</span><span class="o">|</span><span class="n">os</span><span class="o">.</span><span class="n">O_CREATE</span><span class="p">,</span> <span class="m">0666</span><span class="p">)</span>
  <span class="c">//sourceCopied, err := os.Create("copiedtest.txt")</span>
  <span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span><span class="p">{</span>
    <span class="n">log</span><span class="o">.</span><span class="n">Fatal</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
  <span class="p">}</span>
  <span class="k">defer</span> <span class="n">sourceCopied</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span>

  <span class="n">_</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="n">io</span><span class="o">.</span><span class="n">Copy</span><span class="p">(</span><span class="n">sourceCopied</span><span class="p">,</span> <span class="n">source</span><span class="p">)</span>
  <span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span><span class="p">{</span>
    <span class="n">log</span><span class="o">.</span><span class="n">Fatal</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
  <span class="p">}</span>

 
  <span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="s">"Copied!"</span><span class="p">)</span>
<span class="p">}</span>
</code></pre></div></div>]]></content><author><name>Bhishan Bhandari</name><email>bhishan.bhandari@yaypply.com, bbhishan@gmail.com</email></author><category term="Golang" /><category term="Tutorials" /><category term="File-System" /><summary type="html"><![CDATA[One of the most basic task when working on a server is the ability to effectively operate with the files and file system. Like many languages, Golang has convenient methods to work with files. The intentions of this post is to host a minimalist set of examples on working with files using Golang.]]></summary></entry><entry><title type="html">Going serverless with Chalice and AWS lambda</title><link href="https://bhishan.github.io/posts/2018/12/chalice-aws-lambda/" rel="alternate" type="text/html" title="Going serverless with Chalice and AWS lambda" /><published>2018-12-05T00:00:00+00:00</published><updated>2018-12-05T00:00:00+00:00</updated><id>https://bhishan.github.io/posts/2018/12/going-serverless-with-chalice-and-lambda</id><content type="html" xml:base="https://bhishan.github.io/posts/2018/12/chalice-aws-lambda/"><![CDATA[<p>The intentions of this post is to host a simple example of chalice from AWS that allows serverless API creation with the use of AWS lambda. You also get auto-generation of IAM policy making it faster to deploy web applications. Chalice expects to pick the AWS credentials from ~/.aws/config</p>

<h1 id="prerequisites-for-chaliceaws-credentials">Prerequisites for chalice[AWS Credentials]</h1>
<p>If you’ve used AWS API or boto/boto3 for python, you’ve probably already added the credentials in place. Otherwise you could do it as below:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mkdir ~/.aws
touch ~/.aws/config
</code></pre></div></div>

<p>Contents of the config file</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[default]
aws_access_key_id = YOUR_ACCESS_KEY_HERE
aws_secret_access_key = YOUR_SECRET_ACCESS_KEY
region = YOUR_REGION
</code></pre></div></div>

<h1 id="installing-chalice">Installing Chalice</h1>
<p>As a good development practice, we should segregate dependencies between various projects and therefore is advised to use virtual environment or some sort.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ python3 -m venv serverlessenv
$ source serverlessenv/bin/activate

(serverlessenv)$ pip install chalice
</code></pre></div></div>

<h1 id="creating-simple-api-with-chalice">Creating simple API with chalice</h1>
<p>Chalice comes with command line tool. See what commands are available</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>(serverlessenv)$ chalice

Usage: chalice [OPTIONS] COMMAND [ARGS]...

Options:
--version Show the version and exit.
--project-dir TEXT The project directory. Defaults to CWD
--debug / --no-debug Print debug logs to stderr.
--help Show this message and exit.

Commands:
delete
deploy
gen-policy
generate-pipeline Generate a cloudformation template for a...
generate-sdk
invoke Invoke the deployed lambda function NAME.
local
logs
new-project
package
url

(serverlessenv)$ chalice new-project

___ _ _ _ _ ___ ___ ___
/ __|| || | /_\ | | |_ _|/ __|| __|
| (__ | __ | / _ \ | |__ | || (__ | _|
\___||_||_|/_/ \_\|____||___|\___||___|

The python serverless microframework for AWS allows
you to quickly create and deploy applications using
Amazon API Gateway and AWS Lambda.

Please enter the project name: basichelloworld

(serverlessenv)$ cd basichelloworld/

(serverlessenv)~/basichelloworld$ ls -a

app.py .chalice .gitignore requirements.txt
</code></pre></div></div>

<p>Chalice is very simple, somewhat similar to Flask if you come from there.</p>

<h1 id="auto-generated-apppy">Auto-generated app.py</h1>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">chalice</span> <span class="kn">import</span> <span class="n">Chalice</span>

<span class="n">app</span> <span class="o">=</span> <span class="n">Chalice</span><span class="p">(</span><span class="n">app_name</span><span class="o">=</span><span class="s">'basichelloworld'</span><span class="p">)</span>


<span class="o">@</span><span class="n">app</span><span class="p">.</span><span class="n">route</span><span class="p">(</span><span class="s">'/'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">index</span><span class="p">():</span>
    <span class="k">return</span> <span class="p">{</span><span class="s">'hello'</span><span class="p">:</span> <span class="s">'world'</span><span class="p">}</span>


<span class="c1"># The view function above will return {"hello": "world"}
# whenever you make an HTTP GET request to '/'.
#
# Here are a few more examples:
#
# @app.route('/hello/{name}')
# def hello_name(name):
#    # '/hello/james' -&gt; {"hello": "james"}
#    return {'hello': name}
#
# @app.route('/users', methods=['POST'])
# def create_user():
#     # This is the JSON body the user sent in their POST request.
#     user_as_json = app.current_request.json_body
#     # We'll echo the json body back to the user in a 'user' key.
#     return {'user': user_as_json}
#
# See the README documentation for more examples.
#
</span></code></pre></div></div>

<h1 id="running-the-api-locally">Running the API locally</h1>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>(serverlessenv)~/basichelloworld$ chalice local
Serving on 127.0.0.1:8000

(serverlessenv)~/basichelloworld$ curl -X GET http://127.0.0.1:8000
{"hello": "world"}
</code></pre></div></div>

<h1 id="going-serverless-with-chalice-through-aws-lambda">Going serverless with chalice through AWS lambda</h1>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>(serverlessenv)~/basichelloworld$ chalice deploy
Creating deployment package.
Updating policy for IAM role: basichelloworld
Creating lambda function: basichelloworld
Creating Rest API
Resources deployed:
- Lambda ARN: arn:aws:lambda:us-east-1:9582857991:function:basichelloworld
- Rest API URL: https://fxcdyzuitc.execute-api.us-east-1.amazonaws.com/api/

(serverlessenv)~/basichelloworld$ curl -X GET https://fxcdyzuitc.execute-api.us-east-1.amazonaws.com/api/
{"hello": "world"}
</code></pre></div></div>]]></content><author><name>Bhishan Bhandari</name><email>bhishan.bhandari@yaypply.com, bbhishan@gmail.com</email></author><category term="Python" /><category term="Tutorials" /><summary type="html"><![CDATA[The intentions of this post is to host a simple example of chalice from AWS that allows serverless API creation with the use of AWS lambda. You also get auto-generation of IAM policy making it faster to deploy web applications. Chalice expects to pick the AWS credentials from ~/.aws/config]]></summary></entry><entry><title type="html">Top 10 Most Subscribed Youtube Channel Visualization[2013-2018]</title><link href="https://bhishan.github.io/posts/2018/11/youtube-channel-visualization/" rel="alternate" type="text/html" title="Top 10 Most Subscribed Youtube Channel Visualization[2013-2018]" /><published>2018-11-24T00:00:00+00:00</published><updated>2018-11-24T00:00:00+00:00</updated><id>https://bhishan.github.io/posts/2018/11/top-10-most-subscribed-youtube-channel-visualization2013-2018</id><content type="html" xml:base="https://bhishan.github.io/posts/2018/11/youtube-channel-visualization/"><![CDATA[<p>Motion Visualization is intriguing and explains a lot in itself. I have put together an example visualization of the Top 10 Youtubers(by subscribers) from November 2013 to November 2018.
I am not very informed of whether or not flash based visualizations are still relevant, but I found Google Motion Chart to have explained very well the data set I’ve taken into consideration. As always the codes remain public so people can take ideas from it and produce an even better visualizations for themselves.</p>

<p>It is especially interesting to produce a motion chart for data points where entities have varying rates of growth overtime. I had difficulties being able to view the visualizations on some versions of chrome although I had flash installed. Make sure you have installed adobe flash in-order to view the visualizations. Here is a link to the visualization.</p>

<p>I’ve also prepared a video from the visualization for the ones having trouble viewing the viz. You should watch it anyways, it’s fun.</p>

<p>https://youtu.be/vMeKjwV15K8</p>

<p>The code below contains only a few portion of the dataset to make it much readable.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>html
&lt;!doctype html&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;script type="text/javascript" src="https://www.google.com/jsapi"&gt;&lt;/script&gt;
    
    &lt;script type="text/javascript"&gt;
        google.load("visualization", "1", {packages:["motionchart"]});
        google.setOnLoadCallback(drawChart);


        function drawChart() {
            var data = new google.visualization.DataTable();

            data.addColumn('string', 'Organization');
            data.addColumn('date', 'Date');
            data.addColumn('number', 'Subscribers');
            loadYoutubeData(data);

        }


        function loadYoutubeData(data) {
            data.addRows([
                ['PewDiePie',  new Date (2013, 11, 1), 14881729],
                //['PewDiePie', new Date (2018, 11, 1), 71145119],
                ['Smosh', new Date (2013, 11, 1), 13014827],
                ['HolaSoyGerman', new Date(2013, 11, 1), 12063901],
                ['JennaMarbles', new Date(2013, 11, 1), 10961919],
                ['RihannaVEVO', new Date(2013, 11, 1), 10617173],
                ['nigahiga', new Date(2013, 11, 1), 10504418],
                ['RayWilliamJohnson', new Date(2013, 11, 1), 10344107],
                ['Machinima', new Date(2013, 11, 1), 9771825],
                ['OneDirectionVEVO', new Date(2013, 11, 1), 9029788],
                ['ERB', new Date(2013, 11, 1), 7691601],

                ['PewDiePie', new Date(2015, 1, 1), 34062473],
                ['HolaSoyGerman', new Date(2015, 1, 1), 21010264],
                ['Smosh', new Date(2015, 1, 1), 19663985],
                ['RihannaVEVO', new Date(2015, 1, 1), 15295585],
                ['OneDirectionVEVO', new Date(2015, 1, 1), 15174217],
                ['KatyPerryVEVO', new Date(2015, 1, 1), 14845896],
                ['JennaMarbles', new Date(2015, 1, 1), 14617456],
                ['EminemVEVO', new Date(2015, 1, 1), 14492570],
                ['nigahiga', new Date(2015, 1, 1), 13661249],
                ['Machinima', new Date(2015, 1, 1), 12248125],


                ['PewDiePie', new Date(2017, 8, 1), 57232583],
                ['HolaSoyGerman', new Date(2017, 8, 1), 32338930],
                ['JustinBieberVEVO', new Date(2017, 8, 1), 31353721],
                ['elrubiusOMG', new Date(2017, 8, 1), 25620604],
                ['RihannaVEVO', new Date(2017, 8, 1), 25463556],
                ['KatyPerryVEVO', new Date(2017, 8, 1), 24574565],
                ['TaylorSwiftVEVO', new Date(2017, 8, 1), 24328186],
                ['T-Series', new Date(2017, 8, 1), 24324185],
                ['Fernanfloo', new Date(2017, 8, 1), 23691057],
                ['EminemVEVO', new Date(2017, 8, 1), 23211015],
                
                ['PewDiePie', new Date(2018, 11, 1), 71267456],
                ['T-Series', new Date(2018, 11, 1), 71125778],
                ['Canal KondZilla', new Date(2018, 11, 1), 43081613],
                ['Justin Bieber', new Date(2018, 11, 1), 43073669],
                ['5-Minute Crafts', new Date(2018, 11, 1), 41455546],
                ['WWE', new Date(2018, 11, 1), 36799586],
                ['Dude Perfect', new Date(2018, 11, 1), 36688630],
                ['SET India', new Date(2018, 11, 1), 36046873],
                ['Ed Sheeran', new Date(2018, 11, 1), 35539034],
                ['HolaSoyGerman', new Date(2018, 11, 1), 34264571],

            ]);
            var chart = new google.visualization.MotionChart(document.getElementById('chart_div'));

            chart.draw(data, {width: 1200, height:600});

        }
    &lt;/script&gt;

&lt;/head&gt;
&lt;body&gt;
&lt;div id="chart_div" style="width: 100%; height: 100%;"&gt;&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre></div></div>]]></content><author><name>Bhishan Bhandari</name><email>bhishan.bhandari@yaypply.com, bbhishan@gmail.com</email></author><category term="-JavaScript" /><category term="-Tutorials" /><category term="-Web" /><summary type="html"><![CDATA[Motion Visualization is intriguing and explains a lot in itself. I have put together an example visualization of the Top 10 Youtubers(by subscribers) from November 2013 to November 2018. I am not very informed of whether or not flash based visualizations are still relevant, but I found Google Motion Chart to have explained very well the data set I’ve taken into consideration. As always the codes remain public so people can take ideas from it and produce an even better visualizations for themselves.]]></summary></entry><entry><title type="html">Python, Boto and AWS EC2</title><link href="https://bhishan.github.io/posts/2018/09/aws-ec2-boto/" rel="alternate" type="text/html" title="Python, Boto and AWS EC2" /><published>2018-09-16T00:00:00+00:00</published><updated>2018-09-16T00:00:00+00:00</updated><id>https://bhishan.github.io/posts/2018/09/python-boto-and-aws-ec2</id><content type="html" xml:base="https://bhishan.github.io/posts/2018/09/aws-ec2-boto/"><![CDATA[<p>Most if not all software companies have adopted to cloud infrastructure and services. AWS in particular is very popular amongst all. The intentions of this post is to host a few examples on using boto to make use of one of the services available on AWS i.e EC2. It is more likely than not to have need of a mechanism to programatically fire up a few instances, shut them down, filter instances and send remote commands to it to say the least.</p>

<h2 id="filter-instances-based-on-tag-names-from-the-aws-inventory">Filter instances based on tag names from the AWS inventory</h2>

<p>EC2 instances on AWS can have as many tag names key: value as required for purposes like identifying an instance or a set of instances. Also when the instance you are working on quite frequently needs to shut down and boot over again and you haven’t implemented elastic IP, you are bound to changes in the public IP address. Although you could argue to use private IP to filter an instance, it isn’t very effective when you have a lot of instances(&gt;100).</p>

<h3 id="boto2">Boto2</h3>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">boto.ec2</span>

<span class="n">conn</span> <span class="o">=</span> <span class="n">boto</span><span class="p">.</span><span class="n">ec2</span><span class="p">.</span><span class="n">connect_to_region</span><span class="p">(</span><span class="s">'us-east-1'</span><span class="p">,</span> <span class="n">aws_access_key_id</span><span class="o">=</span><span class="s">'aws_access_id'</span><span class="p">,</span> <span class="n">aws_secret_access_key</span><span class="o">=</span><span class="s">'aws_secret'</span><span class="p">)</span>
<span class="n">reservations</span> <span class="o">=</span> <span class="n">conn</span><span class="p">.</span><span class="n">get_all_instances</span><span class="p">(</span><span class="n">filters</span><span class="o">=</span><span class="p">{</span><span class="s">'tagName'</span> <span class="p">:</span> <span class="s">'value'</span><span class="p">})</span>
<span class="n">public_ips</span> <span class="o">=</span> <span class="p">[</span><span class="n">each_instance</span><span class="p">.</span><span class="n">ip_address</span> <span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="n">reservations</span> <span class="k">for</span> <span class="n">each_instance</span> <span class="ow">in</span> <span class="n">r</span><span class="p">.</span><span class="n">instances</span><span class="p">]</span>
<span class="c1"># each_instance.private_ip_address  to get the private ip address of the instance
</span></code></pre></div></div>

<h3 id="boto3">Boto3</h3>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">boto3</span>
<span class="n">session</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="n">session</span><span class="p">.</span><span class="n">Session</span><span class="p">(</span><span class="n">aws_access_key_id</span><span class="o">=</span><span class="n">aws_access_id</span><span class="p">,</span>
                                <span class="n">aws_secret_access_key</span><span class="o">=</span><span class="n">aws_secret</span><span class="p">,</span>
                                <span class="n">region_name</span><span class="o">=</span><span class="s">'us-east-1'</span><span class="p">)</span>
 
<span class="n">ec2</span> <span class="o">=</span> <span class="n">session</span><span class="p">.</span><span class="n">resource</span><span class="p">(</span><span class="s">'ec2'</span><span class="p">)</span>
<span class="n">instances</span> <span class="o">=</span> <span class="n">ec2</span><span class="p">.</span><span class="n">instances</span><span class="p">.</span><span class="nb">filter</span><span class="p">(</span>
    <span class="n">Filters</span><span class="o">=</span><span class="p">[{</span><span class="s">'Name'</span><span class="p">:</span><span class="s">'tag:purpose'</span><span class="p">,</span> <span class="s">'Values'</span><span class="p">:[</span><span class="s">'intelligence'</span><span class="p">]}</span>
<span class="p">])</span>
<span class="n">public_ips</span> <span class="o">=</span> <span class="p">[</span><span class="n">each_instance</span><span class="p">.</span><span class="n">public_ip_address</span> <span class="k">for</span> <span class="n">each_instance</span> <span class="ow">in</span> <span class="n">instances</span><span class="p">]</span>
<span class="c1"># each_instance.private_ip_address to get the private ip address of the instance
</span></code></pre></div></div>

<h2 id="bootshutdown-an-instanceinstances-from-the-aws-inventory">Boot/Shutdown an instance/instances from the AWS inventory</h2>

<p>Using boto, you can boot/shutdown/terminate instances.</p>

<h3 id="boto2-1">Boto2</h3>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">start_stop_terminate_instance</span><span class="p">(</span><span class="n">instance_ids</span><span class="p">,</span> <span class="n">conn</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s">'start'</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">action</span> <span class="o">==</span> <span class="s">'start'</span><span class="p">:</span>
        <span class="n">conn</span><span class="p">.</span><span class="n">start_instances</span><span class="p">(</span><span class="n">instance_ids</span><span class="o">=</span><span class="n">instance_ids</span><span class="p">)</span>
    <span class="k">elif</span> <span class="n">action</span> <span class="o">==</span> <span class="s">'stop'</span><span class="p">:</span>
        <span class="n">conn</span><span class="p">.</span><span class="n">stop_instances</span><span class="p">(</span><span class="n">instance_ids</span><span class="o">=</span><span class="n">instance_ids</span><span class="p">)</span>
    <span class="k">elif</span> <span class="n">action</span> <span class="o">==</span> <span class="s">'terminate'</span><span class="p">:</span>
        <span class="n">conn</span><span class="p">.</span><span class="n">terminate_instances</span><span class="p">(</span><span class="n">instance_ids</span><span class="o">=</span><span class="n">ids</span><span class="p">)</span>
</code></pre></div></div>

<h3 id="boto3-1">Boto3</h3>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">start_stop_terminate_instance</span><span class="p">(</span><span class="n">instance_ids</span><span class="p">,</span> <span class="n">conn</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s">'start'</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">action</span> <span class="o">==</span> <span class="s">'start'</span><span class="p">:</span>
        <span class="n">conn</span><span class="p">.</span><span class="n">instances</span><span class="p">.</span><span class="nb">filter</span><span class="p">(</span><span class="n">InstanceIds</span><span class="o">=</span><span class="n">instance_ids</span><span class="p">).</span><span class="n">start</span><span class="p">()</span>
    <span class="k">elif</span> <span class="n">action</span> <span class="o">==</span> <span class="s">'stop'</span><span class="p">:</span>
        <span class="n">conn</span><span class="p">.</span><span class="n">instances</span><span class="p">.</span><span class="nb">filter</span><span class="p">(</span><span class="n">InstanceIds</span><span class="o">=</span><span class="n">instance_ids</span><span class="p">).</span><span class="n">stop</span><span class="p">()</span>
    <span class="k">elif</span> <span class="n">action</span> <span class="o">==</span> <span class="s">'terminate'</span><span class="p">:</span>
        <span class="n">conn</span><span class="p">.</span><span class="n">instances</span><span class="p">.</span><span class="nb">filter</span><span class="p">(</span><span class="n">InstanceIds</span><span class="o">=</span><span class="n">instance_ids</span><span class="p">).</span><span class="n">terminate</span><span class="p">()</span>
</code></pre></div></div>

<h2 id="create-instances-based-on-various-metrics">Create Instances based on various metrics</h2>

<p>Boto makes use of the AWS APIs that also allows creating instances. An EC2 instance can have various properties. The most common is the type of the instance. Types are generally a grouping of instances based on metrics such as power, performance, bandwidth. Commonly used types for general purpose are t2, m4, m3. C5, c4, c3 are compute optimized instances. For a process/application more leaned towards in-memory activities, you’d use x1, r4, r3. There are other types too but the above mentioned are quite common in use. The other properties of an instance are instance id, the memory size (micro, nano, small, large, xlarge, 2xlarge, 4xlarge, 8xlarge, 10xlarge.), the key pair to make a secured connection to the instance, tag names, display names, security groups, attached storage id, etc. Using boto we can create an instance or multiple instances based on the above mentioned parameters.</p>

<h3 id="boto2-2">Boto2</h3>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">boto.ec2</span>
<span class="n">conn</span> <span class="o">=</span> <span class="n">boto</span><span class="p">.</span><span class="n">ec2</span><span class="p">.</span><span class="n">connect_to_region</span><span class="p">(</span><span class="s">'us-east-1'</span><span class="p">,</span> <span class="n">aws_access_key_id</span><span class="o">=</span><span class="s">'aws_access_id'</span><span class="p">,</span> <span class="n">aws_secret_access_key</span><span class="o">=</span><span class="s">'aws_secret'</span><span class="p">)</span>
<span class="n">conn</span><span class="p">.</span><span class="n">run_instances</span><span class="p">(</span>
    <span class="s">'ami-ag139jf'</span><span class="p">,</span>
    <span class="n">min_count</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> 
    <span class="n">max_count</span><span class="o">=</span><span class="mi">100</span><span class="p">,</span>
    <span class="n">key_name</span><span class="o">=</span><span class="s">'myKey'</span><span class="p">,</span>
    <span class="n">instance_type</span><span class="o">=</span><span class="s">'t2.small'</span><span class="p">,</span>
    <span class="n">security_groups</span><span class="o">=</span><span class="p">[</span><span class="s">'sg-4512'</span><span class="p">]</span>
<span class="p">)</span>
</code></pre></div></div>

<h3 id="boto3-2">Boto3</h3>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">boto3</span>
<span class="n">session</span> <span class="o">=</span> <span class="n">boto3</span><span class="p">.</span><span class="n">session</span><span class="p">.</span><span class="n">Session</span><span class="p">(</span><span class="n">aws_access_key_id</span><span class="o">=</span><span class="s">'aws_access_id'</span><span class="p">,</span>
                                <span class="n">aws_secret_access_key</span><span class="o">=</span><span class="s">'aws_secret'</span><span class="p">,</span>
                                <span class="n">region_name</span><span class="o">=</span><span class="s">'us-east-1'</span><span class="p">)</span>
 
<span class="n">ec2</span> <span class="o">=</span> <span class="n">session</span><span class="p">.</span><span class="n">resource</span><span class="p">(</span><span class="s">'ec2'</span><span class="p">)</span>
<span class="n">ec2</span><span class="p">.</span><span class="n">create_instances</span><span class="p">(</span>
    <span class="n">ImageId</span><span class="o">=</span><span class="s">'ami-ag139jf'</span><span class="p">,</span> 
    <span class="n">MinCount</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> 
    <span class="n">MaxCount</span><span class="o">=</span><span class="mi">100</span><span class="p">,</span> 
    <span class="n">InstanceType</span><span class="o">=</span><span class="s">'t2.small'</span><span class="p">,</span>
    <span class="n">KeyName</span><span class="o">=</span><span class="s">'myKey'</span><span class="p">,</span>
    <span class="n">SecurityGroups</span><span class="o">=</span><span class="p">[</span><span class="s">'sg-4512'</span><span class="p">]</span>
<span class="p">)</span>
</code></pre></div></div>

<h2 id="send-remote-commands-to-an-ec2-instance">Send remote commands to an EC2 instance</h2>

<p>Paramiko can be used for connecting to a remote instance and sending commands to be executed and get the standard output/error to act accordingly.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">paramiko</span>

<span class="n">key</span> <span class="o">=</span> <span class="n">paramiko</span><span class="p">.</span><span class="n">RSAKey</span><span class="p">.</span><span class="n">from_private_key_file</span><span class="p">(</span><span class="n">path_to_pem_file</span><span class="p">)</span>
<span class="n">client</span> <span class="o">=</span> <span class="n">paramiko</span><span class="p">.</span><span class="n">SSHClient</span><span class="p">()</span>
<span class="n">client</span><span class="p">.</span><span class="n">set_missing_host_key_policy</span><span class="p">(</span><span class="n">paramiko</span><span class="p">.</span><span class="n">AutoAddPolicy</span><span class="p">())</span>

<span class="c1"># Connect to the instance
</span><span class="k">try</span><span class="p">:</span>
    <span class="c1"># using username, public ip address and the pem file, create connection to the instance
</span>    <span class="n">client</span><span class="p">.</span><span class="n">connect</span><span class="p">(</span><span class="n">hostname</span><span class="o">=</span><span class="n">instance_ip</span><span class="p">,</span> <span class="n">username</span><span class="o">=</span><span class="s">"ubuntu"</span><span class="p">,</span> <span class="n">pkey</span><span class="o">=</span><span class="n">key</span><span class="p">)</span>

    <span class="c1"># Execute command remotely.
</span>    <span class="n">stdin</span><span class="p">,</span> <span class="n">stdout</span><span class="p">,</span> <span class="n">stderr</span> <span class="o">=</span> <span class="n">client</span><span class="p">.</span><span class="n">exec_command</span><span class="p">(</span><span class="s">"ls -l"</span><span class="p">)</span>
    <span class="k">print</span> <span class="n">stdout</span><span class="p">.</span><span class="n">read</span><span class="p">()</span>
    <span class="n">client</span><span class="p">.</span><span class="n">close</span><span class="p">()</span>

<span class="k">except</span> <span class="nb">Exception</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span>
    <span class="k">print</span> <span class="n">e</span>
</code></pre></div></div>]]></content><author><name>Bhishan Bhandari</name><email>bhishan.bhandari@yaypply.com, bbhishan@gmail.com</email></author><category term="AWS" /><category term="Python" /><category term="EC2" /><category term="Boto" /><summary type="html"><![CDATA[Most if not all software companies have adopted to cloud infrastructure and services. AWS in particular is very popular amongst all. The intentions of this post is to host a few examples on using boto to make use of one of the services available on AWS i.e EC2. It is more likely than not to have need of a mechanism to programatically fire up a few instances, shut them down, filter instances and send remote commands to it to say the least.]]></summary></entry><entry><title type="html">Web Scraping with Golang and Goquery</title><link href="https://bhishan.github.io/posts/2018/09/golang-web-scraping/" rel="alternate" type="text/html" title="Web Scraping with Golang and Goquery" /><published>2018-09-13T00:00:00+00:00</published><updated>2018-09-13T00:00:00+00:00</updated><id>https://bhishan.github.io/posts/2018/09/web-scraping-using-golang</id><content type="html" xml:base="https://bhishan.github.io/posts/2018/09/golang-web-scraping/"><![CDATA[<p>Web Scraping can be beneficial to individuals and companies. The intentions of this post is to host a set of examples on Web Scraping using Golang and goquery. I will be using github’s trending page https://github.com/trending throughout this post for the examples, especially because it best suits for applying various goquery methods. There are two other versions of this article which replicates the same set of examples in Python and NodeJS.</p>

<h2 id="installation">Installation</h2>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>go get github.com/PuerkitoBio/goquery
</code></pre></div></div>

<h2 id="get-html-of-a-page">Get html of a page</h2>

<div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">package</span> <span class="n">main</span>
<span class="k">import</span> <span class="p">(</span>
    <span class="s">"log"</span>
    <span class="s">"io"</span>
    <span class="s">"os"</span>
    <span class="s">"net/http"</span>
<span class="p">)</span>

<span class="k">func</span> <span class="n">ScrapeHTML</span><span class="p">(){</span>
    <span class="n">resp</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">http</span><span class="o">.</span><span class="n">Get</span><span class="p">(</span><span class="s">"https://github.com/trending"</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span><span class="p">{</span>
        <span class="n">log</span><span class="o">.</span><span class="n">Fatal</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
    <span class="p">}</span>
    <span class="k">defer</span> <span class="n">resp</span><span class="o">.</span><span class="n">Body</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span>

    <span class="k">if</span> <span class="n">resp</span><span class="o">.</span><span class="n">StatusCode</span> <span class="o">!=</span> <span class="m">200</span><span class="p">{</span>
        <span class="n">log</span><span class="o">.</span><span class="n">Fatalf</span><span class="p">(</span><span class="s">"status code error: %d %s"</span><span class="p">,</span> <span class="n">resp</span><span class="o">.</span><span class="n">StatusCode</span><span class="p">,</span> <span class="n">resp</span><span class="o">.</span><span class="n">Status</span><span class="p">)</span>
    <span class="p">}</span>
    <span class="n">io</span><span class="o">.</span><span class="n">Copy</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">Stdout</span><span class="p">,</span> <span class="n">resp</span><span class="o">.</span><span class="n">Body</span><span class="p">)</span>    
<span class="p">}</span>

<span class="k">func</span> <span class="n">main</span><span class="p">(){</span>
    <span class="n">ScrapeHTML</span><span class="p">()</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="using-goquerygolang-library-to-get-title-from-a-page">Using goquery(golang library) to get title from a page</h2>

<div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">package</span> <span class="n">main</span>
<span class="k">import</span> <span class="p">(</span>
    <span class="s">"fmt"</span>
    <span class="s">"log"</span>
    <span class="s">"net/http"</span>
    <span class="s">"github.com/PuerkitoBio/goquery"</span>
<span class="p">)</span>

<span class="k">func</span> <span class="n">ScrapeHTML</span><span class="p">(){</span>
    <span class="n">resp</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">http</span><span class="o">.</span><span class="n">Get</span><span class="p">(</span><span class="s">"https://github.com/trending"</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span><span class="p">{</span>
        <span class="n">log</span><span class="o">.</span><span class="n">Fatal</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
    <span class="p">}</span>
    <span class="k">defer</span> <span class="n">resp</span><span class="o">.</span><span class="n">Body</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span>

    <span class="k">if</span> <span class="n">resp</span><span class="o">.</span><span class="n">StatusCode</span> <span class="o">!=</span> <span class="m">200</span><span class="p">{</span>
        <span class="n">log</span><span class="o">.</span><span class="n">Fatalf</span><span class="p">(</span><span class="s">"status code error: %d %s"</span><span class="p">,</span> <span class="n">resp</span><span class="o">.</span><span class="n">StatusCode</span><span class="p">,</span> <span class="n">resp</span><span class="o">.</span><span class="n">Status</span><span class="p">)</span>
    <span class="p">}</span>

    <span class="n">doc</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">goquery</span><span class="o">.</span><span class="n">NewDocumentFromReader</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">Body</span><span class="p">)</span>
  <span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
        <span class="n">log</span><span class="o">.</span><span class="n">Fatal</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
    <span class="p">}</span>
    <span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="n">doc</span><span class="o">.</span><span class="n">Find</span><span class="p">(</span><span class="s">"title"</span><span class="p">)</span><span class="o">.</span><span class="n">Text</span><span class="p">())</span>
   
<span class="p">}</span>

<span class="k">func</span> <span class="n">main</span><span class="p">(){</span>
    <span class="n">ScrapeHTML</span><span class="p">()</span>
<span class="p">}</span>
</code></pre></div></div>

<p><strong>Output</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ go run example.go
Trending repositories on GitHub today · GitHub
</code></pre></div></div>

<h2 id="using-goquery-find-single-element-by-tag-name-find-multiple-elements-by-tag-name">Using goquery, Find single element by tag name, find multiple elements by tag name</h2>

<div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">package</span> <span class="n">main</span>
<span class="k">import</span> <span class="p">(</span>
    <span class="s">"fmt"</span>
    <span class="s">"log"</span>
    <span class="s">"strings"</span>
    <span class="s">"net/http"</span>
    <span class="s">"github.com/PuerkitoBio/goquery"</span>
<span class="p">)</span>


<span class="k">func</span> <span class="n">scrapeUsingTagNames</span><span class="p">(){</span>
    <span class="n">resp</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">http</span><span class="o">.</span><span class="n">Get</span><span class="p">(</span><span class="s">"https://github.com/trending"</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span><span class="p">{</span>
        <span class="n">log</span><span class="o">.</span><span class="n">Fatal</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
    <span class="p">}</span>
    <span class="k">defer</span> <span class="n">resp</span><span class="o">.</span><span class="n">Body</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span>

    <span class="k">if</span> <span class="n">resp</span><span class="o">.</span><span class="n">StatusCode</span> <span class="o">!=</span> <span class="m">200</span><span class="p">{</span>
        <span class="n">log</span><span class="o">.</span><span class="n">Fatalf</span><span class="p">(</span><span class="s">"Status code error: %d %s"</span><span class="p">,</span> <span class="n">resp</span><span class="o">.</span><span class="n">StatusCode</span><span class="p">,</span> <span class="n">resp</span><span class="o">.</span><span class="n">Status</span><span class="p">)</span>
    <span class="p">}</span>
    <span class="n">doc</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">goquery</span><span class="o">.</span><span class="n">NewDocumentFromReader</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">Body</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span><span class="p">{</span>
        <span class="n">log</span><span class="o">.</span><span class="n">Fatal</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
    <span class="p">}</span>
    <span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="n">doc</span><span class="o">.</span><span class="n">Find</span><span class="p">(</span><span class="s">"title"</span><span class="p">)</span><span class="o">.</span><span class="n">Text</span><span class="p">())</span>

    <span class="n">doc</span><span class="o">.</span><span class="n">Find</span><span class="p">(</span><span class="s">"ol li"</span><span class="p">)</span><span class="o">.</span><span class="n">Each</span><span class="p">(</span><span class="k">func</span><span class="p">(</span><span class="n">i</span> <span class="kt">int</span><span class="p">,</span> <span class="n">s</span> <span class="o">*</span><span class="n">goquery</span><span class="o">.</span><span class="n">Selection</span><span class="p">){</span>
        <span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="n">strings</span><span class="o">.</span><span class="n">TrimSpace</span><span class="p">(</span><span class="n">s</span><span class="o">.</span><span class="n">Find</span><span class="p">(</span><span class="s">"h3"</span><span class="p">)</span><span class="o">.</span><span class="n">Text</span><span class="p">()))</span>
    <span class="p">})</span>
<span class="p">}</span>

<span class="k">func</span> <span class="n">main</span><span class="p">(){</span>
    <span class="n">scrapeUsingTagNames</span><span class="p">()</span>
<span class="p">}</span>
</code></pre></div></div>

<p><strong>Output</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ go run example.go
Trending repositories on GitHub today · GitHubAsset 1Asset 1
you-dont-need / You-Dont-Need-Momentjs
ripienaar / free-for-dev
Nozbe / WatermelonDB
cjbarber / ToolsOfTheTrade
byoungd / English-level-up-tips-for-Chinese
TheAlgorithms / Python
thedaviddias / Front-End-Checklist
zziz / pwc
dawnlabs / carbon
CyC2018 / CS-Notes
Avik-Jain / 100-Days-Of-ML-Code
donnemartin / system-design-primer
mariusandra / pigeon-maps
Snailclimb / JavaGuide
JavaNoober / BackgroundLibrary
crossoverJie / JCSprout
Microsoft / nni
PansonPanson / Java-Notes
date-fns / date-fns
sindresorhus / ky
mciastek / sal
rwv / chinese-dos-games
vuejs / vue
GoogleCloudPlatform / open-match
lin-xin / vue-manage-system
</code></pre></div></div>

<h2 id="getting-attributes-of-an-element">Getting Attributes of an element</h2>

<div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">package</span> <span class="n">main</span>
<span class="k">import</span> <span class="p">(</span>
    <span class="s">"fmt"</span>
    <span class="s">"log"</span>
    <span class="s">"net/http"</span>
    <span class="s">"github.com/PuerkitoBio/goquery"</span>
<span class="p">)</span>

<span class="k">func</span> <span class="n">scrapeAttributes</span><span class="p">(){</span>
    <span class="n">resp</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">http</span><span class="o">.</span><span class="n">Get</span><span class="p">(</span><span class="s">"https://github.com/trending"</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span><span class="p">{</span>
        <span class="n">log</span><span class="o">.</span><span class="n">Fatal</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
    <span class="p">}</span>
    <span class="k">defer</span> <span class="n">resp</span><span class="o">.</span><span class="n">Body</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span>

    <span class="k">if</span> <span class="n">resp</span><span class="o">.</span><span class="n">StatusCode</span> <span class="o">!=</span> <span class="m">200</span><span class="p">{</span>
        <span class="n">log</span><span class="o">.</span><span class="n">Fatalf</span><span class="p">(</span><span class="s">"Status code error: %d %s"</span><span class="p">,</span> <span class="n">resp</span><span class="o">.</span><span class="n">StatusCode</span><span class="p">,</span> <span class="n">resp</span><span class="o">.</span><span class="n">Status</span><span class="p">)</span>
    <span class="p">}</span>
    <span class="n">doc</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">goquery</span><span class="o">.</span><span class="n">NewDocumentFromReader</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">Body</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span><span class="p">{</span>
        <span class="n">log</span><span class="o">.</span><span class="n">Fatal</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
    <span class="p">}</span>
    <span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="n">doc</span><span class="o">.</span><span class="n">Find</span><span class="p">(</span><span class="s">"title"</span><span class="p">)</span><span class="o">.</span><span class="n">Text</span><span class="p">())</span>

    <span class="n">doc</span><span class="o">.</span><span class="n">Find</span><span class="p">(</span><span class="s">"ol li"</span><span class="p">)</span><span class="o">.</span><span class="n">Each</span><span class="p">(</span><span class="k">func</span><span class="p">(</span><span class="n">i</span> <span class="kt">int</span><span class="p">,</span> <span class="n">s</span> <span class="o">*</span><span class="n">goquery</span><span class="o">.</span><span class="n">Selection</span><span class="p">){</span>
        <span class="n">href</span><span class="p">,</span> <span class="n">has_attr</span> <span class="o">:=</span> <span class="n">s</span><span class="o">.</span><span class="n">Find</span><span class="p">(</span><span class="s">"a"</span><span class="p">)</span><span class="o">.</span><span class="n">First</span><span class="p">()</span><span class="o">.</span><span class="n">Attr</span><span class="p">(</span><span class="s">"href"</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">has_attr</span><span class="p">{</span>
            <span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="s">"https://github.com"</span> <span class="o">+</span> <span class="n">href</span><span class="p">)</span>
        <span class="p">}</span>

    <span class="p">})</span>
<span class="p">}</span>

<span class="k">func</span> <span class="n">main</span><span class="p">(){</span>
    <span class="n">scrapeAttribtutes</span><span class="p">()</span>
<span class="p">}</span>
</code></pre></div></div>

<p><strong>Output</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ go run example.go
Trending repositories on GitHub today · GitHubAsset 1Asset 1
https://github.com/you-dont-need/You-Dont-Need-Momentjs
https://github.com/ripienaar/free-for-dev
https://github.com/Nozbe/WatermelonDB
https://github.com/cjbarber/ToolsOfTheTrade
https://github.com/byoungd/English-level-up-tips-for-Chinese
https://github.com/TheAlgorithms/Python
https://github.com/thedaviddias/Front-End-Checklist
https://github.com/zziz/pwc
https://github.com/dawnlabs/carbon
https://github.com/CyC2018/CS-Notes
https://github.com/Avik-Jain/100-Days-Of-ML-Code
https://github.com/donnemartin/system-design-primer
https://github.com/mariusandra/pigeon-maps
https://github.com/Snailclimb/JavaGuide
https://github.com/JavaNoober/BackgroundLibrary
https://github.com/crossoverJie/JCSprout
https://github.com/Microsoft/nni
https://github.com/PansonPanson/Java-Notes
https://github.com/date-fns/date-fns
https://github.com/sindresorhus/ky
https://github.com/mciastek/sal
https://github.com/rwv/chinese-dos-games
https://github.com/vuejs/vue
https://github.com/GoogleCloudPlatform/open-match
https://github.com/lin-xin/vue-manage-system
</code></pre></div></div>

<h2 id="using-class-name-or-other-attributes-to-get-element">Using class name or other attributes to get element</h2>

<div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">package</span> <span class="n">main</span>
<span class="k">import</span> <span class="p">(</span>
    <span class="s">"fmt"</span>
    <span class="s">"log"</span>
    <span class="s">"strings"</span>
    <span class="s">"net/http"</span>
    <span class="s">"github.com/PuerkitoBio/goquery"</span>
<span class="p">)</span>
<span class="k">func</span> <span class="n">scrapeViaClassName</span><span class="p">(){</span>
    <span class="n">resp</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">http</span><span class="o">.</span><span class="n">Get</span><span class="p">(</span><span class="s">"https://github.com/trending"</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span><span class="p">{</span>
        <span class="n">log</span><span class="o">.</span><span class="n">Fatal</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
    <span class="p">}</span>
    <span class="k">defer</span> <span class="n">resp</span><span class="o">.</span><span class="n">Body</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span>

    <span class="k">if</span> <span class="n">resp</span><span class="o">.</span><span class="n">StatusCode</span> <span class="o">!=</span> <span class="m">200</span><span class="p">{</span>
        <span class="n">log</span><span class="o">.</span><span class="n">Fatalf</span><span class="p">(</span><span class="s">"Status code error: %d %s"</span><span class="p">,</span> <span class="n">resp</span><span class="o">.</span><span class="n">StatusCode</span><span class="p">,</span> <span class="n">resp</span><span class="o">.</span><span class="n">Status</span><span class="p">)</span>
    <span class="p">}</span>
    <span class="n">doc</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">goquery</span><span class="o">.</span><span class="n">NewDocumentFromReader</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">Body</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span><span class="p">{</span>
        <span class="n">log</span><span class="o">.</span><span class="n">Fatal</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
    <span class="p">}</span>
    <span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="n">doc</span><span class="o">.</span><span class="n">Find</span><span class="p">(</span><span class="s">"title"</span><span class="p">)</span><span class="o">.</span><span class="n">Text</span><span class="p">())</span>

    <span class="n">doc</span><span class="o">.</span><span class="n">Find</span><span class="p">(</span><span class="s">"ol li"</span><span class="p">)</span><span class="o">.</span><span class="n">Each</span><span class="p">(</span><span class="k">func</span><span class="p">(</span><span class="n">i</span> <span class="kt">int</span><span class="p">,</span> <span class="n">s</span> <span class="o">*</span><span class="n">goquery</span><span class="o">.</span><span class="n">Selection</span><span class="p">){</span>
        <span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="n">strings</span><span class="o">.</span><span class="n">TrimSpace</span><span class="p">(</span><span class="n">s</span><span class="o">.</span><span class="n">Find</span><span class="p">(</span><span class="s">".float-sm-right"</span><span class="p">)</span><span class="o">.</span><span class="n">Text</span><span class="p">()))</span>
    <span class="p">})</span>
<span class="p">}</span>


<span class="k">func</span> <span class="n">main</span><span class="p">(){</span>
    <span class="n">scrapeViaClassName</span><span class="p">()</span>
<span class="p">}</span>
</code></pre></div></div>

<p><strong>Output</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ go run example.go
Trending repositories on GitHub today · GitHub
625 stars today
476 stars today
407 stars today
392 stars today
332 stars today
316 stars today
304 stars today
274 stars today
249 stars today
201 stars today
206 stars today
188 stars today
192 stars today
165 stars today
154 stars today
141 stars today
153 stars today
146 stars today
153 stars today
149 stars today
145 stars today
134 stars today
124 stars today
137 stars today
117 stars today
</code></pre></div></div>

<h2 id="navigate-childrens-from-an-element">Navigate childrens from an element</h2>

<div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">package</span> <span class="n">main</span>
<span class="k">import</span> <span class="p">(</span>
    <span class="s">"fmt"</span>
    <span class="s">"log"</span>
    <span class="s">"strings"</span>
    <span class="s">"net/http"</span>
    <span class="s">"github.com/PuerkitoBio/goquery"</span>
<span class="p">)</span>
<span class="k">func</span> <span class="n">navigateChildrens</span><span class="p">(){</span>
    <span class="n">resp</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">http</span><span class="o">.</span><span class="n">Get</span><span class="p">(</span><span class="s">"https://github.com/trending"</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span><span class="p">{</span>
        <span class="n">log</span><span class="o">.</span><span class="n">Fatal</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
    <span class="p">}</span>
    <span class="k">defer</span> <span class="n">resp</span><span class="o">.</span><span class="n">Body</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span>

    <span class="k">if</span> <span class="n">resp</span><span class="o">.</span><span class="n">StatusCode</span> <span class="o">!=</span> <span class="m">200</span><span class="p">{</span>
        <span class="n">log</span><span class="o">.</span><span class="n">Fatalf</span><span class="p">(</span><span class="s">"Status code error: %d %s"</span><span class="p">,</span> <span class="n">resp</span><span class="o">.</span><span class="n">StatusCode</span><span class="p">,</span> <span class="n">resp</span><span class="o">.</span><span class="n">Status</span><span class="p">)</span>
    <span class="p">}</span>
    <span class="n">doc</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">goquery</span><span class="o">.</span><span class="n">NewDocumentFromReader</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">Body</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span><span class="p">{</span>
        <span class="n">log</span><span class="o">.</span><span class="n">Fatal</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
    <span class="p">}</span>
    <span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="n">doc</span><span class="o">.</span><span class="n">Find</span><span class="p">(</span><span class="s">"title"</span><span class="p">)</span><span class="o">.</span><span class="n">Text</span><span class="p">())</span>
    <span class="n">olSelection</span> <span class="o">:=</span> <span class="n">doc</span><span class="o">.</span><span class="n">Find</span><span class="p">(</span><span class="s">"ol"</span><span class="p">)</span>
    <span class="n">olSelection</span><span class="o">.</span><span class="n">Children</span><span class="p">()</span><span class="o">.</span><span class="n">Each</span><span class="p">(</span><span class="k">func</span><span class="p">(</span><span class="n">i</span> <span class="kt">int</span><span class="p">,</span> <span class="n">s</span> <span class="o">*</span><span class="n">goquery</span><span class="o">.</span><span class="n">Selection</span><span class="p">){</span> <span class="c">// using .Children() on the ol selection to get all li</span>
        <span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="n">strings</span><span class="o">.</span><span class="n">TrimSpace</span><span class="p">(</span><span class="n">s</span><span class="o">.</span><span class="n">Find</span><span class="p">(</span><span class="s">"h3"</span><span class="p">)</span><span class="o">.</span><span class="n">Text</span><span class="p">()))</span>
    <span class="p">})</span>
<span class="p">}</span>


<span class="k">func</span> <span class="n">main</span><span class="p">(){</span>
    <span class="n">navigateChildrens</span><span class="p">()</span>
<span class="p">}</span>
</code></pre></div></div>

<p><strong>Output</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ go run example.go
Trending repositories on GitHub today · GitHub
you-dont-need / You-Dont-Need-Momentjs
ripienaar / free-for-dev
Nozbe / WatermelonDB
cjbarber / ToolsOfTheTrade
byoungd / English-level-up-tips-for-Chinese
TheAlgorithms / Python
thedaviddias / Front-End-Checklist
zziz / pwc
dawnlabs / carbon
CyC2018 / CS-Notes
Avik-Jain / 100-Days-Of-ML-Code
donnemartin / system-design-primer
mariusandra / pigeon-maps
Snailclimb / JavaGuide
JavaNoober / BackgroundLibrary
crossoverJie / JCSprout
Microsoft / nni
PansonPanson / Java-Notes
date-fns / date-fns
sindresorhus / ky
mciastek / sal
rwv / chinese-dos-games
vuejs / vue
GoogleCloudPlatform / open-match
lin-xin / vue-manage-system
</code></pre></div></div>

<p>The .children will only return the immediate childrens of the parent element.</p>

<h2 id="navigating-previous-and-next-siblings-of-an-element">Navigating previous and next siblings of an element</h2>

<div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">package</span> <span class="n">main</span>
<span class="k">import</span> <span class="p">(</span>
    <span class="s">"fmt"</span>
    <span class="s">"log"</span>
    <span class="s">"strings"</span>
   <span class="s">"net/http"</span>
    <span class="s">"github.com/PuerkitoBio/goquery"</span>
<span class="p">)</span>

<span class="k">func</span> <span class="n">navigateSiblings</span><span class="p">(){</span>
    <span class="n">resp</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">http</span><span class="o">.</span><span class="n">Get</span><span class="p">(</span><span class="s">"https://github.com/trending"</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span><span class="p">{</span>
        <span class="n">log</span><span class="o">.</span><span class="n">Fatal</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
    <span class="p">}</span>
    <span class="k">defer</span> <span class="n">resp</span><span class="o">.</span><span class="n">Body</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span>
    <span class="k">if</span> <span class="n">resp</span><span class="o">.</span><span class="n">StatusCode</span> <span class="o">!=</span> <span class="m">200</span><span class="p">{</span>
        <span class="n">log</span><span class="o">.</span><span class="n">Fatalf</span><span class="p">(</span><span class="s">"Status code error: %d %s"</span><span class="p">,</span> <span class="n">resp</span><span class="o">.</span><span class="n">StatusCode</span><span class="p">,</span> <span class="n">resp</span><span class="o">.</span><span class="n">Status</span><span class="p">)</span>
    <span class="p">}</span>
    <span class="n">doc</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">goquery</span><span class="o">.</span><span class="n">NewDocumentFromReader</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">Body</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span><span class="p">{</span>
        <span class="n">log</span><span class="o">.</span><span class="n">Fatal</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
    <span class="p">}</span>
    <span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="n">doc</span><span class="o">.</span><span class="n">Find</span><span class="p">(</span><span class="s">"title"</span><span class="p">)</span><span class="o">.</span><span class="n">Text</span><span class="p">())</span>
    <span class="n">liSelection</span> <span class="o">:=</span> <span class="n">doc</span><span class="o">.</span><span class="n">Find</span><span class="p">(</span><span class="s">"ol li"</span><span class="p">)</span>
    <span class="n">fifthElement</span> <span class="o">:=</span> <span class="n">liSelection</span><span class="o">.</span><span class="n">Eq</span><span class="p">(</span><span class="m">4</span><span class="p">)</span> <span class="c">// using Eq() and passing the index we can navigate to the element with given index</span>
    <span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="n">strings</span><span class="o">.</span><span class="n">TrimSpace</span><span class="p">(</span><span class="n">fifthElement</span><span class="o">.</span><span class="n">Find</span><span class="p">(</span><span class="s">"h3"</span><span class="p">)</span><span class="o">.</span><span class="n">Text</span><span class="p">()))</span>
    <span class="n">fourthElement</span> <span class="o">:=</span> <span class="n">fifthElement</span><span class="o">.</span><span class="n">Prev</span><span class="p">()</span>
    <span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="n">strings</span><span class="o">.</span><span class="n">TrimSpace</span><span class="p">(</span><span class="n">fourthElement</span><span class="o">.</span><span class="n">Find</span><span class="p">(</span><span class="s">"h3"</span><span class="p">)</span><span class="o">.</span><span class="n">Text</span><span class="p">()))</span>
    <span class="n">sixthElement</span> <span class="o">:=</span> <span class="n">fifthElement</span><span class="o">.</span><span class="n">Next</span><span class="p">()</span>
    <span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="n">strings</span><span class="o">.</span><span class="n">TrimSpace</span><span class="p">(</span><span class="n">sixthElement</span><span class="o">.</span><span class="n">Find</span><span class="p">(</span><span class="s">"h3"</span><span class="p">)</span><span class="o">.</span><span class="n">Text</span><span class="p">()))</span>
<span class="p">}</span>


<span class="k">func</span> <span class="n">main</span><span class="p">(){</span>
   <span class="n">navigateSiblings</span><span class="p">()</span>
<span class="p">}</span>
</code></pre></div></div>

<p><strong>Output</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ go run example.go
Trending repositories on GitHub today · GitHub
byoungd / English-level-up-tips-for-Chinese
cjbarber / ToolsOfTheTrade
TheAlgorithms / Python
</code></pre></div></div>

<h2 id="putting-it-all-togethergithub-trending-scraper-using-golang">Putting it all together(Github Trending Scraper using Golang)</h2>

<div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">package</span> <span class="n">main</span>
<span class="k">import</span> <span class="p">(</span>
    <span class="s">"fmt"</span>
    <span class="s">"log"</span>
    <span class="s">"strings"</span>
    <span class="c">//"io"</span>
    <span class="c">//"os"</span>
    <span class="s">"net/http"</span>
    <span class="s">"github.com/PuerkitoBio/goquery"</span>
<span class="p">)</span>

<span class="k">func</span> <span class="n">githubTrendingScraper</span><span class="p">(){</span>
    <span class="n">resp</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">http</span><span class="o">.</span><span class="n">Get</span><span class="p">(</span><span class="s">"https://github.com/trending"</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span><span class="p">{</span>
        <span class="n">log</span><span class="o">.</span><span class="n">Fatal</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
    <span class="p">}</span>
    <span class="k">defer</span> <span class="n">resp</span><span class="o">.</span><span class="n">Body</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span>
    <span class="k">if</span> <span class="n">resp</span><span class="o">.</span><span class="n">StatusCode</span> <span class="o">!=</span> <span class="m">200</span><span class="p">{</span>
        <span class="n">log</span><span class="o">.</span><span class="n">Fatalf</span><span class="p">(</span><span class="s">"Status code error: %d %s"</span><span class="p">,</span> <span class="n">resp</span><span class="o">.</span><span class="n">StatusCode</span><span class="p">,</span> <span class="n">resp</span><span class="o">.</span><span class="n">Status</span><span class="p">)</span>
    <span class="p">}</span>
    <span class="n">doc</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">goquery</span><span class="o">.</span><span class="n">NewDocumentFromReader</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">Body</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span><span class="p">{</span>
        <span class="n">log</span><span class="o">.</span><span class="n">Fatal</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
    <span class="p">}</span>

    <span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="n">doc</span><span class="o">.</span><span class="n">Find</span><span class="p">(</span><span class="s">"title"</span><span class="p">)</span><span class="o">.</span><span class="n">Text</span><span class="p">())</span>
    <span class="n">doc</span><span class="o">.</span><span class="n">Find</span><span class="p">(</span><span class="s">"ol li"</span><span class="p">)</span><span class="o">.</span><span class="n">Each</span><span class="p">(</span><span class="k">func</span> <span class="p">(</span><span class="n">i</span> <span class="kt">int</span><span class="p">,</span> <span class="n">s</span> <span class="o">*</span><span class="n">goquery</span><span class="o">.</span><span class="n">Selection</span><span class="p">){</span>
        <span class="n">repositoryName</span> <span class="o">:=</span> <span class="n">strings</span><span class="o">.</span><span class="n">TrimSpace</span><span class="p">(</span><span class="n">s</span><span class="o">.</span><span class="n">Find</span><span class="p">(</span><span class="s">"h3"</span><span class="p">)</span><span class="o">.</span><span class="n">Text</span><span class="p">())</span>
        <span class="n">totalStarsToday</span> <span class="o">:=</span> <span class="n">strings</span><span class="o">.</span><span class="n">TrimSpace</span><span class="p">(</span><span class="n">s</span><span class="o">.</span><span class="n">Find</span><span class="p">(</span><span class="s">".float-sm-right"</span><span class="p">)</span><span class="o">.</span><span class="n">Text</span><span class="p">())</span>
        <span class="n">href</span><span class="p">,</span> <span class="n">has_attr</span> <span class="o">:=</span> <span class="n">s</span><span class="o">.</span><span class="n">Find</span><span class="p">(</span><span class="s">"a"</span><span class="p">)</span><span class="o">.</span><span class="n">Attr</span><span class="p">(</span><span class="s">"href"</span><span class="p">)</span>
        <span class="k">if</span> <span class="o">!</span><span class="n">has_attr</span><span class="p">{</span>
            <span class="n">href</span> <span class="o">=</span> <span class="s">"No valid url found"</span>
        <span class="p">}</span>
        <span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="n">repositoryName</span><span class="p">,</span> <span class="s">"</span><span class="se">\t</span><span class="s">"</span><span class="p">,</span> <span class="n">totalStarsToday</span><span class="p">,</span> <span class="s">"</span><span class="se">\t</span><span class="s">"</span><span class="p">,</span> <span class="s">"https://github.com"</span> <span class="o">+</span> <span class="n">href</span><span class="p">)</span>
    <span class="p">})</span>

<span class="p">}</span>


<span class="k">func</span> <span class="n">main</span><span class="p">(){</span>
   <span class="n">githubTrendingScraper</span><span class="p">()</span>
<span class="p">}</span>
</code></pre></div></div>

<p><strong>Output</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ go run example.go
Trending repositories on GitHub today · GitHub
you-dont-need / You-Dont-Need-Momentjs      625 stars today https://github.com/you-dont-need/You-Dont-Need-Momentjs
ripienaar / free-for-dev                    476 stars today https://github.com/ripienaar/free-for-dev
Nozbe / WatermelonDB                        407 stars today https://github.com/Nozbe/WatermelonDB
cjbarber / ToolsOfTheTrade                  392 stars today https://github.com/cjbarber/ToolsOfTheTrade
byoungd / English-level-up-tips-for-Chinese 332 stars today https://github.com/byoungd/English-level-up-tips-for-Chinese
TheAlgorithms / Python                      316 stars today https://github.com/TheAlgorithms/Python
thedaviddias / Front-End-Checklist          304 stars today https://github.com/thedaviddias/Front-End-Checklist
zziz / pwc                                  274 stars today https://github.com/zziz/pwc
dawnlabs / carbon                           249 stars today https://github.com/dawnlabs/carbon
CyC2018 / CS-Notes                          201 stars today https://github.com/CyC2018/CS-Notes
Avik-Jain / 100-Days-Of-ML-Code             206 stars today https://github.com/Avik-Jain/100-Days-Of-ML-Code
donnemartin / system-design-primer          188 stars today https://github.com/donnemartin/system-design-primer
mariusandra / pigeon-maps                   192 stars today https://github.com/mariusandra/pigeon-maps
Snailclimb / JavaGuide                      165 stars today https://github.com/Snailclimb/JavaGuide
JavaNoober / BackgroundLibrary              154 stars today https://github.com/JavaNoober/BackgroundLibrary
crossoverJie / JCSprout                     141 stars today https://github.com/crossoverJie/JCSprout
Microsoft / nni                             153 stars today https://github.com/Microsoft/nni
PansonPanson / Java-Notes                   146 stars today https://github.com/PansonPanson/Java-Notes
date-fns / date-fns                         153 stars today https://github.com/date-fns/date-fns
sindresorhus / ky                           149 stars today https://github.com/sindresorhus/ky
mciastek / sal                              145 stars today https://github.com/mciastek/sal
rwv / chinese-dos-games                     134 stars today https://github.com/rwv/chinese-dos-games
vuejs / vue                                 124 stars today https://github.com/vuejs/vue
GoogleCloudPlatform / open-match            137 stars today https://github.com/GoogleCloudPlatform/open-match
lin-xin / vue-manage-system                 117 stars today https://github.com/lin-xin/vue-manage-system
</code></pre></div></div>]]></content><author><name>Bhishan Bhandari</name><email>bhishan.bhandari@yaypply.com, bbhishan@gmail.com</email></author><category term="Golang" /><category term="Web Scraping" /><category term="Goquery" /><category term="Tutorials" /><summary type="html"><![CDATA[Web Scraping can be beneficial to individuals and companies. The intentions of this post is to host a set of examples on Web Scraping using Golang and goquery. I will be using github’s trending page https://github.com/trending throughout this post for the examples, especially because it best suits for applying various goquery methods. There are two other versions of this article which replicates the same set of examples in Python and NodeJS.]]></summary></entry><entry><title type="html">Visualization with VisJS</title><link href="https://bhishan.github.io/posts/2018/08/visjs-visualization/" rel="alternate" type="text/html" title="Visualization with VisJS" /><published>2018-08-19T00:00:00+00:00</published><updated>2018-08-19T00:00:00+00:00</updated><id>https://bhishan.github.io/posts/2018/08/vis-js-network-examples</id><content type="html" xml:base="https://bhishan.github.io/posts/2018/08/visjs-visualization/"><![CDATA[<p>The intentions of this post is to host example code snippets so people can take ideas from it to make great visualization for themselves using visJS. VisJS is a dynamic, browser based visualization library. The library is designed to be easy to use, to handle large amounts of dynamic data, and to enable manipulation of and interaction with the data. The library consists of the components DataSet, Timeline, Network, Graph2d and Graph3d.</p>

<h2 id="visjs-network-nodes-as-images-with-label">VisJS network [Nodes as images with label]</h2>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">&lt;!doctype html&gt;</span>
<span class="nt">&lt;html&gt;</span>
<span class="nt">&lt;head&gt;</span>
  <span class="nt">&lt;title&gt;</span>Bhishan's Services | TheTaraNights<span class="nt">&lt;/title&gt;</span>

  <span class="nt">&lt;style </span><span class="na">type=</span><span class="s">"text/css"</span><span class="nt">&gt;</span>

    <span class="nt">body</span> <span class="p">{</span>
      <span class="nl">font</span><span class="p">:</span> <span class="m">10pt</span> <span class="n">arial</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="nf">#mynetwork</span> <span class="p">{</span>
      <span class="nl">width</span><span class="p">:</span> <span class="m">100%</span><span class="p">;</span>
      <span class="nl">height</span><span class="p">:</span> <span class="m">900px</span><span class="p">;</span>
      <span class="nl">border</span><span class="p">:</span> <span class="m">1px</span> <span class="nb">solid</span> <span class="n">lightgray</span><span class="p">;</span>
      <span class="nl">background-color</span><span class="p">:</span><span class="m">#333333</span><span class="p">;</span>
    <span class="p">}</span>
  <span class="nt">&lt;/style&gt;</span>

  <span class="nt">&lt;script </span><span class="na">type=</span><span class="s">"text/javascript"</span> <span class="na">src=</span><span class="s">"https://cdnjs.cloudflare.com/ajax/libs/vis/4.21.0/vis.js"</span><span class="nt">&gt;&lt;/script&gt;</span>
  <span class="nt">&lt;link</span> <span class="na">href=</span><span class="s">"https://cdnjs.cloudflare.com/ajax/libs/vis/4.21.0/vis-network.min.css"</span> <span class="na">rel=</span><span class="s">"stylesheet"</span> <span class="na">type=</span><span class="s">"text/css"</span> <span class="nt">/&gt;</span>
<span class="nt">&lt;link</span> <span class="na">rel=</span><span class="s">"stylesheet"</span> <span class="na">href=</span><span class="s">"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"</span><span class="nt">&gt;</span>
  <span class="nt">&lt;script </span><span class="na">type=</span><span class="s">"text/javascript"</span><span class="nt">&gt;</span>
    <span class="kd">var</span> <span class="nx">nodes</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
    <span class="kd">var</span> <span class="nx">edges</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
    <span class="kd">var</span> <span class="nx">network</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>

    <span class="c1">// Called when the Visualization API is loaded.</span>
    <span class="kd">function</span> <span class="nx">draw</span><span class="p">()</span> <span class="p">{</span>
      <span class="c1">// create people.</span>
      <span class="kd">var</span> <span class="nx">DIR</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">https://www.thetaranights.com/wp-content/uploads/2018/fiverr_reviews/</span><span class="dl">'</span><span class="p">;</span>

      <span class="kd">var</span> <span class="nx">ratings</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">&lt;span class="fa fa-star checked"&gt;&lt;/span&gt;&lt;span class="fa fa-star checked"&gt;&lt;/span&gt;&lt;span class="fa fa-star checked"&gt;&lt;/span&gt;&lt;span class="fa fa-star checked"&gt;&lt;/span&gt;&lt;span class="fa fa-star checked"&gt;&lt;/span&gt;&lt;br&gt;</span><span class="dl">'</span><span class="p">;</span>
      <span class="nx">nodes</span> <span class="o">=</span> <span class="p">[</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="dl">"</span><span class="s2">https://avatars3.githubusercontent.com/u/6163574?s=400&amp;u;=c396866f2c1ca2a709c1ece0d5a352e0f6e1a865&amp;v;=4</span><span class="dl">"</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Bhishan</span><span class="dl">"</span><span class="p">,</span> <span class="na">size</span><span class="p">:</span><span class="mi">60</span><span class="p">},</span>
        <span class="c1">// {id: 1, shape: 'circularImage', image: DIR + "bhishan.png", label:"Bhishan", size:60},</span>

        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Benf97/cropped(1).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Benf97</span><span class="dl">"</span> <span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Bigyoyo55/cropped(2).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Bigyoyo55</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">4</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Btpope22/cropped(3).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Btpope22</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">5</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Chrisraven/cropped(4).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Chrisraven</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">6</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Cnnsbs/cropped(5).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Cnnsbs</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">7</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Danielemariotto/cropped(6).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Danielemariotto</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">8</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Davideguerrini/cropped(7).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Davideguerrini</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">9</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Den_bdt/cropped(8).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Den_bdt</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">10</span><span class="p">,</span> <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Devinsays/cropped(9).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Devinsays</span><span class="dl">"</span><span class="p">},</span>

      <span class="p">];</span>

      <span class="kd">var</span> <span class="nx">container</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">'</span><span class="s1">mynetwork</span><span class="dl">'</span><span class="p">);</span>
      <span class="kd">var</span> <span class="nx">data</span> <span class="o">=</span> <span class="p">{</span>
        <span class="na">nodes</span><span class="p">:</span> <span class="nx">nodes</span><span class="p">,</span>
      <span class="p">};</span>
      <span class="kd">var</span> <span class="nx">options</span> <span class="o">=</span> <span class="p">{</span>

        <span class="na">font</span><span class="p">:{</span>
          <span class="na">size</span><span class="p">:</span> <span class="mi">100</span><span class="p">,</span>
        <span class="p">},</span>
        <span class="na">physics</span><span class="p">:</span> <span class="p">{</span>
            <span class="na">barnesHut</span><span class="p">:</span> <span class="p">{</span>
              <span class="na">avoidOverlap</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
              <span class="na">centralGravity</span><span class="p">:</span> <span class="mf">0.2</span><span class="p">,</span>
            <span class="p">},</span>
      <span class="p">},</span>
      <span class="na">nodes</span><span class="p">:</span> <span class="p">{</span>
          <span class="na">size</span><span class="p">:</span><span class="mi">40</span><span class="p">,</span>
          <span class="na">color</span><span class="p">:</span> <span class="p">{</span>
            <span class="na">background</span><span class="p">:</span> <span class="dl">'</span><span class="s1">#006400</span><span class="dl">'</span>
          <span class="p">},</span>
          <span class="na">font</span><span class="p">:{</span><span class="na">color</span><span class="p">:</span><span class="dl">'</span><span class="s1">#eeeeee</span><span class="dl">'</span><span class="p">,</span> <span class="dl">"</span><span class="s2">size</span><span class="dl">"</span><span class="p">:</span> <span class="mi">30</span><span class="p">},</span>

        <span class="p">},</span>

      <span class="p">};</span>
      <span class="nx">network</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">vis</span><span class="p">.</span><span class="nx">Network</span><span class="p">(</span><span class="nx">container</span><span class="p">,</span> <span class="nx">data</span><span class="p">,</span> <span class="nx">options</span><span class="p">);</span>

    <span class="p">}</span>
  <span class="nt">&lt;/script&gt;</span>

<span class="nt">&lt;/head&gt;</span>

<span class="nt">&lt;body</span> <span class="na">onload=</span><span class="s">"draw()"</span><span class="nt">&gt;</span>

<span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">"mynetwork"</span><span class="nt">&gt;&lt;/div&gt;</span>

<span class="nt">&lt;/body&gt;</span>
<span class="nt">&lt;/html&gt;</span>
</code></pre></div></div>

<h2 id="visjs-edges-between-nodes">VisJs Edges between nodes</h2>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">&lt;!doctype html&gt;</span>
<span class="nt">&lt;html&gt;</span>
<span class="nt">&lt;head&gt;</span>
  <span class="nt">&lt;title&gt;</span>Bhishan's Services | TheTaraNights<span class="nt">&lt;/title&gt;</span>

  <span class="nt">&lt;style </span><span class="na">type=</span><span class="s">"text/css"</span><span class="nt">&gt;</span>

    <span class="nt">body</span> <span class="p">{</span>
      <span class="nl">font</span><span class="p">:</span> <span class="m">10pt</span> <span class="n">arial</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="nf">#mynetwork</span> <span class="p">{</span>
      <span class="nl">width</span><span class="p">:</span> <span class="m">100%</span><span class="p">;</span>
      <span class="nl">height</span><span class="p">:</span> <span class="m">900px</span><span class="p">;</span>
      <span class="nl">border</span><span class="p">:</span> <span class="m">1px</span> <span class="nb">solid</span> <span class="n">lightgray</span><span class="p">;</span>
      <span class="nl">background-color</span><span class="p">:</span><span class="m">#333333</span><span class="p">;</span>
    <span class="p">}</span>
  <span class="nt">&lt;/style&gt;</span>

  <span class="nt">&lt;script </span><span class="na">type=</span><span class="s">"text/javascript"</span> <span class="na">src=</span><span class="s">"https://cdnjs.cloudflare.com/ajax/libs/vis/4.21.0/vis.js"</span><span class="nt">&gt;&lt;/script&gt;</span>
  <span class="nt">&lt;link</span> <span class="na">href=</span><span class="s">"https://cdnjs.cloudflare.com/ajax/libs/vis/4.21.0/vis-network.min.css"</span> <span class="na">rel=</span><span class="s">"stylesheet"</span> <span class="na">type=</span><span class="s">"text/css"</span> <span class="nt">/&gt;</span>
<span class="nt">&lt;link</span> <span class="na">rel=</span><span class="s">"stylesheet"</span> <span class="na">href=</span><span class="s">"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"</span><span class="nt">&gt;</span>
  <span class="nt">&lt;script </span><span class="na">type=</span><span class="s">"text/javascript"</span><span class="nt">&gt;</span>

    <span class="kd">var</span> <span class="nx">nodes</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
    <span class="kd">var</span> <span class="nx">edges</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
    <span class="kd">var</span> <span class="nx">network</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>

    <span class="c1">// Called when the Visualization API is loaded.</span>
    <span class="kd">function</span> <span class="nx">draw</span><span class="p">()</span> <span class="p">{</span>
      <span class="c1">// create people.</span>
      <span class="kd">var</span> <span class="nx">DIR</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">https://www.thetaranights.com/wp-content/uploads/2018/fiverr_reviews/</span><span class="dl">'</span><span class="p">;</span>

      <span class="kd">var</span> <span class="nx">ratings</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">&lt;span class="fa fa-star checked"&gt;&lt;/span&gt;&lt;span class="fa fa-star checked"&gt;&lt;/span&gt;&lt;span class="fa fa-star checked"&gt;&lt;/span&gt;&lt;span class="fa fa-star checked"&gt;&lt;/span&gt;&lt;span class="fa fa-star checked"&gt;&lt;/span&gt;&lt;br&gt;</span><span class="dl">'</span><span class="p">;</span>
      <span class="nx">nodes</span> <span class="o">=</span> <span class="p">[</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="dl">"</span><span class="s2">https://avatars3.githubusercontent.com/u/6163574?s=400&amp;u;=c396866f2c1ca2a709c1ece0d5a352e0f6e1a865&amp;v;=4</span><span class="dl">"</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Bhishan</span><span class="dl">"</span><span class="p">,</span> <span class="na">size</span><span class="p">:</span><span class="mi">60</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Benf97/cropped(1).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Benf97</span><span class="dl">"</span> <span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Bigyoyo55/cropped(2).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Bigyoyo55</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">4</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Btpope22/cropped(3).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Btpope22</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">5</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Chrisraven/cropped(4).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Chrisraven</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">6</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Cnnsbs/cropped(5).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Cnnsbs</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">7</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Danielemariotto/cropped(6).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Danielemariotto</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">8</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Davideguerrini/cropped(7).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Davideguerrini</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">9</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Den_bdt/cropped(8).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Den_bdt</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">10</span><span class="p">,</span> <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Devinsays/cropped(9).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Devinsays</span><span class="dl">"</span><span class="p">},</span>

      <span class="p">];</span>

      <span class="c1">// create connections between people</span>

      <span class="nx">edges</span> <span class="o">=</span> <span class="p">[];</span>
      <span class="k">for</span><span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span><span class="mi">2</span><span class="p">;</span> <span class="nx">i</span><span class="o">&lt;</span><span class="mi">11</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">){</span>
        <span class="nx">edges</span><span class="p">.</span><span class="nx">push</span><span class="p">({</span><span class="na">from</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="na">to</span><span class="p">:</span> <span class="nx">i</span><span class="p">});</span>
      <span class="p">}</span>

      <span class="kd">var</span> <span class="nx">container</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">'</span><span class="s1">mynetwork</span><span class="dl">'</span><span class="p">);</span>
      <span class="kd">var</span> <span class="nx">data</span> <span class="o">=</span> <span class="p">{</span>
        <span class="na">nodes</span><span class="p">:</span> <span class="nx">nodes</span><span class="p">,</span>
        <span class="na">edges</span><span class="p">:</span> <span class="nx">edges</span>
      <span class="p">};</span>
      <span class="kd">var</span> <span class="nx">options</span> <span class="o">=</span> <span class="p">{</span>

        <span class="na">nodes</span><span class="p">:</span> <span class="p">{</span>
            <span class="na">size</span><span class="p">:</span><span class="mi">40</span><span class="p">,</span>
              <span class="na">color</span><span class="p">:</span> <span class="p">{</span>
              <span class="na">background</span><span class="p">:</span> <span class="dl">'</span><span class="s1">#006400</span><span class="dl">'</span>
            <span class="p">},</span>
            <span class="na">font</span><span class="p">:{</span><span class="na">color</span><span class="p">:</span><span class="dl">'</span><span class="s1">#eeeeee</span><span class="dl">'</span><span class="p">,</span> <span class="dl">"</span><span class="s2">size</span><span class="dl">"</span><span class="p">:</span> <span class="mi">10</span><span class="p">},</span>
        <span class="p">},</span>

      <span class="p">};</span>
      <span class="nx">network</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">vis</span><span class="p">.</span><span class="nx">Network</span><span class="p">(</span><span class="nx">container</span><span class="p">,</span> <span class="nx">data</span><span class="p">,</span> <span class="nx">options</span><span class="p">);</span>

    <span class="p">}</span>
  <span class="nt">&lt;/script&gt;</span>

<span class="nt">&lt;/head&gt;</span>

<span class="nt">&lt;body</span> <span class="na">onload=</span><span class="s">"draw()"</span><span class="nt">&gt;</span>

<span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">"mynetwork"</span><span class="nt">&gt;&lt;/div&gt;</span>

<span class="nt">&lt;/body&gt;</span>
<span class="nt">&lt;/html&gt;</span>
</code></pre></div></div>

<h2 id="visjs-onclick-and-onhover">VisJS onclick() and onhover()</h2>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">&lt;!doctype html&gt;</span>
<span class="nt">&lt;html&gt;</span>
<span class="nt">&lt;head&gt;</span>
  <span class="nt">&lt;title&gt;</span>Bhishan's Services | TheTaraNights<span class="nt">&lt;/title&gt;</span>

  <span class="nt">&lt;style </span><span class="na">type=</span><span class="s">"text/css"</span><span class="nt">&gt;</span>

    <span class="nt">body</span> <span class="p">{</span>
      <span class="nl">font</span><span class="p">:</span> <span class="m">10pt</span> <span class="n">arial</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="nf">#mynetwork</span> <span class="p">{</span>
      <span class="nl">width</span><span class="p">:</span> <span class="m">100%</span><span class="p">;</span>
      <span class="nl">height</span><span class="p">:</span> <span class="m">900px</span><span class="p">;</span>
      <span class="nl">border</span><span class="p">:</span> <span class="m">1px</span> <span class="nb">solid</span> <span class="n">lightgray</span><span class="p">;</span>
      <span class="nl">background-color</span><span class="p">:</span><span class="m">#333333</span><span class="p">;</span>
    <span class="p">}</span>
  <span class="nt">&lt;/style&gt;</span>

  <span class="nt">&lt;script </span><span class="na">type=</span><span class="s">"text/javascript"</span> <span class="na">src=</span><span class="s">"https://cdnjs.cloudflare.com/ajax/libs/vis/4.21.0/vis.js"</span><span class="nt">&gt;&lt;/script&gt;</span>
  <span class="nt">&lt;link</span> <span class="na">href=</span><span class="s">"https://cdnjs.cloudflare.com/ajax/libs/vis/4.21.0/vis-network.min.css"</span> <span class="na">rel=</span><span class="s">"stylesheet"</span> <span class="na">type=</span><span class="s">"text/css"</span> <span class="nt">/&gt;</span>
<span class="nt">&lt;link</span> <span class="na">rel=</span><span class="s">"stylesheet"</span> <span class="na">href=</span><span class="s">"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"</span><span class="nt">&gt;</span>
  <span class="nt">&lt;script </span><span class="na">type=</span><span class="s">"text/javascript"</span><span class="nt">&gt;</span>
    <span class="c1">// var DIR = 'https://www.thetaranights.com/wp-content/uploads/2018/fiverr_reviews/';</span>

    <span class="kd">var</span> <span class="nx">nodes</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
    <span class="kd">var</span> <span class="nx">edges</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
    <span class="kd">var</span> <span class="nx">network</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>

    <span class="c1">// Called when the Visualization API is loaded.</span>
    <span class="kd">function</span> <span class="nx">draw</span><span class="p">()</span> <span class="p">{</span>
      <span class="c1">// create people.</span>
      <span class="kd">var</span> <span class="nx">DIR</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">https://www.thetaranights.com/wp-content/uploads/2018/fiverr_reviews/</span><span class="dl">'</span><span class="p">;</span>

      <span class="kd">var</span> <span class="nx">ratings</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">&lt;span class="fa fa-star checked"&gt;&lt;/span&gt;&lt;span class="fa fa-star checked"&gt;&lt;/span&gt;&lt;span class="fa fa-star checked"&gt;&lt;/span&gt;&lt;span class="fa fa-star checked"&gt;&lt;/span&gt;&lt;span class="fa fa-star checked"&gt;&lt;/span&gt;&lt;br&gt;</span><span class="dl">'</span><span class="p">;</span>
      <span class="nx">nodes</span> <span class="o">=</span> <span class="p">[</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="dl">"</span><span class="s2">https://avatars3.githubusercontent.com/u/6163574?s=400&amp;u;=c396866f2c1ca2a709c1ece0d5a352e0f6e1a865&amp;v;=4</span><span class="dl">"</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Bhishan</span><span class="dl">"</span><span class="p">,</span> <span class="na">size</span><span class="p">:</span><span class="mi">60</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Benf97/cropped(1).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Benf97</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">This guy is honestly amazing! &lt;br&gt;I have never experienced such pure dedication and commitment to a task, despite struggles, and a final product of which is outstanding!</span><span class="dl">'</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Bigyoyo55/cropped(2).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Bigyoyo55</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Very good seller mastering python and script development ! &lt;br&gt;Thanks for all&lt;br&gt;</span><span class="dl">"</span> <span class="o">+</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Very good python developper, and very patient !&lt;br&gt; Thanks for all</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">4</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Btpope22/cropped(3).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Btpope22</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">I really needed help getting anaconda installed on my laptop - it wasn't working correctly.&lt;br&gt; He was available right away and quickly assessed then fixed my issue.</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">5</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Chrisraven/cropped(4).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Chrisraven</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Outstanding Experience!</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">6</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Cnnsbs/cropped(5).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Cnnsbs</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Awesome!!! I want to ask for work next time. &lt;br&gt;He wokred exact what I want.</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">7</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Danielemariotto/cropped(6).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Danielemariotto</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Outstanding Experience!&lt;br&gt;</span><span class="dl">"</span> <span class="o">+</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Outstanding Experience!</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">8</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Davideguerrini/cropped(7).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Davideguerrini</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">A really great experience.&lt;br&gt; Bhishan Is very quick and professional. &lt;br&gt;A pleasure to work with him!</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">9</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Den_bdt/cropped(8).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Den_bdt</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Outstanding Experience!</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">10</span><span class="p">,</span> <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Devinsays/cropped(9).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Devinsays</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Bhishan built a script for us to get Facebook data through their API.&lt;br&gt; Delivered quickly, quality job.&lt;br&gt;</span><span class="dl">"</span> <span class="o">+</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Bhishan got the Alexa rank for about 2,000 websites we had in a spreadsheet.</span><span class="dl">"</span><span class="p">},</span>

      <span class="p">];</span>

      <span class="c1">// create connections between people</span>

      <span class="nx">edges</span> <span class="o">=</span> <span class="p">[];</span>
      <span class="k">for</span><span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span><span class="mi">2</span><span class="p">;</span> <span class="nx">i</span><span class="o">&lt;</span><span class="mi">11</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">){</span>
        <span class="nx">edges</span><span class="p">.</span><span class="nx">push</span><span class="p">({</span><span class="na">from</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="na">to</span><span class="p">:</span> <span class="nx">i</span><span class="p">});</span>
      <span class="p">}</span>

      <span class="kd">var</span> <span class="nx">container</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">'</span><span class="s1">mynetwork</span><span class="dl">'</span><span class="p">);</span>
      <span class="kd">var</span> <span class="nx">data</span> <span class="o">=</span> <span class="p">{</span>
        <span class="na">nodes</span><span class="p">:</span> <span class="nx">nodes</span><span class="p">,</span>
        <span class="na">edges</span><span class="p">:</span> <span class="nx">edges</span>
      <span class="p">};</span>
      <span class="kd">var</span> <span class="nx">options</span> <span class="o">=</span> <span class="p">{</span>

        <span class="na">nodes</span><span class="p">:</span> <span class="p">{</span>
            <span class="na">size</span><span class="p">:</span><span class="mi">40</span><span class="p">,</span>
              <span class="na">color</span><span class="p">:</span> <span class="p">{</span>
              <span class="na">background</span><span class="p">:</span> <span class="dl">'</span><span class="s1">#006400</span><span class="dl">'</span>
            <span class="p">},</span>
            <span class="na">font</span><span class="p">:{</span><span class="na">color</span><span class="p">:</span><span class="dl">'</span><span class="s1">#eeeeee</span><span class="dl">'</span><span class="p">,</span> <span class="dl">"</span><span class="s2">size</span><span class="dl">"</span><span class="p">:</span> <span class="mi">10</span><span class="p">},</span>
        <span class="p">},</span>

      <span class="p">};</span>
      <span class="nx">network</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">vis</span><span class="p">.</span><span class="nx">Network</span><span class="p">(</span><span class="nx">container</span><span class="p">,</span> <span class="nx">data</span><span class="p">,</span> <span class="nx">options</span><span class="p">);</span>

      <span class="nx">network</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="dl">"</span><span class="s2">click</span><span class="dl">"</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">params</span><span class="p">)</span> <span class="p">{</span>
          <span class="nx">params</span><span class="p">.</span><span class="nx">event</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">[original event]</span><span class="dl">"</span><span class="p">;</span>

      <span class="p">});</span>
      <span class="nx">network</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="dl">"</span><span class="s2">hoverNode</span><span class="dl">"</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">params</span><span class="p">)</span> <span class="p">{</span>
          <span class="nx">params</span><span class="p">.</span><span class="nx">event</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">[original event]</span><span class="dl">"</span><span class="p">;</span>

      <span class="p">});</span>


    <span class="p">}</span>
  <span class="nt">&lt;/script&gt;</span>

<span class="nt">&lt;/head&gt;</span>

<span class="nt">&lt;body</span> <span class="na">onload=</span><span class="s">"draw()"</span><span class="nt">&gt;</span>

<span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">"mynetwork"</span><span class="nt">&gt;&lt;/div&gt;</span>

<span class="nt">&lt;/body&gt;</span>
<span class="nt">&lt;/html&gt;</span>
</code></pre></div></div>

<h2 id="putting-it-all-together-bhishans-freelance-network">Putting it all together [Bhishan’s Freelance Network]</h2>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">&lt;!doctype html&gt;</span>
<span class="nt">&lt;html&gt;</span>
<span class="nt">&lt;head&gt;</span>
  <span class="nt">&lt;title&gt;</span>Bhishan's Services | TheTaraNights<span class="nt">&lt;/title&gt;</span>

  <span class="nt">&lt;style </span><span class="na">type=</span><span class="s">"text/css"</span><span class="nt">&gt;</span>
  <span class="nc">.checked</span> <span class="p">{</span>
    <span class="nl">color</span><span class="p">:</span> <span class="no">orange</span><span class="p">;</span>
<span class="p">}</span><span class="o">,</span>
    <span class="nt">body</span> <span class="p">{</span>
      <span class="nl">font</span><span class="p">:</span> <span class="m">10pt</span> <span class="n">arial</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="nf">#mynetwork</span> <span class="p">{</span>
      <span class="nl">width</span><span class="p">:</span> <span class="m">100%</span><span class="p">;</span>
      <span class="nl">height</span><span class="p">:</span> <span class="m">900px</span><span class="p">;</span>
      <span class="nl">border</span><span class="p">:</span> <span class="m">1px</span> <span class="nb">solid</span> <span class="n">lightgray</span><span class="p">;</span>
      <span class="nl">background-color</span><span class="p">:</span><span class="m">#333333</span><span class="p">;</span>
    <span class="p">}</span>
  <span class="nt">&lt;/style&gt;</span>

  <span class="nt">&lt;script </span><span class="na">type=</span><span class="s">"text/javascript"</span> <span class="na">src=</span><span class="s">"https://cdnjs.cloudflare.com/ajax/libs/vis/4.21.0/vis.js"</span><span class="nt">&gt;&lt;/script&gt;</span>
  <span class="nt">&lt;link</span> <span class="na">href=</span><span class="s">"https://cdnjs.cloudflare.com/ajax/libs/vis/4.21.0/vis-network.min.css"</span> <span class="na">rel=</span><span class="s">"stylesheet"</span> <span class="na">type=</span><span class="s">"text/css"</span> <span class="nt">/&gt;</span>
<span class="nt">&lt;link</span> <span class="na">rel=</span><span class="s">"stylesheet"</span> <span class="na">href=</span><span class="s">"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"</span><span class="nt">&gt;</span>
  <span class="nt">&lt;script </span><span class="na">type=</span><span class="s">"text/javascript"</span><span class="nt">&gt;</span>

    <span class="kd">var</span> <span class="nx">nodes</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
    <span class="kd">var</span> <span class="nx">edges</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
    <span class="kd">var</span> <span class="nx">network</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>

    <span class="c1">// Called when the Visualization API is loaded.</span>
    <span class="kd">function</span> <span class="nx">draw</span><span class="p">()</span> <span class="p">{</span>
      <span class="c1">// create people.</span>

      <span class="kd">var</span> <span class="nx">DIR</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">https://www.thetaranights.com/wp-content/uploads/2018/fiverr_reviews/</span><span class="dl">'</span><span class="p">;</span>


      <span class="kd">var</span> <span class="nx">ratings</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">&lt;span class="fa fa-star checked"&gt;&lt;/span&gt;&lt;span class="fa fa-star checked"&gt;&lt;/span&gt;&lt;span class="fa fa-star checked"&gt;&lt;/span&gt;&lt;span class="fa fa-star checked"&gt;&lt;/span&gt;&lt;span class="fa fa-star checked"&gt;&lt;/span&gt;&lt;br&gt;</span><span class="dl">'</span><span class="p">;</span>
      <span class="nx">nodes</span> <span class="o">=</span> <span class="p">[</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Benf97/cropped(1).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Benf97</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">This guy is honestly amazing! &lt;br&gt;I have never experienced such pure dedication and commitment to a task, despite struggles, and a final product of which is outstanding!</span><span class="dl">'</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Bigyoyo55/cropped(2).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Bigyoyo55</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Very good seller mastering python and script development ! &lt;br&gt;Thanks for all&lt;br&gt;</span><span class="dl">"</span> <span class="o">+</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Very good python developper, and very patient !&lt;br&gt; Thanks for all</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">4</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Btpope22/cropped(3).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Btpope22</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">I really needed help getting anaconda installed on my laptop - it wasn't working correctly.&lt;br&gt; He was available right away and quickly assessed then fixed my issue.</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">5</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Chrisraven/cropped(4).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Chrisraven</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Outstanding Experience!</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">6</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Cnnsbs/cropped(5).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Cnnsbs</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Awesome!!! I want to ask for work next time. &lt;br&gt;He wokred exact what I want.</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">7</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Danielemariotto/cropped(6).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Danielemariotto</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Outstanding Experience!&lt;br&gt;</span><span class="dl">"</span> <span class="o">+</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Outstanding Experience!</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">8</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Davideguerrini/cropped(7).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Davideguerrini</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">A really great experience.&lt;br&gt; Bhishan Is very quick and professional. &lt;br&gt;A pleasure to work with him!</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">9</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Den_bdt/cropped(8).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Den_bdt</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Outstanding Experience!</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">10</span><span class="p">,</span> <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Devinsays/cropped(9).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Devinsays</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Bhishan built a script for us to get Facebook data through their API.&lt;br&gt; Delivered quickly, quality job.&lt;br&gt;</span><span class="dl">"</span> <span class="o">+</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Bhishan got the Alexa rank for about 2,000 websites we had in a spreadsheet.</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">11</span><span class="p">,</span> <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Dxbst18/cropped(10).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Dxbst18</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Outstanding Experience!</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">12</span><span class="p">,</span> <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Elirosenblatt/cropped(11).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Elirosenblatt</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Bhishan, as always, was quick to help troubleshoot and went beyond my expectations.&lt;br&gt; A++ highly recommended!&lt;br&gt;</span><span class="dl">"</span> <span class="o">+</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">bhishan did a FANTASTIC job. Great communication, and script worked perfectly.&lt;br&gt; Would for sure do business with him again!</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">13</span><span class="p">,</span> <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Everinearnest/cropped(12).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Everinearnest</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Bhishan is a skilled troubleshooter who had a lot of patience with the unusual problems I was experiencing.&lt;br&gt; He is a very good communicator who explains the rationale for what he is doing, and is a pleasure to work with. &lt;br&gt;Highly recommended.</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">14</span><span class="p">,</span> <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Faizallala/cropped(13).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Faizallala</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Outstanding Experience!</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">15</span><span class="p">,</span> <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Geoman2222/cropped(14).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Geoman2222</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">SOOOO Fast He was Awsome&lt;br&gt;</span><span class="dl">"</span> <span class="o">+</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Very Knowledgeable and concurred any task I gave him</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">16</span><span class="p">,</span> <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Gmorinan/cropped(15).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Gmorinan</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Outstanding</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">17</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Babasanfoor/cropped.png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Babasanfoor</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span><span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">great experience&lt;br&gt;</span><span class="dl">"</span> <span class="o">+</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Excellent communication, excellent proficiency, will (and already have) order again.</span><span class="dl">'</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">18</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Goaway77/cropped(16).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Goaway77</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">He solved the problem! Thanks a lot, A+++ coder! Highly recommended! </span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">19</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Hartlepool/cropped(17).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Hartlepool</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Great job, very helpful</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">20</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Hkinq1/cropped(18).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Hkinq1</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Outstanding Experience!</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">21</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Ikeqian/cropped(19).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Ikeqian</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Pretty good. &lt;br&gt;Very fast and helpful!</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">22</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Iveksl2/cropped(20).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Iveksl2</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Outstanding Experience!&lt;br&gt;</span><span class="dl">"</span> <span class="o">+</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">bhishan wrote readable / concise code. &lt;br&gt;Did a good job</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">23</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Jamoxie/cropped(21).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Jamoxie</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Bhishan is the best coder that I've worked with: clear and thorough communication, well documented code, fast working and delivers before deadlines.&lt;br&gt; Also he exceeded my request with a feature that I didn't think could be added yet, so I could not be happier with this project. &lt;br&gt;Will be back soon!</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">24</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Jeamer/cropped(22).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Jeamer</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Outstanding Experience!</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">25</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Jeffmactech/cropped(23).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Jeffmactech</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Delivered EXACTLY what I needed! Thanks!</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">26</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Jlondonuk/cropped(24).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Jlondonuk</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Absolutely fantastic service! &lt;br&gt;Definitely buying again. I am so impressed!&lt;br&gt; Thank you Seller was kind, assuring, professional and completed it quickly!</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">27</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Kiwibloke11/cropped(25).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Kiwibloke11</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">absolute legend. nailed it quickly, lots of communication will use again</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">28</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Lauro1986/cropped(26).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Lauro1986</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">He was great. Project was delivered very quickly, very knowledgeable.&lt;br&gt; I recommend!</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">29</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Manuel13/cropped(27).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Manuel13</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Creative and outstanding work!&lt;br&gt; A real pro within this realm.</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">30</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Matheusroriz/cropped(28).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Matheusroriz</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Awesome! He was very helpful with everything!&lt;br&gt; We will certainly do business again!</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">31</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Michaelgrinberg/cropped(29).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Michaelgrinberg</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">I needed to parse a string using Python inside Zapier. &lt;br&gt;The final goal was to make sure that the utm parameters get passed on to the CRM.&lt;br&gt; Bhishan was able to deliver a script that works well, does the job.&lt;br&gt; He was ahead of time and very friendly. &lt;br&gt;I would recommend the gig and its owner to everybody who needs to do a similar job.</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">32</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Newenglandmedia/cropped(30).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Newenglandmedia</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">The code is very well written and works.&lt;br&gt; Bhishan parameterized the items that I was looking for in the script so that I could take it from here.&lt;br&gt; Look forward to working with him again. </span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">33</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Nielsdo/cropped(31).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Nielsdo</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Perfect!</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">34</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Nilsbor/cropped(32).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Nilsbor</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Everything was good</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">35</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Paulolpduarte/cropped(33).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Paulolpduarte</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Excellent job! Recommended!</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">36</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Picture93/cropped(34).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Picture93</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Outstanding Experience!&lt;br&gt;</span><span class="dl">"</span> <span class="o">+</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Outstanding Experience!</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">37</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Qms123456/cropped(35).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Qms123456</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Outstanding Experience!</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">38</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Rayrock2014/cropped(36).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Rayrock2014</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">As usual excellent&lt;br&gt;</span><span class="dl">"</span> <span class="o">+</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Brilliant&lt;br&gt;</span><span class="dl">"</span> <span class="o">+</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Awesome engineer</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">39</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Realrocker/cropped(37).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Realrocker</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Once again great service...Thanks&lt;/br&gt;</span><span class="dl">"</span> <span class="o">+</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Great Seller! &lt;br&gt;Exactly as requested, will hire him again and again</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">40</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Ritesh2407/cropped(38).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Ritesh2407</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">I have previously worked with Bishan and he is great Python Guy to go for. &lt;br&gt;Always recommended.&lt;br&gt;</span><span class="dl">"</span> <span class="o">+</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Outstanding Experience!</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">41</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Roverfanclub/cropped(39).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Roverfanclub</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Bhishan provided an excellent programmatic solution in a very short turnaround. &lt;br&gt;Will definitely look to him for solutions to future programming problems. </span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">42</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Samartking/cropped(40).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Samartking</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Great seller! Highly recommended!&lt;br&gt;</span><span class="dl">"</span> <span class="o">+</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">!!!!Outstanding experience!!!!! &lt;br&gt;This seller is a great person and his work is Outstanding! &lt;br&gt;I definitely buy again!</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">43</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Shahaleelal/cropped(41).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Shahaleelal</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">outstanding</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">44</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Somo_king/cropped(42).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Somo_king</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">he is a life saver. thank you</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">45</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Stirling198/cropped(43).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Stirling198</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Outstanding Experience!</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">46</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Subzerom/cropped(44).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Subzerom</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Excellent Seller! Highly Skilled, great communication, very fast</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">47</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Topdrawersrq/cropped(45).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Topdrawersrq</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Outstanding Experience!</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">48</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Vatsaldesai/cropped(46).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Vatsaldesai</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">quick delivery..excellent work</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">49</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Vivekgarg172/cropped(47).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Vivekgarg172</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Outstanding Experience!&lt;br&gt;</span><span class="dl">"</span> <span class="o">+</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Great experience! &lt;br&gt;Bishan is very responsive and quality of work is great.</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">50</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Vseomedia/cropped(48).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Vseomedia</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Great. Several works with him.&lt;br&gt;</span><span class="dl">"</span> <span class="o">+</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">i'll contact him again.&lt;br&gt; Great job as i request it.</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">51</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Webm87/cropped(49).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Webm87</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Outstanding Experience!</span><span class="dl">"</span><span class="p">},</span>
        <span class="p">{</span><span class="na">id</span><span class="p">:</span> <span class="mi">52</span><span class="p">,</span>  <span class="na">shape</span><span class="p">:</span> <span class="dl">'</span><span class="s1">circularImage</span><span class="dl">'</span><span class="p">,</span> <span class="na">image</span><span class="p">:</span> <span class="nx">DIR</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">Xspdo2/cropped(50).png</span><span class="dl">'</span><span class="p">,</span> <span class="na">label</span><span class="p">:</span><span class="dl">"</span><span class="s2">Xspdo2</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">title</span><span class="dl">"</span><span class="p">:</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Excellente!!&lt;br&gt;</span><span class="dl">"</span> <span class="o">+</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Excellente!!&lt;br&gt;</span><span class="dl">"</span> <span class="o">+</span> <span class="nx">ratings</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">Quality Work!! Excelente Dev!</span><span class="dl">"</span><span class="p">},</span>



      <span class="p">];</span>


      <span class="kd">var</span> <span class="nx">container</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">'</span><span class="s1">mynetwork</span><span class="dl">'</span><span class="p">);</span>
      <span class="kd">var</span> <span class="nx">data</span> <span class="o">=</span> <span class="p">{</span>
        <span class="na">nodes</span><span class="p">:</span> <span class="nx">nodes</span><span class="p">,</span>
      <span class="p">};</span>
      <span class="kd">var</span> <span class="nx">options</span> <span class="o">=</span> <span class="p">{</span>
        <span class="na">interaction</span><span class="p">:{</span><span class="na">hover</span><span class="p">:</span><span class="kc">true</span><span class="p">},</span>
        <span class="na">font</span><span class="p">:{</span>
          <span class="na">size</span><span class="p">:</span> <span class="mi">100</span><span class="p">,</span>
        <span class="p">},</span>

        <span class="na">physics</span><span class="p">:</span> <span class="p">{</span>
          <span class="na">barnesHut</span><span class="p">:</span> <span class="p">{</span>
            <span class="na">avoidOverlap</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
            <span class="na">centralGravity</span><span class="p">:</span> <span class="mf">0.2</span><span class="p">,</span>
          <span class="p">},</span>
          <span class="na">repulsion</span><span class="p">:{</span>
            <span class="na">nodeDistance</span><span class="p">:</span> <span class="mi">1000</span><span class="p">,</span>
          <span class="p">},</span>
        <span class="p">},</span>

        <span class="na">nodes</span><span class="p">:</span> <span class="p">{</span>
          <span class="na">size</span><span class="p">:</span><span class="mi">90</span><span class="p">,</span>
            <span class="na">color</span><span class="p">:</span> <span class="p">{</span>
            <span class="na">background</span><span class="p">:</span> <span class="dl">'</span><span class="s1">#006400</span><span class="dl">'</span>
          <span class="p">},</span>
          <span class="na">font</span><span class="p">:{</span><span class="na">color</span><span class="p">:</span><span class="dl">'</span><span class="s1">#eeeeee</span><span class="dl">'</span><span class="p">,</span> <span class="na">size</span><span class="p">:</span> <span class="mi">30</span><span class="p">},</span>
        <span class="p">},</span>

      <span class="p">};</span>
      <span class="nx">network</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">vis</span><span class="p">.</span><span class="nx">Network</span><span class="p">(</span><span class="nx">container</span><span class="p">,</span> <span class="nx">data</span><span class="p">,</span> <span class="nx">options</span><span class="p">);</span>
      <span class="nx">network</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="dl">"</span><span class="s2">click</span><span class="dl">"</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">params</span><span class="p">)</span> <span class="p">{</span>
          <span class="nx">params</span><span class="p">.</span><span class="nx">event</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">[original event]</span><span class="dl">"</span><span class="p">;</span>
 
      <span class="p">});</span>
      <span class="nx">network</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="dl">"</span><span class="s2">hoverNode</span><span class="dl">"</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">params</span><span class="p">)</span> <span class="p">{</span>
          <span class="nx">params</span><span class="p">.</span><span class="nx">event</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">[original event]</span><span class="dl">"</span><span class="p">;</span>

      <span class="p">});</span>

      <span class="nb">window</span><span class="p">.</span><span class="nx">onresize</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span><span class="nx">network</span><span class="p">.</span><span class="nx">fit</span><span class="p">();}</span>

    <span class="p">}</span>
  <span class="nt">&lt;/script&gt;</span>

<span class="nt">&lt;/head&gt;</span>

<span class="nt">&lt;body</span> <span class="na">onload=</span><span class="s">"draw()"</span><span class="nt">&gt;</span>

<span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">"mynetwork"</span><span class="nt">&gt;&lt;/div&gt;</span>

<span class="nt">&lt;/body&gt;</span>
<span class="nt">&lt;/html&gt;</span>
</code></pre></div></div>

<p>I post awesome content on programming tutorials and computer science in general. Subscribe to never miss an article and programming resources.</p>]]></content><author><name>Bhishan Bhandari</name><email>bhishan.bhandari@yaypply.com, bbhishan@gmail.com</email></author><category term="JavaScript" /><category term="Visualization" /><category term="VisJS" /><category term="Web Development" /><summary type="html"><![CDATA[The intentions of this post is to host example code snippets so people can take ideas from it to make great visualization for themselves using visJS. VisJS is a dynamic, browser based visualization library. The library is designed to be easy to use, to handle large amounts of dynamic data, and to enable manipulation of and interaction with the data. The library consists of the components DataSet, Timeline, Network, Graph2d and Graph3d.]]></summary></entry><entry><title type="html">Web Scraping with NodeJS and Cheerio</title><link href="https://bhishan.github.io/posts/2018/08/nodejs-web-scraping/" rel="alternate" type="text/html" title="Web Scraping with NodeJS and Cheerio" /><published>2018-08-17T00:00:00+00:00</published><updated>2018-08-17T00:00:00+00:00</updated><id>https://bhishan.github.io/posts/2018/08/web-scraping-with-nodejs</id><content type="html" xml:base="https://bhishan.github.io/posts/2018/08/nodejs-web-scraping/"><![CDATA[<p>Web Scraping has been of an interest to a lot of businesses and individuals with the immense potential of the quantitative data available online. The data collected can entice the growth of an organization or a personal business. Through this post, we will see through examples on how NodeJS can be used to scrape content from a website. The intentions of this post is to host example code snippets so people can take ideas from it to build scrapers as per their needs using cheerio module in NodeJS. I will be using github’s trending page https://github.com/trending throughout this post for the examples, especially because it best suits for applying various cheerio methods.</p>

<h2 id="installation">Installation</h2>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>npm install --save promise request-promise cheerio
</code></pre></div></div>

<h2 id="get-html-of-a-page">Get html of a page:</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">var</span> <span class="nb">Promise</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="dl">"</span><span class="s2">promise</span><span class="dl">"</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">request</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="dl">"</span><span class="s2">request-promise</span><span class="dl">"</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">cheerio</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="dl">"</span><span class="s2">cheerio</span><span class="dl">"</span><span class="p">);</span>

<span class="kd">function</span> <span class="nx">getHtml</span><span class="p">(){</span>
    <span class="k">return</span> <span class="k">new</span> <span class="nb">Promise</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">resolve</span><span class="p">,</span> <span class="nx">reject</span><span class="p">){</span>
        <span class="nx">request</span><span class="p">(</span><span class="dl">"</span><span class="s2">https://github.com/trending</span><span class="dl">"</span><span class="p">)</span>
            <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">cheerio</span><span class="p">.</span><span class="nx">load</span><span class="p">)</span>
            <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">)</span>
            <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">resolve</span><span class="p">)</span>
            <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">reject</span><span class="p">)</span>
    <span class="p">});</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="using-cheerio-to-get-title-from-a-page">Using cheerio to get title from a page</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nx">getHtml</span><span class="p">(){</span>
    <span class="k">return</span> <span class="k">new</span> <span class="nb">Promise</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">resolve</span><span class="p">,</span> <span class="nx">reject</span><span class="p">){</span>
        <span class="nx">request</span><span class="p">(</span><span class="dl">"</span><span class="s2">https://github.com/trending</span><span class="dl">"</span><span class="p">)</span>
            <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">cheerio</span><span class="p">.</span><span class="nx">load</span><span class="p">,</span> <span class="nx">requestError</span><span class="p">)</span>
            <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">scrapeContent</span><span class="p">)</span>
            <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">resolve</span><span class="p">)</span>
            <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">reject</span><span class="p">)</span>
    <span class="p">});</span>
<span class="p">}</span>


<span class="kd">function</span> <span class="nx">scrapeContent</span><span class="p">(</span><span class="nx">$</span><span class="p">){</span>
    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">$</span><span class="p">(</span><span class="dl">'</span><span class="s1">title</span><span class="dl">'</span><span class="p">).</span><span class="nx">text</span><span class="p">());</span>
<span class="p">}</span>

<span class="kd">function</span> <span class="nx">requestError</span><span class="p">()</span> <span class="p">{</span>
    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">The trending page could not be loaded!</span><span class="dl">"</span><span class="p">);</span>
    <span class="k">throw</span> <span class="nb">Error</span><span class="p">(</span><span class="dl">"</span><span class="s2">Could not fetch html!</span><span class="dl">"</span><span class="p">);</span>

<span class="p">}</span>


<span class="nx">getHtml</span><span class="p">();</span>
</code></pre></div></div>

<h2 id="find-single-element-by-tag-name-find-multiple-elements-by-tag-name">Find single element by tag name, find multiple elements by tag name</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nx">getHtml</span><span class="p">(){</span>
    <span class="k">return</span> <span class="k">new</span> <span class="nb">Promise</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">resolve</span><span class="p">,</span> <span class="nx">reject</span><span class="p">){</span>
        <span class="nx">request</span><span class="p">(</span><span class="dl">"</span><span class="s2">https://github.com/trending</span><span class="dl">"</span><span class="p">)</span>
            <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">cheerio</span><span class="p">.</span><span class="nx">load</span><span class="p">,</span> <span class="nx">requestError</span><span class="p">)</span>
            <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">scrapeContent</span><span class="p">)</span>
            <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">resolve</span><span class="p">)</span>
            <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">reject</span><span class="p">)</span>
    <span class="p">});</span>
<span class="p">}</span>


<span class="kd">function</span> <span class="nx">scrapeContent</span><span class="p">(</span><span class="nx">$</span><span class="p">){</span>
    <span class="c1">//console.log($);</span>
    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">$</span><span class="p">(</span><span class="dl">'</span><span class="s1">title</span><span class="dl">'</span><span class="p">).</span><span class="nx">text</span><span class="p">());</span>
    <span class="kd">var</span> <span class="nx">all_li_elements</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="dl">'</span><span class="s1">ol</span><span class="dl">'</span><span class="p">).</span><span class="nx">find</span><span class="p">(</span><span class="dl">'</span><span class="s1">li</span><span class="dl">'</span><span class="p">);</span>
    <span class="nx">all_li_elements</span><span class="p">.</span><span class="nx">each</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">item</span><span class="p">){</span>
        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">$</span><span class="p">(</span><span class="k">this</span><span class="p">).</span><span class="nx">find</span><span class="p">(</span><span class="dl">'</span><span class="s1">h3</span><span class="dl">'</span><span class="p">).</span><span class="nx">text</span><span class="p">().</span><span class="nx">trim</span><span class="p">());</span>
    <span class="p">});</span>
    
<span class="p">}</span>

<span class="kd">function</span> <span class="nx">requestError</span><span class="p">()</span> <span class="p">{</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">The trending page could not be loaded!</span><span class="dl">"</span><span class="p">);</span>
<span class="k">throw</span> <span class="nb">Error</span><span class="p">(</span><span class="dl">"</span><span class="s2">Could not fetch html!</span><span class="dl">"</span><span class="p">);</span>
<span class="p">}</span>


<span class="nx">getHtml</span><span class="p">();</span>
</code></pre></div></div>

<p><strong>Output</strong></p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Trending repositories on GitHub today · GitHub
Microsoft / FASTER
MichaelMure / git-bug
google / python-fire
Droogans / unmaintainable-code
Avik-Jain / 100-Days-Of-ML-Code
pwxcoo / chinese-xinhua
JuliaLang / julia
r-spacex / SpaceX-API
IEEEKeralaSection / rescuekerala
react-tools / react-move
imhuay / Interview_Notes-Chinese
crossoverJie / JCSprout
benhoyt / goawk
salesforce / TransmogrifAI
Jeffail / benthos
aykevl / tinygo
astorfi / Deep-Learning-World
vuejs / vue
firehol / netdata
loveRandy / vue-cli3.0-vueadmin
trekhleb / javascript-algorithms
palmerhq / react-async-elements
messeb / ios-project-env-setup
jianstm / Schedule
kholia / OSX-KVM
</code></pre></div></div>

<h2 id="getting-attributes-of-an-element">Getting Attributes of an element</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nx">getHtml</span><span class="p">(){</span>
    <span class="k">return</span> <span class="k">new</span> <span class="nb">Promise</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">resolve</span><span class="p">,</span> <span class="nx">reject</span><span class="p">){</span>
        <span class="nx">request</span><span class="p">(</span><span class="dl">"</span><span class="s2">https://github.com/trending</span><span class="dl">"</span><span class="p">)</span>
            <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">cheerio</span><span class="p">.</span><span class="nx">load</span><span class="p">,</span> <span class="nx">requestError</span><span class="p">)</span>
            <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">scrapeContent</span><span class="p">)</span>
            <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">resolve</span><span class="p">)</span>
            <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">reject</span><span class="p">)</span>
    <span class="p">});</span>
<span class="p">}</span>


<span class="kd">function</span> <span class="nx">scrapeContent</span><span class="p">(</span><span class="nx">$</span><span class="p">){</span>
    <span class="c1">//console.log($);</span>
    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">$</span><span class="p">(</span><span class="dl">'</span><span class="s1">title</span><span class="dl">'</span><span class="p">).</span><span class="nx">text</span><span class="p">());</span>
    <span class="kd">var</span> <span class="nx">all_li_elements</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="dl">'</span><span class="s1">ol</span><span class="dl">'</span><span class="p">).</span><span class="nx">find</span><span class="p">(</span><span class="dl">'</span><span class="s1">li</span><span class="dl">'</span><span class="p">);</span>
    <span class="nx">all_li_elements</span><span class="p">.</span><span class="nx">each</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">item</span><span class="p">){</span>
        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">https://github.com/</span><span class="dl">"</span> <span class="o">+</span> <span class="nx">$</span><span class="p">(</span><span class="k">this</span><span class="p">).</span><span class="nx">find</span><span class="p">(</span><span class="dl">'</span><span class="s1">a</span><span class="dl">'</span><span class="p">).</span><span class="nx">attr</span><span class="p">(</span><span class="dl">'</span><span class="s1">href</span><span class="dl">'</span><span class="p">));</span>
    <span class="p">});</span>
<span class="p">}</span>

<span class="kd">function</span> <span class="nx">requestError</span><span class="p">()</span> <span class="p">{</span>
    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">The trending page could not be loaded!</span><span class="dl">"</span><span class="p">);</span>
    <span class="k">throw</span> <span class="nb">Error</span><span class="p">(</span><span class="dl">"</span><span class="s2">Could not fetch html!</span><span class="dl">"</span><span class="p">);</span>

<span class="p">}</span>


<span class="nx">getHtml</span><span class="p">();</span>
</code></pre></div></div>

<p><strong>Output</strong></p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Trending repositories on GitHub today · GitHub
https://github.com//Microsoft/FASTER
https://github.com//MichaelMure/git-bug
https://github.com//google/python-fire
https://github.com//Droogans/unmaintainable-code
https://github.com//Avik-Jain/100-Days-Of-ML-Code
https://github.com//pwxcoo/chinese-xinhua
https://github.com//JuliaLang/julia
https://github.com//r-spacex/SpaceX-API
https://github.com//IEEEKeralaSection/rescuekerala
https://github.com//react-tools/react-move
https://github.com//imhuay/Interview_Notes-Chinese
https://github.com//crossoverJie/JCSprout
https://github.com//benhoyt/goawk
https://github.com//salesforce/TransmogrifAI
https://github.com//Jeffail/benthos
https://github.com//aykevl/tinygo
https://github.com//astorfi/Deep-Learning-World
https://github.com//vuejs/vue
https://github.com//firehol/netdata
https://github.com//loveRandy/vue-cli3.0-vueadmin
https://github.com//trekhleb/javascript-algorithms
https://github.com//palmerhq/react-async-elements
https://github.com//messeb/ios-project-env-setup
https://github.com//jianstm/Schedule
https://github.com//kholia/OSX-KVM
</code></pre></div></div>

<h2 id="using-class-name-or-other-attributes-to-get-element">Using class name or other attributes to get element</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nx">getHtml</span><span class="p">(){</span>
    <span class="k">return</span> <span class="k">new</span> <span class="nb">Promise</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">resolve</span><span class="p">,</span> <span class="nx">reject</span><span class="p">){</span>
        <span class="nx">request</span><span class="p">(</span><span class="dl">"</span><span class="s2">https://github.com/trending</span><span class="dl">"</span><span class="p">)</span>
            <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">cheerio</span><span class="p">.</span><span class="nx">load</span><span class="p">,</span> <span class="nx">requestError</span><span class="p">)</span>
            <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">scrapeContent</span><span class="p">)</span>
            <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">resolve</span><span class="p">)</span>
            <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">reject</span><span class="p">)</span>
    <span class="p">});</span>
<span class="p">}</span>


<span class="kd">function</span> <span class="nx">scrapeContent</span><span class="p">(</span><span class="nx">$</span><span class="p">){</span>
    <span class="c1">//console.log($);</span>
    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">$</span><span class="p">(</span><span class="dl">'</span><span class="s1">title</span><span class="dl">'</span><span class="p">).</span><span class="nx">text</span><span class="p">());</span>
    <span class="kd">var</span> <span class="nx">all_li_elements</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="dl">'</span><span class="s1">ol</span><span class="dl">'</span><span class="p">).</span><span class="nx">find</span><span class="p">(</span><span class="dl">'</span><span class="s1">li</span><span class="dl">'</span><span class="p">);</span>
    <span class="nx">all_li_elements</span><span class="p">.</span><span class="nx">each</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">item</span><span class="p">){</span>
        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">$</span><span class="p">(</span><span class="k">this</span><span class="p">).</span><span class="nx">find</span><span class="p">(</span><span class="dl">'</span><span class="s1">.float-sm-right</span><span class="dl">'</span><span class="p">).</span><span class="nx">text</span><span class="p">().</span><span class="nx">trim</span><span class="p">());</span>
    <span class="p">});</span>
<span class="p">}</span>

<span class="kd">function</span> <span class="nx">requestError</span><span class="p">()</span> <span class="p">{</span>
    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">The trending page could not be loaded!</span><span class="dl">"</span><span class="p">);</span>
    <span class="k">throw</span> <span class="nb">Error</span><span class="p">(</span><span class="dl">"</span><span class="s2">Could not fetch html!</span><span class="dl">"</span><span class="p">);</span>

<span class="p">}</span>


<span class="nx">getHtml</span><span class="p">();</span>
</code></pre></div></div>

<p><strong>Output</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Trending  repositories on GitHub today · GitHubAsset 1Asset 1
880 stars today
744 stars today
614 stars today
311 stars today
191 stars today
182 stars today
178 stars today
179 stars today
103 stars today
152 stars today
134 stars today
129 stars today
128 stars today
126 stars today
125 stars today
122 stars today
104 stars today
99 stars today
107 stars today
108 stars today
101 stars today
102 stars today
89 stars today
88 stars today
76 stars today
</code></pre></div></div>

<h2 id="navigate-childrens-from-an-element">Navigate childrens from an element</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nx">getHtml</span><span class="p">(){</span>
    <span class="k">return</span> <span class="k">new</span> <span class="nb">Promise</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">resolve</span><span class="p">,</span> <span class="nx">reject</span><span class="p">){</span>
        <span class="nx">request</span><span class="p">(</span><span class="dl">"</span><span class="s2">https://github.com/trending</span><span class="dl">"</span><span class="p">)</span>
            <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">cheerio</span><span class="p">.</span><span class="nx">load</span><span class="p">,</span> <span class="nx">requestError</span><span class="p">)</span>
            <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">scrapeContent</span><span class="p">)</span>
            <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">resolve</span><span class="p">)</span>
            <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">reject</span><span class="p">)</span>
    <span class="p">});</span>
<span class="p">}</span>


<span class="kd">function</span> <span class="nx">scrapeContent</span><span class="p">(</span><span class="nx">$</span><span class="p">){</span>
    <span class="c1">//console.log($);</span>
    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">$</span><span class="p">(</span><span class="dl">'</span><span class="s1">title</span><span class="dl">'</span><span class="p">).</span><span class="nx">text</span><span class="p">());</span>
    <span class="kd">var</span> <span class="nx">all_li_elements</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="dl">'</span><span class="s1">ol</span><span class="dl">'</span><span class="p">).</span><span class="nx">children</span><span class="p">();</span> <span class="c1">// using children()</span>
    <span class="nx">all_li_elements</span><span class="p">.</span><span class="nx">each</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">item</span><span class="p">){</span>
        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">$</span><span class="p">(</span><span class="k">this</span><span class="p">).</span><span class="nx">find</span><span class="p">(</span><span class="dl">'</span><span class="s1">h3</span><span class="dl">'</span><span class="p">).</span><span class="nx">text</span><span class="p">().</span><span class="nx">trim</span><span class="p">());</span>
    <span class="p">});</span>
<span class="p">}</span>

<span class="kd">function</span> <span class="nx">requestError</span><span class="p">()</span> <span class="p">{</span>
    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">The trending page could not be loaded!</span><span class="dl">"</span><span class="p">);</span>
    <span class="k">throw</span> <span class="nb">Error</span><span class="p">(</span><span class="dl">"</span><span class="s2">Could not fetch html!</span><span class="dl">"</span><span class="p">);</span>

<span class="p">}</span>


<span class="nx">getHtml</span><span class="p">();</span>
</code></pre></div></div>

<p><strong>Output</strong></p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Trending repositories on GitHub today · GitHub
Microsoft / FASTER
MichaelMure / git-bug
google / python-fire
Droogans / unmaintainable-code
Avik-Jain / 100-Days-Of-ML-Code
pwxcoo / chinese-xinhua
JuliaLang / julia
r-spacex / SpaceX-API
IEEEKeralaSection / rescuekerala
react-tools / react-move
imhuay / Interview_Notes-Chinese
crossoverJie / JCSprout
benhoyt / goawk
salesforce / TransmogrifAI
Jeffail / benthos
aykevl / tinygo
astorfi / Deep-Learning-World
vuejs / vue
firehol / netdata
loveRandy / vue-cli3.0-vueadmin
trekhleb / javascript-algorithms
palmerhq / react-async-elements
messeb / ios-project-env-setup
jianstm / Schedule
kholia / OSX-KVM
</code></pre></div></div>

<p>The .children will only return the immediate childrens of the parent element.</p>

<h2 id="navigating-previous-and-next-siblings-of-an-element">Navigating previous and next siblings of an element</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nx">getHtml</span><span class="p">(){</span>
    <span class="k">return</span> <span class="k">new</span> <span class="nb">Promise</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">resolve</span><span class="p">,</span> <span class="nx">reject</span><span class="p">){</span>
        <span class="nx">request</span><span class="p">(</span><span class="dl">"</span><span class="s2">https://github.com/trending</span><span class="dl">"</span><span class="p">)</span>
            <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">cheerio</span><span class="p">.</span><span class="nx">load</span><span class="p">,</span> <span class="nx">requestError</span><span class="p">)</span>
            <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">scrapeContent</span><span class="p">)</span>
            <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">resolve</span><span class="p">)</span>
            <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">reject</span><span class="p">)</span>
    <span class="p">});</span>
<span class="p">}</span>


<span class="kd">function</span> <span class="nx">scrapeContent</span><span class="p">(</span><span class="nx">$</span><span class="p">){</span>
    <span class="c1">//console.log($);</span>
    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">$</span><span class="p">(</span><span class="dl">'</span><span class="s1">title</span><span class="dl">'</span><span class="p">).</span><span class="nx">text</span><span class="p">());</span>
    <span class="kd">var</span> <span class="nx">fifth_li_element</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="dl">'</span><span class="s1">ol</span><span class="dl">'</span><span class="p">).</span><span class="nx">find</span><span class="p">(</span><span class="dl">'</span><span class="s1">li</span><span class="dl">'</span><span class="p">).</span><span class="nx">eq</span><span class="p">(</span><span class="mi">4</span><span class="p">);</span> <span class="c1">// use eq(index) to access via indices.</span>
    <span class="kd">var</span> <span class="nx">fourth_li_element</span> <span class="o">=</span> <span class="nx">fifth_li_element</span><span class="p">.</span><span class="nx">prev</span><span class="p">();</span> <span class="c1">// previous sibling</span>
    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">fourth_li_element</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="dl">'</span><span class="s1">h3</span><span class="dl">'</span><span class="p">).</span><span class="nx">text</span><span class="p">().</span><span class="nx">trim</span><span class="p">());</span>
    <span class="kd">var</span> <span class="nx">sixth_li_element</span> <span class="o">=</span> <span class="nx">fifth_li_element</span><span class="p">.</span><span class="nx">next</span><span class="p">();</span> <span class="c1">// next sibling</span>
    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">sixth_li_element</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="dl">'</span><span class="s1">h3</span><span class="dl">'</span><span class="p">).</span><span class="nx">text</span><span class="p">().</span><span class="nx">trim</span><span class="p">());</span>
<span class="p">}</span>

<span class="kd">function</span> <span class="nx">requestError</span><span class="p">()</span> <span class="p">{</span>
    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">The trending page could not be loaded!</span><span class="dl">"</span><span class="p">);</span>
    <span class="k">throw</span> <span class="nb">Error</span><span class="p">(</span><span class="dl">"</span><span class="s2">Could not fetch html!</span><span class="dl">"</span><span class="p">);</span>

<span class="p">}</span>


<span class="nx">getHtml</span><span class="p">();</span>
</code></pre></div></div>

<h2 id="putting-it-all-togethergithub-trending-scraper">Putting it all together(Github Trending Scraper)</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nx">getHtml</span><span class="p">(){</span>
    <span class="k">return</span> <span class="k">new</span> <span class="nb">Promise</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">resolve</span><span class="p">,</span> <span class="nx">reject</span><span class="p">){</span>
        <span class="nx">request</span><span class="p">(</span><span class="dl">"</span><span class="s2">https://github.com/trending</span><span class="dl">"</span><span class="p">)</span>
            <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">cheerio</span><span class="p">.</span><span class="nx">load</span><span class="p">,</span> <span class="nx">requestError</span><span class="p">)</span>
            <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">scrapeContent</span><span class="p">)</span>
            <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">resolve</span><span class="p">)</span>
            <span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">reject</span><span class="p">)</span>
    <span class="p">});</span>
<span class="p">}</span>


<span class="kd">function</span> <span class="nx">scrapeContent</span><span class="p">(</span><span class="nx">$</span><span class="p">){</span>
    <span class="c1">//console.log($);</span>
    <span class="kd">var</span> <span class="nx">all_li_elements</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="dl">'</span><span class="s1">ol</span><span class="dl">'</span><span class="p">).</span><span class="nx">find</span><span class="p">(</span><span class="dl">'</span><span class="s1">li</span><span class="dl">'</span><span class="p">);</span>
    <span class="nx">all_li_elements</span><span class="p">.</span><span class="nx">each</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">item</span><span class="p">){</span>
        <span class="nx">repository_name</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="k">this</span><span class="p">).</span><span class="nx">find</span><span class="p">(</span><span class="dl">'</span><span class="s1">h3</span><span class="dl">'</span><span class="p">).</span><span class="nx">text</span><span class="p">().</span><span class="nx">trim</span><span class="p">();</span>
        <span class="nx">total_stars_today</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="k">this</span><span class="p">).</span><span class="nx">find</span><span class="p">(</span><span class="dl">'</span><span class="s1">.float-sm-right</span><span class="dl">'</span><span class="p">).</span><span class="nx">text</span><span class="p">().</span><span class="nx">trim</span><span class="p">();</span>
        <span class="nx">repository_url</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">https://github.com/</span><span class="dl">'</span> <span class="o">+</span> <span class="nx">$</span><span class="p">(</span><span class="k">this</span><span class="p">).</span><span class="nx">find</span><span class="p">(</span><span class="dl">'</span><span class="s1">a</span><span class="dl">'</span><span class="p">).</span><span class="nx">attr</span><span class="p">(</span><span class="dl">'</span><span class="s1">href</span><span class="dl">'</span><span class="p">);</span>
        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">repository_name</span><span class="p">,</span> <span class="dl">"</span><span class="se">\t</span><span class="dl">"</span><span class="p">,</span> <span class="nx">total_stars_today</span><span class="p">,</span> <span class="dl">"</span><span class="se">\t</span><span class="dl">"</span><span class="p">,</span> <span class="nx">repository_url</span><span class="p">);</span>
    <span class="p">});</span>
<span class="p">}</span>

<span class="kd">function</span> <span class="nx">requestError</span><span class="p">()</span> <span class="p">{</span>
    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">The trending page could not be loaded!</span><span class="dl">"</span><span class="p">);</span>
    <span class="k">throw</span> <span class="nb">Error</span><span class="p">(</span><span class="dl">"</span><span class="s2">Could not fetch html!</span><span class="dl">"</span><span class="p">);</span>

<span class="p">}</span>

<span class="nx">getHtml</span><span class="p">();</span>
</code></pre></div></div>

<p><strong>Output</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Microsoft / FASTER                946 stars today      https://github.com//Microsoft/FASTER
google / python-fire              647 stars today      https://github.com//google/python-fire
MichaelMure / git-bug             578 stars today      https://github.com//MichaelMure/git-bug
Droogans / unmaintainable-code    228 stars today      https://github.com//Droogans/unmaintainable-code
pwxcoo / chinese-xinhua           198 stars today      https://github.com//pwxcoo/chinese-xinhua
Avik-Jain / 100-Days-Of-ML-Code   188 stars today      https://github.com//Avik-Jain/100-Days-Of-ML-Code
JuliaLang / julia                 170 stars today      https://github.com//JuliaLang/julia
aykevl / tinygo                   169 stars today      https://github.com//aykevl/tinygo
IEEEKeralaSection / rescuekerala  96 stars today       https://github.com//IEEEKeralaSection/rescuekerala
benhoyt / goawk                   152 stars today      https://github.com//benhoyt/goawk
r-spacex / SpaceX-API             150 stars today      https://github.com//r-spacex/SpaceX-API
crossoverJie / JCSprout           129 stars today      https://github.com//crossoverJie/JCSprout
imhuay / Interview_Notes-Chinese  121 stars today      https://github.com//imhuay/Interview_Notes-Chinese
trekhleb / javascript-algorithms  113 stars today      https://github.com//trekhleb/javascript-algorithms
salesforce / TransmogrifAI        107 stars today      https://github.com//salesforce/TransmogrifAI
loveRandy / vue-cli3.0-vueadmin   110 stars today      https://github.com//loveRandy/vue-cli3.0-vueadmin
astorfi / Deep-Learning-World     102 stars today      https://github.com//astorfi/Deep-Learning-World
vuejs / vue                       97 stars today       https://github.com//vuejs/vue
Jeffail / benthos                 104 stars today      https://github.com//Jeffail/benthos
palmerhq / react-async-elements   92 stars today       https://github.com//palmerhq/react-async-elements
firehol / netdata                 89 stars today       https://github.com//firehol/netdata
jesseduffield / lazygit           84 stars today       https://github.com//jesseduffield/lazygit
jianstm / Schedule                75 stars today       https://github.com//jianstm/Schedule
shadowsocks/shadowsocks-windows   67 stars today       https://github.com//shadowsocks/shadowsocks-windows
mawww / kakoune                   71 stars today       https://github.com//mawww/kakoune
</code></pre></div></div>

<p>There is another version of this article using same set of examples using BeautifulSoup in Python. You should read it too. https://www.thetaranights.com/web-scraping-beautifulsoup-python/</p>]]></content><author><name>Bhishan Bhandari</name><email>bhishan.bhandari@yaypply.com, bbhishan@gmail.com</email></author><category term="NodeJS" /><category term="Web Scraping" /><category term="Cheerio" /><category term="JavaScript" /><summary type="html"><![CDATA[Web Scraping has been of an interest to a lot of businesses and individuals with the immense potential of the quantitative data available online. The data collected can entice the growth of an organization or a personal business. Through this post, we will see through examples on how NodeJS can be used to scrape content from a website. The intentions of this post is to host example code snippets so people can take ideas from it to build scrapers as per their needs using cheerio module in NodeJS. I will be using github’s trending page https://github.com/trending throughout this post for the examples, especially because it best suits for applying various cheerio methods.]]></summary></entry><entry><title type="html">Google APIs and Python – Part II</title><link href="https://bhishan.github.io/posts/2018/08/google-apis-and-python-part-2/" rel="alternate" type="text/html" title="Google APIs and Python – Part II" /><published>2018-08-16T00:00:00+00:00</published><updated>2018-08-16T00:00:00+00:00</updated><id>https://bhishan.github.io/posts/2018/08/google-apis-and-python-part-2</id><content type="html" xml:base="https://bhishan.github.io/posts/2018/08/google-apis-and-python-part-2/"><![CDATA[<p>Google services are cool and you can build products and services around it. We will see through examples how you can use various google services such as spreadsheet, slides and drive through Python. I hope people can take ideas from the following example to do amazing stuffs with Google services. There is a part one to this article where I walked through procedure to enable Google APIs, installation of required packages in Python, authentication and demonstrated individual examples of Sheets, Drive and Slides API. https://www.thetaranights.com/brief-introduction-to-google-apissheets-slides-drive/ . In this article however, we will integrate Sheets, Drive and Slides API altogether.</p>

<h2 id="the-idea">The Idea</h2>
<p>We will use data from a sheet which contains some statistics about a few applications/websites. The end goal is to create a presentation slide, add a background image to it, add content from the sheet to the slide and also some other cool stuffs. All the resources used in the following examples are public so you can follow along.</p>

<p>I will be using following resources throughout the example</p>

<p>Presentation Template https://docs.google.com/presentation/d/1wLimfuGw1pqZZJvkc15lOfD7LSEAWCjuIlhbrOaiulE/edit?usp=sharing
Background Images
https://drive.google.com/file/d/0B54qUrMD2GDIa2syZWF3OE5xSUk/view?usp=sharing
https://drive.google.com/file/d/1riNC6PykmjmokXa1My3KyseoKO8MrZGI/view?usp=sharing
https://drive.google.com/file/d/10RUMiifQ7XQn88kSaDy2G83U5sjTeyBS/view?usp=sharing
https://drive.google.com/file/d/1hc8UOmxbFzAS7IaASRZwOftnBBRfBjIs/view?usp=sharing
Spreadsheet https://docs.google.com/spreadsheets/d/1xpjQkF692lNnTsfOckVll2OPTa659ZCuK3JezDSkris/edit?usp=sharing</p>

<h2 id="create-presentation-slides-from-sheets-data-and-drive-images-using-python">Create Presentation Slides from Sheets data and Drive images using Python</h2>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">googleapiclient</span> <span class="kn">import</span> <span class="n">discovery</span>
<span class="kn">from</span> <span class="nn">httplib2</span> <span class="kn">import</span> <span class="n">Http</span>
<span class="kn">from</span> <span class="nn">oauth2client</span> <span class="kn">import</span> <span class="nb">file</span><span class="p">,</span> <span class="n">client</span><span class="p">,</span> <span class="n">tools</span>

<span class="n">TEMPLATE_FILE</span> <span class="o">=</span> <span class="s">"TEM_F"</span>

<span class="n">SCOPES</span> <span class="o">=</span> <span class="p">(</span><span class="s">'https://www.googleapis.com/auth/spreadsheets'</span><span class="p">,</span><span class="s">'https://www.googleapis.com/auth/drive'</span><span class="p">)</span>

<span class="n">CLIENT_SECRET</span> <span class="o">=</span> <span class="s">'client_secret_760822340075-i0ark1h51pnbhii5dgafug3k4g1nodb8.apps.googleusercontent.com.json'</span> <span class="c1"># download from google console after activating apis
</span>
<span class="n">store</span> <span class="o">=</span> <span class="nb">file</span><span class="p">.</span><span class="n">Storage</span><span class="p">(</span><span class="s">'storage.json'</span><span class="p">)</span> <span class="c1"># doesn't matter if not present, you will be prompted to accept access to google resources on your account and a token will be generated that is stored inside storage.json with requested previliges.
</span>
<span class="n">credz</span> <span class="o">=</span> <span class="n">store</span><span class="p">.</span><span class="n">get</span><span class="p">()</span>

<span class="k">if</span> <span class="ow">not</span> <span class="n">credz</span> <span class="ow">or</span> <span class="n">credz</span><span class="p">.</span><span class="n">invalid</span><span class="p">:</span>
    <span class="n">flow</span> <span class="o">=</span> <span class="n">client</span><span class="p">.</span><span class="n">flow_from_clientsecrets</span><span class="p">(</span><span class="n">CLIENT_SECRET</span><span class="p">,</span> <span class="n">SCOPES</span><span class="p">)</span>
    <span class="n">credz</span> <span class="o">=</span> <span class="n">tools</span><span class="p">.</span><span class="n">run_flow</span><span class="p">(</span><span class="n">flow</span><span class="p">,</span> <span class="n">store</span><span class="p">)</span>

<span class="n">HTTP</span> <span class="o">=</span> <span class="n">credz</span><span class="p">.</span><span class="n">authorize</span><span class="p">(</span><span class="n">Http</span><span class="p">())</span>

<span class="n">SHEETS</span> <span class="o">=</span> <span class="n">discovery</span><span class="p">.</span><span class="n">build</span><span class="p">(</span><span class="s">'sheets'</span><span class="p">,</span> <span class="s">'v4'</span><span class="p">,</span> <span class="n">http</span><span class="o">=</span><span class="n">HTTP</span><span class="p">)</span>

<span class="n">SLIDES</span> <span class="o">=</span> <span class="n">discovery</span><span class="p">.</span><span class="n">build</span><span class="p">(</span><span class="s">'slides'</span><span class="p">,</span> <span class="s">'v1'</span><span class="p">,</span> <span class="n">http</span><span class="o">=</span><span class="n">HTTP</span><span class="p">)</span>

<span class="n">DRIVE</span> <span class="o">=</span> <span class="n">discovery</span><span class="p">.</span><span class="n">build</span><span class="p">(</span><span class="s">'drive'</span><span class="p">,</span> <span class="s">'v3'</span><span class="p">,</span> <span class="n">http</span><span class="o">=</span><span class="n">HTTP</span><span class="p">)</span>


<span class="n">presentation_template_file_id</span> <span class="o">=</span> <span class="s">"1wLimfuGw1pqZZJvkc15lOfD7LSEAWCjuIlhbrOaiulE"</span> <span class="c1"># the template has been made public.
# name of the presentation file
</span><span class="n">DATA</span> <span class="o">=</span> <span class="p">{</span><span class="s">'name'</span><span class="p">:</span><span class="s">'MobileApplicationsReport'</span><span class="p">}</span>

<span class="n">PRESENTATION_ID</span> <span class="o">=</span> <span class="n">DRIVE</span><span class="p">.</span><span class="n">files</span><span class="p">().</span><span class="n">copy</span><span class="p">(</span><span class="n">body</span><span class="o">=</span><span class="n">DATA</span><span class="p">,</span> <span class="n">fileId</span><span class="o">=</span><span class="s">"1wLimfuGw1pqZZJvkc15lOfD7LSEAWCjuIlhbrOaiulE"</span><span class="p">).</span><span class="n">execute</span><span class="p">()[</span><span class="s">'id'</span><span class="p">]</span>
<span class="k">print</span><span class="p">(</span><span class="n">PRESENTATION_ID</span><span class="p">)</span>

<span class="n">sheet_ID</span> <span class="o">=</span> <span class="s">'1xpjQkF692lNnTsfOckVll2OPTa659ZCuK3JezDSkris'</span> <span class="c1"># the sheet where we fetch data from to populate to the slides.
</span>
<span class="n">application_statistics</span> <span class="o">=</span> <span class="n">SHEETS</span><span class="p">.</span><span class="n">spreadsheets</span><span class="p">().</span><span class="n">values</span><span class="p">().</span><span class="n">get</span><span class="p">(</span><span class="nb">range</span><span class="o">=</span><span class="s">'Sheet1'</span><span class="p">,</span> <span class="n">spreadsheetId</span><span class="o">=</span><span class="n">sheet_ID</span><span class="p">).</span><span class="n">execute</span><span class="p">().</span><span class="n">get</span><span class="p">(</span><span class="s">'values'</span><span class="p">)</span> <span class="c1"># all the data from the sheet as lists including headers.
</span>
<span class="k">print</span><span class="p">(</span><span class="n">application_statistics</span><span class="p">)</span>

<span class="n">presentation_details</span> <span class="o">=</span> <span class="n">SLIDES</span><span class="p">.</span><span class="n">presentations</span><span class="p">().</span><span class="n">get</span><span class="p">(</span><span class="n">presentationId</span><span class="o">=</span><span class="n">PRESENTATION_ID</span><span class="p">).</span><span class="n">execute</span><span class="p">()</span>

<span class="n">slides_data</span> <span class="o">=</span> <span class="n">presentation_details</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="s">'slides'</span><span class="p">,</span> <span class="p">[])[</span><span class="mi">0</span><span class="p">]</span>

<span class="n">page_id</span> <span class="o">=</span> <span class="n">slides_data</span><span class="p">[</span><span class="s">'objectId'</span><span class="p">]</span> <span class="c1"># page id of the first slide of the presentation.
</span>
<span class="k">for</span> <span class="n">each_data</span> <span class="ow">in</span> <span class="n">application_statistics</span><span class="p">[</span><span class="mi">1</span><span class="p">:]:</span> <span class="c1"># skip the headers.
</span>    <span class="c1"># duplicate slide for the next cycle before replacing content on a slide since we are using method of replacing text from the slide to populate data.
</span>    <span class="n">reqs</span> <span class="o">=</span> <span class="p">[{</span><span class="s">"duplicateObject"</span><span class="p">:</span> <span class="p">{</span><span class="s">"objectId"</span><span class="p">:</span> <span class="n">page_id</span><span class="p">}}]</span>
    <span class="n">copy_slide_rsp</span> <span class="o">=</span> <span class="n">SLIDES</span><span class="p">.</span><span class="n">presentations</span><span class="p">().</span><span class="n">batchUpdate</span><span class="p">(</span><span class="n">body</span><span class="o">=</span><span class="p">{</span><span class="s">'requests'</span><span class="p">:</span><span class="n">reqs</span><span class="p">},</span> <span class="n">presentationId</span><span class="o">=</span><span class="n">PRESENTATION_ID</span><span class="p">).</span><span class="n">execute</span><span class="p">()</span>
    
    <span class="n">IMG_ID</span> <span class="o">=</span> <span class="n">each_data</span><span class="p">[</span><span class="mi">10</span><span class="p">]</span> <span class="c1"># the id of the image present on google drive which we intend to have as a background image to this particular slide.
</span>    <span class="n">img_url</span> <span class="o">=</span> <span class="s">'%s&amp;access;_token=%s'</span> <span class="o">%</span> <span class="p">(</span><span class="n">DRIVE</span><span class="p">.</span><span class="n">files</span><span class="p">().</span><span class="n">get_media</span><span class="p">(</span><span class="n">fileId</span><span class="o">=</span><span class="n">IMG_ID</span><span class="p">).</span><span class="n">uri</span><span class="p">,</span> <span class="n">credz</span><span class="p">.</span><span class="n">access_token</span><span class="p">)</span>
    <span class="k">print</span><span class="p">(</span><span class="s">"Image url"</span><span class="p">,</span> <span class="n">img_url</span><span class="p">)</span>

    <span class="c1"># prepare a bulk requests that basically replaces the text from the template with the actual data from the sheets.
</span>    <span class="n">bulk_requests</span> <span class="o">=</span> <span class="p">[</span>
        <span class="p">{</span><span class="s">'updatePageProperties'</span><span class="p">:{</span><span class="s">'objectId'</span><span class="p">:</span><span class="n">page_id</span><span class="p">,</span> <span class="s">'pageProperties'</span><span class="p">:{</span><span class="s">'pageBackgroundFill'</span><span class="p">:{</span><span class="s">'stretchedPictureFill'</span><span class="p">:{</span><span class="s">'contentUrl'</span><span class="p">:</span><span class="n">img_url</span><span class="p">}}},</span> <span class="s">'fields'</span><span class="p">:</span><span class="s">'pageBackgroundFill'</span><span class="p">}},</span>
        <span class="p">{</span><span class="s">'replaceAllText'</span><span class="p">:{</span><span class="s">'containsText'</span><span class="p">:{</span><span class="s">'text'</span><span class="p">:</span><span class="s">''</span><span class="p">,</span> <span class="s">'matchCase'</span><span class="p">:</span><span class="bp">True</span><span class="p">},</span> <span class="s">'replaceText'</span><span class="p">:</span><span class="n">each_data</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="s">"pageObjectIds"</span><span class="p">:</span> <span class="p">[</span><span class="n">page_id</span><span class="p">]}},</span>
        <span class="p">{</span><span class="s">'replaceAllText'</span><span class="p">:{</span><span class="s">'containsText'</span><span class="p">:{</span><span class="s">'text'</span><span class="p">:</span><span class="s">''</span><span class="p">,</span> <span class="s">'matchCase'</span><span class="p">:</span><span class="bp">True</span><span class="p">},</span> <span class="s">'replaceText'</span><span class="p">:</span><span class="n">each_data</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="s">"pageObjectIds"</span><span class="p">:</span> <span class="p">[</span><span class="n">page_id</span><span class="p">]}},</span>
        <span class="p">{</span><span class="s">'replaceAllText'</span><span class="p">:{</span><span class="s">'containsText'</span><span class="p">:{</span><span class="s">'text'</span><span class="p">:</span><span class="s">''</span><span class="p">,</span> <span class="s">'matchCase'</span><span class="p">:</span><span class="bp">True</span><span class="p">},</span> <span class="s">'replaceText'</span><span class="p">:</span><span class="n">each_data</span><span class="p">[</span><span class="mi">3</span><span class="p">],</span> <span class="s">"pageObjectIds"</span><span class="p">:</span> <span class="p">[</span><span class="n">page_id</span><span class="p">]}},</span>
        <span class="p">{</span><span class="s">'replaceAllText'</span><span class="p">:{</span><span class="s">'containsText'</span><span class="p">:{</span><span class="s">'text'</span><span class="p">:</span><span class="s">''</span><span class="p">,</span> <span class="s">'matchCase'</span><span class="p">:</span><span class="bp">True</span><span class="p">},</span> <span class="s">'replaceText'</span><span class="p">:</span><span class="n">each_data</span><span class="p">[</span><span class="mi">8</span><span class="p">],</span> <span class="s">"pageObjectIds"</span><span class="p">:</span> <span class="p">[</span><span class="n">page_id</span><span class="p">]}},</span>
        <span class="p">{</span><span class="s">'replaceAllText'</span><span class="p">:{</span><span class="s">'containsText'</span><span class="p">:{</span><span class="s">'text'</span><span class="p">:</span><span class="s">''</span><span class="p">,</span> <span class="s">'matchCase'</span><span class="p">:</span><span class="bp">True</span><span class="p">},</span> <span class="s">'replaceText'</span><span class="p">:</span><span class="n">each_data</span><span class="p">[</span><span class="mi">7</span><span class="p">],</span> <span class="s">"pageObjectIds"</span><span class="p">:</span> <span class="p">[</span><span class="n">page_id</span><span class="p">]}},</span>
        <span class="p">{</span><span class="s">'replaceAllText'</span><span class="p">:{</span><span class="s">'containsText'</span><span class="p">:{</span><span class="s">'text'</span><span class="p">:</span><span class="s">''</span><span class="p">,</span> <span class="s">'matchCase'</span><span class="p">:</span><span class="bp">True</span><span class="p">},</span> <span class="s">'replaceText'</span><span class="p">:</span><span class="n">each_data</span><span class="p">[</span><span class="mi">6</span><span class="p">],</span> <span class="s">"pageObjectIds"</span><span class="p">:</span> <span class="p">[</span><span class="n">page_id</span><span class="p">]}},</span>
        <span class="p">{</span><span class="s">'replaceAllText'</span><span class="p">:{</span><span class="s">'containsText'</span><span class="p">:{</span><span class="s">'text'</span><span class="p">:</span><span class="s">''</span><span class="p">,</span> <span class="s">'matchCase'</span><span class="p">:</span><span class="bp">True</span><span class="p">},</span> <span class="s">'replaceText'</span><span class="p">:</span><span class="n">each_data</span><span class="p">[</span><span class="mi">9</span><span class="p">],</span> <span class="s">"pageObjectIds"</span><span class="p">:</span> <span class="p">[</span><span class="n">page_id</span><span class="p">]}}</span>
    <span class="p">]</span>
    <span class="n">bulk_update_response</span> <span class="o">=</span> <span class="n">SLIDES</span><span class="p">.</span><span class="n">presentations</span><span class="p">().</span><span class="n">batchUpdate</span><span class="p">(</span><span class="n">body</span><span class="o">=</span><span class="p">{</span><span class="s">'requests'</span><span class="p">:</span><span class="n">bulk_requests</span><span class="p">},</span> <span class="n">presentationId</span><span class="o">=</span><span class="n">PRESENTATION_ID</span><span class="p">,</span> <span class="n">fields</span><span class="o">=</span><span class="s">''</span><span class="p">).</span><span class="n">execute</span><span class="p">().</span><span class="n">get</span><span class="p">(</span><span class="s">'replies'</span><span class="p">)</span>

    <span class="n">page_id</span> <span class="o">=</span> <span class="n">copy_slide_rsp</span><span class="p">[</span><span class="s">'replies'</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="s">'duplicateObject'</span><span class="p">][</span><span class="s">'objectId'</span><span class="p">]</span> <span class="c1"># update the page id as the one that was duplicated so we now can work on this slide.
</span>
<span class="n">delete_final_page</span> <span class="o">=</span> <span class="n">SLIDES</span><span class="p">.</span><span class="n">presentations</span><span class="p">().</span><span class="n">batchUpdate</span><span class="p">(</span><span class="n">body</span><span class="o">=</span><span class="p">{</span><span class="s">'requests'</span><span class="p">:[{</span><span class="s">"deleteObject"</span><span class="p">:</span> <span class="p">{</span><span class="s">"objectId"</span><span class="p">:</span> <span class="n">page_id</span><span class="p">}}]},</span> <span class="n">presentationId</span><span class="o">=</span><span class="n">PRESENTATION_ID</span><span class="p">,</span> <span class="n">fields</span><span class="o">=</span><span class="s">''</span><span class="p">).</span><span class="n">execute</span><span class="p">().</span><span class="n">get</span><span class="p">(</span><span class="s">'replies'</span><span class="p">)</span>
</code></pre></div></div>

<h2 id="output-presentation-created">Output Presentation Created:</h2>
<p>After successful running of the above program, following presentation was generated.
https://docs.google.com/presentation/d/1h9YqUnCWu5pxXmW3rs_9rKmMsVeJM9I8nIBGbr25pME/edit?usp=sharing</p>]]></content><author><name>Bhishan Bhandari</name><email>bhishan.bhandari@yaypply.com, bbhishan@gmail.com</email></author><category term="Python" /><category term="Google APIs" /><category term="Google Sheets" /><category term="Google Slides" /><category term="Google Drive" /><summary type="html"><![CDATA[Google services are cool and you can build products and services around it. We will see through examples how you can use various google services such as spreadsheet, slides and drive through Python. I hope people can take ideas from the following example to do amazing stuffs with Google services. There is a part one to this article where I walked through procedure to enable Google APIs, installation of required packages in Python, authentication and demonstrated individual examples of Sheets, Drive and Slides API. https://www.thetaranights.com/brief-introduction-to-google-apissheets-slides-drive/ . In this article however, we will integrate Sheets, Drive and Slides API altogether.]]></summary></entry></feed>