4

Trong vài năm qua, chúng ta đã thấy phương tiện truyền thông xã hội đã thay đổi mạnh mẽ cách các thương hiệu tiếp cận khách hàng của họ. Trên thực tế, truyền thông xã hội bắt đầu đóng một vai trò lớn trong các quyết định mua hàng.

Sự phát triển của "những người nổi tiếng trực tuyến" thông qua các mạng xã hội đã thu hút sự chú ý của các nhà tiếp thị và đó là nơi mà ý tưởng về những người có ảnh hưởng xã hội xuất hiện.

Có một lời giải thích tuyệt vời về sự tăng trưởng của những người có ảnh hưởng xã hội:

"Người tiêu dùng luôn coi trọng ý kiến ​​được đưa ra trực tiếp cho họ. Các nhà tiếp thị có thể chi hàng triệu đô la cho các chiến dịch quảng cáo được xây dựng công phu, nhưng thường thì điều thực sự tạo nên tâm trí của người tiêu dùng không chỉ đơn giản mà còn miễn phí: một lời khuyên truyền miệng từ một người đáng tin cậy Khi người tiêu dùng bị choáng ngợp bởi các lựa chọn sản phẩm đã loại bỏ các rào cản ngày càng tăng của tiếp thị truyền thống, truyền miệng sẽ cắt giảm tiếng ồn một cách nhanh chóng và hiệu quả. " -  Bughin, Jacques. Doogan, Jonathan. Vetvik, Ole Jørgen (2010, tháng 4). Một cách mới để đo lường tiếp thị truyền miệng

Nói một cách đơn giản: mọi người tin tưởng mọi người!

Đợi đã, Ảnh hưởng truyền thông xã hội là gì?

Vâng, đây là một định nghĩa tốt:

"Người gây ảnh hưởng khá đơn giản là người có ảnh hưởng so với người khác. Người gây ảnh hưởng trên phương tiện truyền thông xã hội là người có ảnh hưởng thông qua phương tiện truyền thông xã hội. Hình thức ảnh hưởng có thể khác nhau và không có hai người có ảnh hưởng giống nhau. , nhưng trong thời đại kỹ thuật số của kết nối trực tuyến, những người thường xuyên đã trở thành những người nổi tiếng trực tuyến, những người nổi tiếng với các hoạt động truyền thông xã hội, đặc biệt là trong các phân khúc thị trường nhất định. " -  Newberry, Christina (2017, ngày 19 tháng 4). Hướng dẫn toàn diện về tiếp thị ảnh hưởng trên phương tiện truyền thông xã hội. 

Thật tuyệt, tại sao tôi phải quan tâm?

Những con số khá ấn tượng và được tán thành bởi nghiên cứu của Twitter là người dùng:

"Gần 40% người dùng Twitter nói rằng họ đã mua hàng do kết quả trực tiếp của Tweet từ một người có ảnh hưởng." -  Karp, Katie (2016, ngày 10 tháng 5). Nghiên cứu mới: Giá trị của những người có ảnh hưởng trên Twitter. 

Đó chỉ là Twitter. Hãy tưởng tượng tỷ lệ mua hàng mà những người có ảnh hưởng xã hội có thể đạt được thông qua Instagram hoặc YouTube, có sức hấp dẫn thị giác mạnh mẽ hơn nhiều.

Trước khi chúng tôi bắt đầu

Mã được trình bày ở đây chỉ dành cho mục đích giáo dục và nghiên cứu. Không có ý định gây ra bất kỳ tổn hại nào cho các dịch vụ của bên thứ ba.

Kịch bản

Hãy tưởng tượng chúng ta đang vào ngành thể dục. Chúng tôi muốn tự động hóa quá trình tìm kiếm một số người có ảnh hưởng nhất trong thế giới thể dục thông qua các mạng xã hội.

Chúng ta sẽ bắt đầu xây dựng một cái cạp đơn giản để tìm những người đó. Chúng ta hãy chia nhiệm vụ này thành các phần nhỏ hơn để hiểu rõ hơn về cạp:

  • Máy cạp Google : chúng tôi cần một máy cạp Google để tìm hiểu một số tin tức về những người có ảnh hưởng đến thể dục.
  • Trình quét trang : chúng tôi cần một trình cào để tìm kiếm các hồ sơ Instagram.
  • Trình quét Instagram : chúng tôi cần một trình cào để trích xuất thông tin về hồ sơ của người ảnh hưởng.

Các yêu cầu

