Trình thu thập dữ liệu web php github

Có thể các bạn đã nghe nói đến kỹ thuật thu thập dữ liệu trang web ở đâu rồi đúng không?

Trình thu thập kỹ thuật có rất nhiều ứng dụng thực tế, có thể kể đến một số ý tưởng như tưởng tượng. Xây dựng ứng dụng đọc báo bằng cách thu thập dữ liệu trang web từ các báo lớn, thu thập thông tin tuyển dụng từ Facebook. v. v…

Để tạo trình thu thập dữ liệu web có rất nhiều cách và cũng có vô số khung hỗ trợ. Ví dụ như Python thì có Scrapy rất nổi tiếng. Tuy nhiên, do mình chỉ biết có Nodejs thôi, nên bài viết này chúng ta sẽ cùng nhau tìm hiểu kỹ thuật crawler dữ liệu website sử dụng kỹ thuật phân tích cú pháp DOM bằng Nodejs

Trước hết, để các bạn khỏi lăn tăn, Vtalking sẽ cùng các bạn đang muốn tự học lập trình xem trang web thu thập thông tin là gì nhé.

Nội dung chính của bài viết

  • #Crawl dữ liệu trang web là gì?
  • #Demo trang web trình thu thập thông tin kỹ thuật
    • Yêu cầu số lượng trước khi thực hiện
  • #Xây dựng trang web trình thu thập dữ liệu
    • 1. Cài đặt phụ thuộc
    • 2. Cài đặt máy chủ web với Express
    • 3. Tạo Request và Response Helper
    • 4. Tiến hành tạo dữ liệu trang web trình thu thập thông tin tệp từ scotch
    • 3. Trích xuất dữ liệu từ trang web
    • #Tổng kết

#Crawl dữ liệu trang web là gì?

Nói một cách dễ hiểu, thì trình thu thập dữ liệu web là kỹ thuật thu thập dữ liệu từ các trang web trên mạng theo đường liên kết cho trước. Trình thu thập thông tin web sẽ truy cập vào đường liên kết và tải xuống toàn bộ dữ liệu cũng như tìm kiếm thêm các đường liên kết bên trong để tải xuống ghi chú

Nếu trong quá trình thu thập dữ liệu quá trình, bạn chỉ lọc những thông tin cần thiết cho nhu cầu câu hỏi của bạn thì người ta gọi là web Scaping

Hai khái niệm web crawler và web scraping về cơ bản giống nhau, có khác nhau thì cũng thì tí xíu thôi à

Kỹ thuật thu thập dữ liệu từ trang web

Ví dụ với trang shopee. com, kỹ thuật thu thập dữ liệu web sẽ thu thập toàn bộ nội dung của trang web này [tên sản phẩm, mô tả sản phẩm, giá sản phẩm, hướng dẫn sử dụng, đánh giá và bình luận về sản phẩm,…]. Tuy nhiên, web scraping thì chỉ có thể thu thập một số thông tin cần thiết với bạn như bạn. chỉ thu thập giá sản phẩm để làm ứng dụng so sánh giá

Những dữ liệu khi thu thập thông tin có thể được lưu trữ trong cơ sở dữ liệu của bạn để phục vụ cho việc phân tích hoặc sử dụng với các mục đích khác nhau

Lưu ý. việc thu thập dữ liệu từ một trang web không thể được phép từ trang web chủ đó. Về luật, bạn cần phải xin phép chủ sở hữu trang web. Mình không chịu trách nhiệm nếu có vấn đề gì phát sinh nhé 🙂

#Demo trang web trình thu thập thông tin kỹ thuật

Để minh họa cho kỹ thuật thu thập dữ liệu này, mình sẽ hướng dẫn các bạn xây dựng một bot lừa đảo thu thập dữ liệu từ trang web Scotch. io [một trang web nổi tiếng về dạy học lập trình]

Chúng ta sẽ thu thập những dữ liệu về hồ sơ của một tác giả, cũng như những bài viết của anh ấy. Sau đó, xây dựng RESTful API để trả về những dữ liệu đó, mục đích sử dụng cho ứng dụng của chúng ta sau này

