How to Make Data Requests

Scraping

Web scraping, also known as data extraction, is the process of retrieving, thus scraping, data from a website. Developers use certain HTTP methods to manipulate data, usually using APIs. Below we’re going to go over how to get data from my social tracker blog, mb4.in.

A cheat-sheet containing ES2015 [ES6] tips, tricks, best practices and code snippet examples for your day to day workflow.

Intro

Our first example can be done from the command line. Fire up your terminal, and try a cURL:

curl -X GET \
  'https://mb4.in/?rest_route=/wp/v2/posts&per_page=1'

Your results should something similar to:

[
    {
        "id": 14085,
        "date": "2020-04-08T23:38:11",
        "date_gmt": "2020-04-09T03:38:11",
        "guid": {
            "rendered": "https://mb4.in/?p=14085"
        },
        "modified": "2020-04-08T23:38:11",
        "modified_gmt": "2020-04-09T03:38:11",
        "slug": "daewon-songs-greatest-manuals-at-the-berrics",
        "status": "publish",
        "type": "post",
        "link": "https://mb4.in/daewon-songs-greatest-manuals-at-the-berrics/",
        "title": {
            "rendered": "Daewon Song’s Greatest Manuals At The Berrics"
        },
        "content": {
            "rendered": "<div class=\"jetpack-video-wrapper\"><span class=\"embed-youtube\" style=\"text-align:center; display: block;\"><iframe class='youtube-player' type='text/html' width='640' height='360' src='https://www.youtube.com/embed/dzfdKQO8_Vc?version=3&#038;rel=1&#038;fs=1&#038;autohide=2&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;wmode=transparent' allowfullscreen='true' style='border:0;'></iframe></span></div>\n",
            "protected": false
        },
        "excerpt": {
            "rendered": "",
            "protected": false
        },
        "author": 1,
        "featured_media": 14087,
        "comment_status": "closed",
        "ping_status": "closed",
        "sticky": false,
        "template": "",
        "format": "standard",
        "meta": {
            "spay_email": ""
        },
        "categories": [
            1
        ],
        "tags": [
            46
        ],
        "jetpack_featured_media_url": "https://mb4.in/wp-content/uploads/2020/04/dzfdKQO8_Vc.jpg",
        "_links": {
            "self": [
                {
                    "href": "https://mb4.in/wp-json/wp/v2/posts/14085"
                }
            ],
            "collection": [
                {
                    "href": "https://mb4.in/wp-json/wp/v2/posts"
                }
            ],
            "about": [
                {
                    "href": "https://mb4.in/wp-json/wp/v2/types/post"
                }
            ],
            "author": [
                {
                    "embeddable": true,
                    "href": "https://mb4.in/wp-json/wp/v2/users/1"
                }
            ],
            "replies": [
                {
                    "embeddable": true,
                    "href": "https://mb4.in/wp-json/wp/v2/comments?post=14085"
                }
            ],
            "version-history": [
                {
                    "count": 1,
                    "href": "https://mb4.in/wp-json/wp/v2/posts/14085/revisions"
                }
            ],
            "predecessor-version": [
                {
                    "id": 14086,
                    "href": "https://mb4.in/wp-json/wp/v2/posts/14085/revisions/14086"
                }
            ],
            "wp:featuredmedia": [
                {
                    "embeddable": true,
                    "href": "https://mb4.in/wp-json/wp/v2/media/14087"
                }
            ],
            "wp:attachment": [
                {
                    "href": "https://mb4.in/wp-json/wp/v2/media?parent=14085"
                }
            ],
            "wp:term": [
                {
                    "taxonomy": "category",
                    "embeddable": true,
                    "href": "https://mb4.in/wp-json/wp/v2/categories?post=14085"
                },
                {
                    "taxonomy": "post_tag",
                    "embeddable": true,
                    "href": "https://mb4.in/wp-json/wp/v2/tags?post=14085"
                }
            ],
            "curies": [
                {
                    "name": "wp",
                    "href": "https://api.w.org/{rel}",
                    "templated": true
                }
            ]
        }
    }
]

This is the standard response from a Wordpress website. It contains the entire post, the title, content, url, taxonomies and references to other data.

I personally like to use wget when making command line requests, here’s how that’d look (more human readable):

wget --quiet \
  --method GET \
  --header 'Cache-Control: no-cache' \
  --output-document \
  - 'https://mb4.in/?rest_route=/wp/v2/posts&per_page=1'

PHP