Có rất nhiều lib tuyệt vời cho việc quét web ngoài đó, như scrape-it cho Node.js hoặc BeautifulSoup cho Python, nhưng, chúng tôi sẽ giữ nó đơn giản nhất có thể và chúng tôi sẽ xây dựng cơ chế của riêng mình.

Điều đó sẽ yêu cầu các phụ thuộc sau:

  • request : Đơn giản hóa yêu cầu HTTP client.
  • request-lời hứa : Ứng dụng khách yêu cầu HTTP được đơn giản hóa 'request' với hỗ trợ Promise.
  • cổ vũ : Việc triển khai nhanh chóng, linh hoạt và tinh gọn của jQuery lõi được thiết kế dành riêng cho máy chủ.
  • lodash : Một thư viện tiện ích JavaScript hiện đại cung cấp tính mô đun, hiệu suất và tính năng bổ sung.
  • produc : Mô-đun produc được thiết kế để hỗ trợ các nhu cầu của API nội bộ của Node.js.
  • url : Mô-đun URL cung cấp các tiện ích để phân giải và phân tích URL.

Cấu trúc dự án sẽ như sau:

influence
│   index.js
│   package.json    
└───lib
│   │   google.js
│   │   hunter.js
│   │   instagram.js
│   │   scraper.js
└───node_modules
    │   ...

Cái cạp

Hãy bắt đầu xây dựng một trình cào trừu tượng (tất cả các trình dọn dẹp phải thực hiện các tác vụ tương tự, vì vậy hãy sử dụng lại một số mã):

'use strict';

var request = require('request-promise');
var cheerio = require('cheerio');

/**
 * The default constructor
 */
function Scraper() {

}

/**
 * Returns a http get request promise
 * 
 * @param  {Object}  req     The request definition
 * @return {Promise} promise The get request promise
 */
Scraper.prototype.get = function(req) {
  return request(req);
}

/**
 * Returns a cheerio instance loaded with the given html body
 * 
 * @param  {String}   body The html body
 * @return {Function} $    The cheerio instance
 */
Scraper.prototype.load = function(body) {
  return cheerio.load(body);
}

/**
 * Returns a promise of a request call
 * 
 * @param  {String}  uri The request uri
 * @param  {Object}  qs  The request query string 
 * @return {Promise} promise The request promise
 */
Scraper.prototype.prepare = function(uri, qs) {
  var req = {
    uri:             uri,
    qs:              qs,
    simple:          false,
    transform:       this.load,
    followRedirects: false
  };

  return this.get(req).then(this.scrape);
}

/**
 * Executes the scrape chain: 
 * request -> cheerio load -> scrape -> transform
 * 
 * @param  {Array}   promises The promises array
 * @return {Promise} promise  The execution result
 */
Scraper.prototype.execute = function(promises) {
  var self = this;
  return Promise.all(promises).then(function(result) {
    return self.transform(result);
  });
}

/**
 * The scrape method.
 * This is the abstract method that should be implemented by all the scrapers.
 * It performs a html body scrape.
 * 
 * @param  {Function} $ The cheerio instance
 * @return {Array}    result The scrape result
 */
Scraper.prototype.scrape = function($) {
  throw new TypeError('scrape() method must be implemented');
}

/**
 * The transform method.
 * This is the abstract method that should be implemented by all the scrapers.
 * It transform the scrape result in a array of objects.
 * 
 * @param  {Array} result The scrape result
 * @return {Array} normalized An array of normalized data
 */
Scraper.prototype.transform = function(result) {
  throw new TypeError('transform() method must be implemented');
}

module.exports = Scraper;

Cái cạp của Google

Chúng tôi cần Google để giúp chúng tôi tìm kiếm tin tức về những người có ảnh hưởng. Hãy xây dựng một công cụ quét Google:

'use strict';

var url     = require('url');
var util    = require('util');
var Scraper = require('./scraper');

/**
 * The defult configuration
 */
var HOST             = 'https://google.com'; // google's host
var PATH             = '/search';            // search path
var LIMIT            = 10;                   // google's page limit
var START_AT_PAGE    = 0;                    // starts at page 0
var URL_ELEMENT      = '.g h3 a';            // html tag to search

/**
 * The default constructor 
 */
function Google() {
  Scraper.call(this);
}

/**
 * The implementation of the abstract method transform()
 * Returns a single array of the given multi array
 * 
 * @param  {Array} result The multi array
 * @return {Array} single The single array
 */
Google.prototype.transform = function(result) {    
  return [].concat.apply([], result);
}