Dưới đây là ảnh chụp màn hình ứng dụng demo được tạo dựa trên API mà chúng tôi đã xây dựng trong bài viết này

Yêu cầu số lượng trước khi thực hiện

Như mình đã nói, kỹ thuật thu thập dữ liệu có thể được thực hiện bởi hầu hết các ngôn ngữ lập trình hiện hỗ trợ HTTP, XML và DOM như. PHP, Python, Java, Javascript…

Trong bài viết này, mình sẽ sử dụng Javascript trên môi trường Nodejs để thực hiện crawling. Vì vậy, bạn cần có kiến ​​thức cơ bản về Javascript để có thể đọc bài viết dễ dàng hơn và thực hiện thu thập dữ liệu trang web nodejs

Nếu bạn chưa biết gì về Nodejs hay Javascript thì có thể tham khảo những bài viết này trước

  • 7 Khái niệm Javascript cơ bản cần biết
  • Series Nodejs cơ bản

Trước khi bắt đầu code theo bài viết này, bạn cũng cần phải cài đặt sẵn Nodejs và Npm trong máy của mình

  • Hướng dẫn cài đặt Nodejs trên Window, Ubuntu

Ngoài ra, mình cũng có sử dụng một số thư viện bên thứ 3 [Phụ thuộc] hỗ trợ việc thu thập dữ liệu như

  • Cheerio – Hỗ trợ phân tích cú pháp DOM cực đơn giản. Thư viện này được cái nhẹ, dễ sử dụng và tốc độ nhanh
  • Axios – Hỗ trợ truy xuất nội dung của trang web thông qua yêu cầu https
  • Express – đây là khung ứng dụng web quá nổi tiếng rồi. Có thể không cần phải nói gì thêm về nó nữa
  • Lodash – Là một dạng thư viện tiện ích của Javascript. Nó viết sẵn rất nhiều hàm hay dùng về mảng, số, đối tượng, chuỗi…

Ok, if all have available, we started to thực hiện viết thu thập dữ liệu thôi

#Xây dựng trang web trình thu thập dữ liệu

Vẫn như mọi khi, để các bạn có thể dễ dàng đọc và làm theo, mình sẽ cố gắng viết chi tiết nhất có thể. Có chỗ nào không hiểu thì phải hỏi ngay nhé

1. Cài đặt phụ thuộc

Đầu tiên, các bạn tạo một dự án Nodejs mới, sau đó cài đặt các thư viện cần thiết cho dự án

# Create a new directory
mkdir scotch-scraping

# cd into the new directory
cd scotch-scraping

# Initiate a new package and install app dependencies
npm init -y
npm install express morgan axios cheerio lodash

2. Cài đặt máy chủ web với Express

Chúng ta sẽ tạo một máy chủ http đơn giản bằng ExpressJS. Đơn giản là tạo máy chủ tệp mới. js trong thư mục gốc của dự án, sau đó thêm đoạn mã sau

/_ server.js _/

// Require dependencies
const logger = require['morgan'];
const express = require['express'];

// Create an Express application
const app = express[];

// Configure the app port
const port = process.env.PORT || 3000;
app.set['port', port];

// Load middlewares
app.use[logger['dev']];

// Start the server and listen on the preconfigured port
app.listen[port, [] => console.log[`App started on port ${port}.`]]

Sau đó, bạn chỉnh sửa tệp

/_ server.js _/

// Require dependencies
const logger = require['morgan'];
const express = require['express'];

// Create an Express application
const app = express[];

// Configure the app port
const port = process.env.PORT || 3000;
app.set['port', port];

// Load middlewares
app.use[logger['dev']];

// Start the server and listen on the preconfigured port
app.listen[port, [] => console.log[`App started on port ${port}.`]]
6 để chạy máy chủ đơn giản hơn. Thêm đoạn mã sau

"scripts": {
  "start": "node server.js"
}

With đoạn mã trên thì từ này, thay vì phải nhập.

/_ server.js _/