We’ll start with PHP. There’s a few different ways to GET data from a remote URL, in this instance, https://mb4.in/?rest_route=/wp/v2/posts&per_page=1. This will return the latest post from my blog. First, lets see how its done with PHP cURL:

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://mb4.in/?rest_route=/wp/v2/posts&per_page=1",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
  CURLOPT_HTTPHEADER => array(
    "Cache-Control: no-cache"
  ),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}

If you place this into a php document and run a local server, say: php -S localhost:9000, then hit that URL, in your browser you should the response:

Next example uses the pecl_http library:

<?php

$client = new http\Client;
$request = new http\Client\Request;

$request->setRequestUrl('https://mb4.in/');
$request->setRequestMethod('GET');
$request->setQuery(new http\QueryString(array(
  'rest_route' => '/wp/v2/posts',
  'per_page' => '1'
)));

$request->setHeaders(array(
  'Cache-Control' => 'no-cache'
));

$client->enqueue($request)->send();
$response = $client->getResponse();

echo $response->getBody();

and lastly, HTTPRequest:

<?php

$request = new HttpRequest();
$request->setUrl('https://mb4.in/');
$request->setMethod(HTTP_METH_GET);

$request->setQueryData(array(
  'rest_route' => '/wp/v2/posts',
  'per_page' => '1'
));

$request->setHeaders(array(
  'Cache-Control' => 'no-cache'
));

try {
  $response = $request->send();

  echo $response->getBody();
} catch (HttpException $ex) {
  echo $ex;
}

Python

I love how simple and clean code is in Python. Here’s how to make a request using the default http.client library in Python 3:

import http.client

conn = http.client.HTTPConnection("mb4,in")

headers = {
    'Cache-Control': "no-cache"
}

conn.request("GET", "", headers=headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))

and if you want things even simpler, give Requests a spin:

import requests

url = "https://mb4.in/"

querystring = {"rest_route":"/wp/v2/posts","per_page":"1"}

headers = {
    'Cache-Control': "no-cache"
}

response = requests.request("GET", url, headers=headers, params=querystring)

print(response.text)

Javascript

For Javascript, not including Node, there’s two major methods. These examples will output their results in the console. First is AJAX using jQuery:

var settings = {
  "async": true,
  "crossDomain": true,
  "url": "https://mb4.in/?rest_route=/wp/v2/posts&per_page=1",
  "method": "GET",
  "headers": {
    "Cache-Control": "no-cache"
  }
}

$.ajax(settings).done(function (response) {
  console.log(response);
});

This second example works intependent of jQuery:

var data = null;

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === 4) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://mb4.in/?rest_route=/wp/v2/posts&per_page=1");
xhr.setRequestHeader("Cache-Control", "no-cache");

xhr.send(data);

Node

Node isn’t too far off from how its done in Javascript, for obvious reasons. Let’s start with the native Node method first:

var http = require("https");

var options = {
  "method": "GET",
  "hostname": [
    "mb4",
    "in"
  ],
  "path": [
    ""
  ],
  "headers": {
    "Cache-Control": "no-cache"
  }
};

var req = http.request(options, function (res) {
  var chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    var body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.end();

It’s far cleaner and simpler to just use the request library:

var request = require("request");

var options = { method: 'GET',
  url: 'https://mb4.in/',
  qs: { rest_route: '/wp/v2/posts', per_page: '1' },
  headers:
   { 'Cache-Control': 'no-cache' } };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});

Ruby

Lastly is Ruby:

require 'uri'
require 'net/http'

url = URI("https://mb4.in/?rest_route=/wp/v2/posts&per_page=1")

http = Net::HTTP.new(url.host, url.port)

request = Net::HTTP::Get.new(url)
request["Cache-Control"] = 'no-cache'

response = http.request(request)
puts response.read_body

Objective C

I’m not aan iOS developer, but I thought I’d also include this, mostly to compare to how wild it looks compared to other languages.

#import <Foundation/Foundation.h>

NSDictionary *headers = @{ @"Cache-Control": @"no-cache" };

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://mb4.in/?rest_route=/wp/v2/posts&per_page=1"]
                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                   timeoutInterval:10.0];
[request setHTTPMethod:@"GET"];
[request setAllHTTPHeaderFields:headers];

NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request
                                            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
                                                if (error) {
                                                    NSLog(@"%@", error);
                                                } else {
                                                    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;
                                                    NSLog(@"%@", httpResponse);
                                                }
                                            }];
[dataTask resume];
ender