/**
 * The implementation of the abstract method scrape()
 * It performs a scrape of the Google's search page.
 * 
 * @param  {Function} $     The cheerio instance
 * @return {Array}    links The Google's search links
 */
Google.prototype.scrape = function($) {
  var links = [];
  $(URL_ELEMENT).each(function(i, element) {
    var href = $(element).attr('href');
    var parsed = url.parse(href, true);
    links.push(parsed.query.q);
  });

  return links;
}

/**
 * Performs a Google search
 * 
 * @param  {String}  term    The term to search
 * @param  {Number}  limit   The result limit
 * @return {Promise} promise A promise of the execution chain
 */
Google.prototype.search = function(term, limit) {
  var promises = [];
  var size     = limit || LIMIT;

  for (var i = START_AT_PAGE; i < size; i += LIMIT) {        
    var promise = this.prepare(HOST + PATH, { q: term, start: i });
    promises.push(promise);
  }

  return this.execute(promises);
}

util.inherits(Google, Scraper);
module.exports = Google;

Máy cạp trang

Bây giờ, chúng ta cần tìm kiếm các hồ sơ Instagram trong các trang mà chúng ta sẽ nhận được trong một tìm kiếm Google. Hãy xây dựng trình quét trang - chúng tôi sẽ gọi nó là Hunter:

'use strict';

var util    = require('util');
var Scraper = require('./scraper');

/**
 * The default constructor 
 */
function Hunter() {
  Scraper.call(this);
}

/**
 * The implementation of the abstract method transform()
 * Returns a single array of the given multi array
 * 
 * @param  {Array} result The multi array
 * @return {Array} single The single array
 */
Hunter.prototype.transform = function(result) {  
  var profiles = [].concat.apply([], result);
  return Array.from(new Set(profiles));
}

/**
 * The implementation of the abstract method scrape()
 * It searches for instagram profiles in the given html body.
 * 
 * @param  {Function} $     The cheerio instance
 * @return {Array}    links The Insgragram account links
 */
Hunter.prototype.scrape = function($) {
  var profiles = [];
  var links = $('a[href^="http://instagram.com/"],a[href^="https://instagram.com/"]')
                .not('[href^="http://instagram.com/p/"]')
                .not('[href^="https://instagram.com/p/"]')
                .not('[href^="http://instagram.com/d/"]')
                .not('[href^="https://instagram.com/d/"]');

  $(links).each(function(i, link) {
    var href = $(link).attr('href');
    if (href.endsWith('/')) {
      href = href.substring(0, href.length - 1);
    }

    profiles.push(href);
  });

  return profiles;
}

/**
 * Searches for instagram profiles links in the given page's url
 *
 * @param  {Array} links The page's url
 * @return {Promise} promise A promise of the execution chain
 **/
Hunter.prototype.hunt = function(links) {
  var promises = [];

  for (var index in links) {
    var link = links[index];
    var promise = this.prepare(link);
    promises.push(promise);
  }

  return this.execute(promises);  
}

util.inherits(Hunter, Scraper);
module.exports = Hunter;

Máy cào Instagram

Cuối cùng, chúng ta cần trích xuất thông tin về tài khoản Instagram của người có ảnh hưởng:

'use strict';

var util    = require('util');
var _       = require('lodash');
var Scraper = require('./scraper');

/**
 * The default constructor
 */
function Instagram() {
  Scraper.call(this);
}

/**
 * The implementation of the abstract method transform()
 * Returns a single array of the given multi array
 * 
 * @param  {Array} result The multi array
 * @return {Array} single The single array
 */
Instagram.prototype.transform = function(result) {
  var profiles = [].concat.apply([], result);
  return _.compact(profiles);
}

/**
 * The implementation of the abstract method scrape()
 * It performs a scrape of the user's Insragram account page.
 * 
 * @param  {Function} $ The cheerio instance
 * @return {Array}    profiles The Insgram account profiles
 */
Instagram.prototype.scrape = function($) {
  var link        = $('link[hreflang="x-default"]').attr('href');
  var picture     = $('meta[property="og:image"]').attr('content');
  var description = $('meta[property="og:description"]').attr('content');

  // profile not found
  if (!link || !picture || !description)
    return;

  if (link.endsWith('/'))
    link = link.substring(0, link.length - 1);

  var splited   = link.split('/');
  var username  = splited[splited.length -1];
  var indexOf   = description.indexOf('-');
  var info      = description.substring(0, indexOf - 1).trim();
  var followers = info.split(',')[0].replace(' Followers', '');
  var title     = $('title').text();
  var index     = title.indexOf('(');
  var name      = title.substring(0, index - 1).trim();

  return {
    link     : link,
    username : username,
    name     : name,
    followers: followers,
    picture  : picture
  }
}