// Require dependencies
const logger = require['morgan'];
const express = require['express'];

// Create an Express application
const app = express[];

// Configure the app port
const port = process.env.PORT || 3000;
app.set['port', port];

// Load middlewares
app.use[logger['dev']];

// Start the server and listen on the preconfigured port
app.listen[port, [] => console.log[`App started on port ${port}.`]]
7 để khởi động mã, bạn chỉ cần nhập.
/_ server.js _/

// Require dependencies
const logger = require['morgan'];
const express = require['express'];

// Create an Express application
const app = express[];

// Configure the app port
const port = process.env.PORT || 3000;
app.set['port', port];

// Load middlewares
app.use[logger['dev']];

// Start the server and listen on the preconfigured port
app.listen[port, [] => console.log[`App started on port ${port}.`]]
8

Thực ra, nếu chỉ có vậy thì việc phải thêm kịch bản vào

/_ server.js _/

// Require dependencies
const logger = require['morgan'];
const express = require['express'];

// Create an Express application
const app = express[];

// Configure the app port
const port = process.env.PORT || 3000;
app.set['port', port];

// Load middlewares
app.use[logger['dev']];

// Start the server and listen on the preconfigured port
app.listen[port, [] => console.log[`App started on port ${port}.`]]
6 cũng không có nhiều lợi ích lắm phải không? . sao chép tệp cấu hình, tạo đoạn mã bất kỳ trước khi khởi động máy chủ thì bạn cũng chỉ phải cấu hình trong đoạn mã bắt đầu đoạn này thôi

>>> Nên đọc. Cách phân tích Json Javascript chuẩn nhất

3. Tạo Request và Response Helper

Ở phần này, chúng ta sẽ tạo một số hàm để tái sử dụng trong toàn bộ ứng dụng

Tạo mới một tệp

"scripts": {
  "start": "node server.js"
}
0 trong thư mục gốc của dự án

________số 8

Đoạn mã trên, chúng ta mới chỉ nhập những thư viện cần thiết cho helper mà thôi. Giờ là lúc viết nội dung cho helper

Đầu tiên, chúng ta sẽ tạo một công việc để trả về dữ liệu JSON cho người yêu cầu đơn giản hơn

/_ app/helpers.js _/

/**
 **_ Handles the request[Promise] when it is fulfilled
 _** and sends a JSON response to the HTTP response stream[res].
 */
const sendResponse = res => async request => {
  return await request
    .then[data => res.json[{ status: "success", data }]]
    .catch[[{ status: code = 500 }] =>
      res.status[code].json[{ status: "failure", code, message: code == 404 ? 'Not found.' : 'Request failed.' }]
    ];
};

Ví dụ các cách sử dụng hàm này như sau

/_ server.js _/

// Require dependencies
const logger = require['morgan'];
const express = require['express'];

// Create an Express application
const app = express[];

// Configure the app port
const port = process.env.PORT || 3000;
app.set['port', port];

// Load middlewares
app.use[logger['dev']];

// Start the server and listen on the preconfigured port
app.listen[port, [] => console.log[`App started on port ${port}.`]]
0

Mình sẽ giải thích cụ thể hơn nhé. Khi máy chủ nhận được yêu cầu. NHẬN/đường dẫn. Chúng ta giả định làm abcxyz gì đó và có kết quả là [1, 2, 3, 4, 5]. Lúc này hàm sendResponse[] sẽ hỗ trợ trả lại JSON cho người yêu cầu

/_ server.js _/

// Require dependencies
const logger = require['morgan'];
const express = require['express'];

// Create an Express application
const app = express[];

// Configure the app port
const port = process.env.PORT || 3000;
app.set['port', port];

// Load middlewares
app.use[logger['dev']];

// Start the server and listen on the preconfigured port
app.listen[port, [] => console.log[`App started on port ${port}.`]]
1

Tiếp theo là hàm lấy html từ một url bất kỳ

/_ server.js _/

// Require dependencies
const logger = require['morgan'];
const express = require['express'];

// Create an Express application
const app = express[];

// Configure the app port
const port = process.env.PORT || 3000;
app.set['port', port];

// Load middlewares
app.use[logger['dev']];

// Start the server and listen on the preconfigured port
app.listen[port, [] => console.log[`App started on port ${port}.`]]
2

Đúng như tên gọi của nó, khi bạn gọi hàm này thì kết quả sẽ là toàn bộ html của URL. Từ “đống” HTML này, chúng ta sẽ tách rời để lấy những dữ liệu cần thiết

Trong file helper. js này còn nhiều hàm nữa, nhưng do long quá mình không tiện show ra đây. Bạn cứ lấy nguồn về dùng, nếu có chỗ nào không hiểu thì để lại bình luận bên dưới nhé

4. Tiến hành tạo dữ liệu trang web trình thu thập thông tin tệp từ scotch

Tất cả các thủ tục cần thiết để công việc thu thập dữ liệu đã chuẩn bị hoàn tất. Giờ là lúc chúng ta viết các hàm thu thập dữ liệu, phân tích dữ liệu từ trang web

Tạo tệp

"scripts": {
  "start": "node server.js"
}
1 trong thư mục ứng dụng và thêm đoạn mã sau

/_ server.js _/

// Require dependencies
const logger = require['morgan'];
const express = require['express'];

// Create an Express application
const app = express[];

// Configure the app port
const port = process.env.PORT || 3000;
app.set['port', port];

// Load middlewares
app.use[logger['dev']];

// Start the server and listen on the preconfigured port
app.listen[port, [] => console.log[`App started on port ${port}.`]]
4

Trong đó, cần lưu ý đến hàm scotchRelativeUrl[]. Hàm này có mục đích là tự động trả về URL đầy đủ khi chúng ta chỉ cần truyền vào URL tham số

Ví dụ

/_ server.js _/

// Require dependencies
const logger = require['morgan'];
const express = require['express'];

// Create an Express application
const app = express[];

// Configure the app port
const port = process.env.PORT || 3000;
app.set['port', port];

// Load middlewares
app.use[logger['dev']];

// Start the server and listen on the preconfigured port
app.listen[port, [] => console.log[`App started on port ${port}.`]]
5

3. Trích xuất dữ liệu từ trang web

Trong phần này, chúng ta sẽ tiến hành trích xuất những thông tin cần thiết như thiết yếu.

  • liên kết xã hội [facebook, twitter, github,…]
  • hồ sơ cá nhân [tên, vai trò, hình đại diện,…]
  • thống kê [tổng số lượt xem, tổng số bài đăng, …]
  • bài viết

Tuy nhiên, do bài viết quá dài nên mình sẽ chỉ giải thích cho phần đầu tiền [lấy link xã hội của một tác giả]. Các phần còn lại các bạn tham khảo trong source code nhé

Để có thể trích xuất dữ liệu social link của một ai đó trên scotch.io, mình sẽ định nghĩa một hàm extractSocialUrl[] trong file scotch.js. Mục đích của hàm này là trích xuất tên mạng social, URL trong thẻ .

Mình ví dụ một DOM về thể trong profile của một tác giả trên scotch.

/_ server.js _/

// Require dependencies
const logger = require['morgan'];
const express = require['express'];

// Create an Express application
const app = express[];

// Configure the app port
const port = process.env.PORT || 3000;
app.set['port', port];

// Load middlewares
app.use[logger['dev']];

// Start the server and listen on the preconfigured port
app.listen[port, [] => console.log[`App started on port ${port}.`]]
0

Khi gọi hàm

"scripts": {
  "start": "node server.js"
}
2 thì kết quả trả về là một kiểu đối tượng như sau

/_ server.js _/

// Require dependencies
const logger = require['morgan'];
const express = require['express'];

// Create an Express application
const app = express[];

// Configure the app port
const port = process.env.PORT || 3000;
app.set['port', port];

// Load middlewares
app.use[logger['dev']];

// Start the server and listen on the preconfigured port
app.listen[port, [] => console.log[`App started on port ${port}.`]]
1