/**
 * Extracts information of the given instagram links
 *
 * @param  {Array}   links The instagram links
 * @return {Promise} promise A promise of the execution chain
 */
Instagram.prototype.profiles = function(links) {
  var promises = [];

  for (var index in links) {
    var link = links[index];
    var promise = this.prepare(link);
    promises.push(promise);
  }

  return this.execute(promises);
}

util.inherits(Instagram, Scraper);
module.exports = Instagram;

Để tất cả chúng cùng nhau

Hãy xuất khẩu các mô-đun của chúng tôi. Trong tệp index.js, chúng tôi sẽ tạo một lớp có tên là Influence với một phương thức tĩnh để tìm những người có ảnh hưởng:

var Google    = require('./lib/google');
var Hunter    = require('./lib/hunter');
var Instagram = require('./lib/instagram');

/**
 * The defaul constructor
 */
function Influence() {

}

/**
 * Searches instagram profiles based on the given term
 * 
 * @param  {String}  term  The term to search
 * @param  {Number}  limit The google's search limit
 * @return {Promise} promise A promise to be executed 
 */
Influence.find = function(term, limit) {
  var google = new Google();

  return google.search(term, limit)
    .then(function(links) {
      var hunter = new Hunter();
      return hunter.hunt(links);
    })
    .then(function(profiles) {
      var instagram = new Instagram();
      return instagram.profiles(profiles);
    });
}

module.exports = {
  Google:    Google,
  Hunter:    Hunter,
  Instagram: Instagram,
  Influence: Influence
};

Tìm kiếm những người ảnh hưởng

Hãy kiểm tra mã của chúng tôi. Chúng tôi sẽ tạo một tệp có tên là test test.js trên đường dẫn gốc của dự án của chúng tôi và chúng tôi sẽ tìm kiếm thuật ngữ, tài khoản Instagram thể dục hàng đầu trên Instagram.

'use strict';

var Influence = require('./').Influence;

var term = 'top fitness instagram accounts';
Influence.find(term).then(        

  /**
  * Handles the instagram profiles
  */
  function(profiles) {
    console.log(profiles);
  }

).catch(

  /**
  * Handles the error
  */
  function(error) {
    console.error(error);
  }

);

Và kết quả:

[
  {
    "link": "https://www.instagram.com/menshealthmag",
    "username": "menshealthmag",
    "name": "Men's Health",
    "followers": "939k",
    "picture": "https://instagram.fcpq1-1.fna.fbcdn.net/t51.2885-19/11371057_983333891687510_70028928_a.jpg"
  },
  {
    "link": "https://www.instagram.com/harpersbazaarus",
    "username": "harpersbazaarus",
    "name": "Harper's BAZAAR",
    "followers": "3m",
    "picture": "https://instagram.fcpq1-1.fna.fbcdn.net/t51.2885-19/s150x150/18299602_1302688826466727_8338763405586333696_a.jpg"
  },
  {
    "link": "https://www.instagram.com/amandabisk",
    "username": "amandabisk",
    "name": "Amanda Bisk",
    "followers": "680.8k",
    "picture": "https://instagram.fcpq1-1.fna.fbcdn.net/t51.2885-19/s150x150/16123289_158236814672260_164752922544963584_n.jpg"
  },
  {
    "link": "https://www.instagram.com/hannahbronfman",
    "username": "hannahbronfman",
    "name": "Hannah Fallis Bronfman",
    "followers": "388.3k",
    "picture": "https://instagram.fcpq1-1.fna.fbcdn.net/t51.2885-19/s150x150/16464716_949189645214982_1784722712950734848_a.jpg"
  },
  ...
]

Phần kết luận

Trong một vài bước, chúng tôi đã xây dựng một công cụ quét đơn giản tự động hóa quá trình tìm kiếm những người có ảnh hưởng trên phương tiện truyền thông xã hội. Bạn có thể kết hợp điều này với học máy, sử dụng IBM Watson hoặc dịch vụ nhận thức của nhà cung cấp khác để phân tích các cấu hình đó và thực hiện những điều đáng kinh ngạc.

Bạn có thể tìm thấy mã nguồn tại https://github.com/tommelo/influence

|