Đoạn mã hoàn chỉnh của hàm t làm giàu liên kết xã hội xuất ra như sau

/_ server.js _/

// Require dependencies
const logger = require['morgan'];
const express = require['express'];

// Create an Express application
const app = express[];

// Configure the app port
const port = process.env.PORT || 3000;
app.set['port', port];

// Load middlewares
app.use[logger['dev']];

// Start the server and listen on the preconfigured port
app.listen[port, [] => console.log[`App started on port ${port}.`]]
2

Mình sẽ giải thích một chút

  • Đầu tiên, mình sẽ tìm nạp [fetch] những thẻ với icon class. Mình cũng định nghĩa một regular expression để matching với icon class
  • Chúng ta có định nghĩa một chức năng
    "scripts": {
      "start": "node server.js"
    }
    
    3 có nhiệm vụ trích xuất tất cả các lớp liên quan đến xã hội

Ví dụ cụ thể cho dễ hiểu nhé. hàm này sẽ trả về các lớp liên quan đến xã hội

/_ server.js _/

// Require dependencies
const logger = require['morgan'];
const express = require['express'];

// Create an Express application
const app = express[];

// Configure the app port
const port = process.env.PORT || 3000;
app.set['port', port];

// Load middlewares
app.use[logger['dev']];

// Start the server and listen on the preconfigured port
app.listen[port, [] => console.log[`App started on port ${port}.`]]
3

Tiếp theo, để trích xuất được tên mạng xã hội thì sử dụng hàm

"scripts": {
  "start": "node server.js"
}
4

/_ server.js _/

// Require dependencies
const logger = require['morgan'];
const express = require['express'];

// Create an Express application
const app = express[];

// Configure the app port
const port = process.env.PORT || 3000;
app.set['port', port];

// Load middlewares
app.use[logger['dev']];

// Start the server and listen on the preconfigured port
app.listen[port, [] => console.log[`App started on port ${port}.`]]
4

Cuối cùng là trích xuất URL từ thuộc tính href. Kết quả thu được như sau

/_ server.js _/

// Require dependencies
const logger = require['morgan'];
const express = require['express'];

// Create an Express application
const app = express[];

// Configure the app port
const port = process.env.PORT || 3000;
app.set['port', port];

// Load middlewares
app.use[logger['dev']];

// Start the server and listen on the preconfigured port
app.listen[port, [] => console.log[`App started on port ${port}.`]]
5

#Tổng kết

Như vậy, mình đã hướng dẫn các bạn từng bước để có thể thu thập dữ liệu trang web trực tuyến. Có thể mỗi trang web khác nhau sẽ có cấu trúc HTML khác nhau nên có thể bạn sẽ cần cập nhật lại trình giải nén cho phù hợp. Nhưng về tổng thể thì cũng giống thế này thôi

Các bạn có thể tải về toàn bộ mã nguồn của bài hướng dẫn tại đây

Tải xuống mã nguồn

Hi vọng qua bài viết này, các bạn sẽ hiểu rõ về kỹ thuật thu thập dữ liệu từ các trang web, cũng không kinh khủng lắm phải không

​Miễn phí khóa học React Native

Bạn có muốn tải xuống toàn bộ video của khóa học rất nổi tiếng về React Native này không?

TẢI XUỐNG

  • THẺ
  • learning nodejs
  • javascript cơ bản

Facebook

Twitter

liên kết

Pinterest

WhatsApp

Bài trước 5 chiêu tăng tốc điện thoại Android chạy nhanh như mới

Bài tiếp theo Machine Learning với Nodejs kết hợp TensorFlow. js

sơn dương

Tên đầy đủ là Dương Anh Sơn. Tốt nghiệp ĐH Bách Khoa Hà Nội. Mình bắt đầu nghiệp coder khi mà ra trường đúng là xin được làm đúng chuyên ngành. Mình tin rằng chỉ có chia sẻ kiến ​​thức mới là cách học tập nhanh nhất. Các bạn góp ý bài viết của mình bằng cách comment bên dưới nhé

Chủ Đề