Thứ Ba, 19 tháng 12, 2017

Xử lý JSON trên SQL server 2012

Đầu tiên :
Tạo hàm đọc chuỗi JSON:
https://github.com/khanhmai/Parse-JSON-String-by-SQL-script/blob/master/ParseJSON-FUNCTION.sql

---Hàm này có nhiệm vụ đọc chuỗi JSON-->Đưa thành bảng hàng dọc
Ví dụ:
Select * From
parseJSON
(
       '[{"Text":"YES","Value":"YES","Default":true},
       {"Text":"NO","Value":"NO","Default":false}]'

)
Kết quả Trả về:


Trong ví dụ trên "giá trị"  cột NAME chính là số cột ta cần lấy. Vấn đề bây giờ là chuyển từ cột sang dòng.

Select
       max(case when name='Text' then convert(Varchar(50),StringValue) else '' end) as [Text],
       max(case when name='Value' then convert(Varchar(50),StringValue) else '' end) as [Value],
       max(case when name='Default' then convert(bit,StringValue) else 0 end) as [Default]
From parseJSON
(
       '[{"Text":"YES","Value":"YES","Default":true},
       {"Text":"NO","Value":"NO","Default":false}]'
)
where ValueType = 'string' OR ValueType = 'boolean'
group by parent_ID

Kết quả đẹp như mơ:


Reference: http://mtkcode.blogspot.sg/2014/08/parse-json-string-by-sql-script.html

Thứ Hai, 18 tháng 12, 2017

Phần 3- Thực hành lấy data từ kenh14

Giới thiệu về API của Puppeteer

Do Pupetter là một công cụ khá mạnh mẽ nên API của nó cũng hơi nhiều và dài dòng (Giống Photoshop mạnh mẽ như khó học vậy đó).
Tuy vậy, may mắn là các API này không quá phức tạp, chúng đều đã được document cẩn thận tại đây: https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md.
Các bạn có thể vào đọc sơ nhé. Chia sẻ luôn, một trong những cách hay nhất để tìm hiểu công nghệ mới là lên trang web của nó để xem ví dụ và đọc API đó.
Các bạn có thể xem một số ví dụ trên trang chủ của puppeteer nhé: https://github.com/GoogleChrome/puppeteer
Trong pham vi bài viết, chúng ta chỉ quan tâm tới một số api chính:
  • puppeteer.launch: Mở trình duyệt Chrome lên để bắt đầu làm trò. Hàm này trả về object kiểu Browser.
  • browser.newPage: Mở một tab mới trong Chrome để làm trò. Hàm này trả về object kiểu Page.
  • browser.close: Tắt trình duyệt (Đỡ phải tắt bằng tay)
  • page.goto: Đi tới một trang nào đó. Có params waitUntil khá quan trọng. Params này quyết định chúng ta chờ tới khi page vừa mới load xong, hay sau khi page đã load toàn bộ JavaScript và hình ảnh.
  • page.screenshot: Chụp ảnh tab hiện tại, lưu thành file ảnh.
  • page.evaluate: Đây là API quan trọng nhất, cho phép ta chạy script trong browser và lấy kết quả trả về. Chúng ta sẽ dùng API này để cào mương 14 nhé.

Nào mình cùng đào móc mương 14

Tại sao lại cào ở kênh14, vì mình thích, ok. Chúng ta sẽ khởi động với màn lấy tiêu đề và url của các bài viết. Chỉ cần làm theo 3 bước đơn giản sau:
1. Trước khi code thật thì chúng ta tìm hiểu cấu trúc HTML của kenh14.vn đã nhé.

Các bạn có thể thấy, tiêu đề của các bài viết nằm trong element a, con của element h3 có class là knswli-title. URL nằm trong attribute href của element a đó luôn.
2. Chúng ta thử cào dữ liệu bằng cách viết code JavaScript trong của số console trước nào. Các bạn bấm qua tab console, dán đoạn code này và xem kết quả nhé. (Xem comment để hiểu code làm gì).
// Select tất cả các element chứa tiêu đề bài viết
let titleLinks = document.querySelectorAll('h3.knswli-title > a');
// Chuyển node list thành 1 mảng
titleLinks = [...titleLinks];
// Với mỗi phần tử trong mảng, ta lấy attribute title và link, chuyển thành object
let articles = titleLinks.map(link => ({
title: link.getAttribute('title'), url: link.getAttribute('href')
}));
view rawparse.js hosted with ❤ by GitHub
Kết quả chúng ta đạt được, 1 mảng chứa các object thông tin bài viết
3. Ok, code của chúng ta giờ đã chạy tốt, bây giờ chúng ta quay lại với project NodeJS của kì trước và bắt đầu viết nào.
const puppeteer = require('puppeteer');
(async() => {
// Mở trình duyệt mới và tới trang của kenh14
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
await page.goto('http://kenh14.vn');
// Chạy đoạn JavaScript trong hàm này, đưa kết quả vào biến article
const articles = await page.evaluate(() => {
let titleLinks = document.querySelectorAll('h3.knswli-title > a');
titleLinks = [...titleLinks];
let articles = titleLinks.map(link => ({
title: link.getAttribute('title'),
url: link.getAttribute('href')
}));
return articles;
});
// In ra kết quả và đóng trình duyệt
console.log(articles);
await browser.close();
})();
view rawpuppet-parse.js hosted with ❤ by GitHub
Code của chúng ta sẽ mở Chrome lên, chạy đoạn code JavaScript phía trên, lấy kết quả và in ra và đóng trình duyệt.
Kết quả chương trình

Phức tạp hơn, tải hình vếu về ngắm!

Từ đầu tới giờ, lúc chạy chương trình, mình để headless : falseđể các bạn dễ nhìn, thực ra ta có thể cho puppetter chạy ngầm mà không cần giao diện.
Lần này, chúng ta thử sức với một thử thách khó khăn hơn, đó là tải hết toàn bộ hình vếu trong bài viết này: http://kenh14.vn/ai-roi-cung-khac-cac-hot-girl-nay-cung-khong-ngoai-le-khi-vong-1-cu-ngay-cang-phong-phao-20171207193958533.chn
Quá trình này cũng chỉ gồm 3 bước:
  1. Vào trang phía trên
  2. Load các tag img, tìm link các ảnh đó
  3. Tải các ảnh đó về máy
Nào, chúng mình cùng bắt đầu thôi:
1. Sau khi mò HTML của trang, ta thấy các ảnh nằm trong thẻ a có class là sp-img-zoom, sp-img-lightbox, detail-img-lightbox. Khỏi cần test trong console mà bắt đầu code luôn.
2. Các bạn mở cửa số cmd của project hiện tại, gõ npm install –save image-downloader để thêm thư viện tải ảnh.
3. Code thôi nào. Các bạn thấy đấy, do chúng ta không set headless:false nên chrome chạy ngầm mà không cần giao diện luôn!
const puppeteer = require('puppeteer');
const download = require('image-downloader');
(async() => {
const browser = await puppeteer.launch();
console.log('Browser openned');
const page = await browser.newPage();
const url = 'http://kenh14.vn/ai-roi-cung-khac-cac-hot-girl-nay-cung-khong-ngoai-le-khi-vong-1-cu-ngay-cang-phong-phao-20171207193958533.chn';
await page.goto(url);
console.log('Page loaded');
const imgLinks = await page.evaluate(() => {
let imgElements = document.querySelectorAll('.sp-img-zoom > img, .sp-img-lightbox > img, .detail-img-lightbox > img');
imgElements = [...imgElements];
let imgLinks = imgElements.map(i => i.getAttribute('src'));
return imgLinks;
});
console.log(imgLinks);
// Tải các ảnh này về thư mục hiện tại
await Promise.all(imgLinks.map(imgUrl => download.image({
url: imgUrl,
dest: __dirname
})));
await browser.close();
})();
view rawcrawl-veu.js hosted with ❤ by GitHub
Thành quả sao khi chạy code. Vếu vếu vếu. Bạn nào thèm vếu có thể thử ứng dụng “Em thèm vếu” do mình viết nhé.

Kết

Chúc mừng các bạn đã hoàn thành một bài tutorial khá khoai và dài hơi. Như các bạn thấy đấy, dùng puppeteer để cào dữ liệu có thể cào luôn được cả AJAX và các trang chứa JavaScript, rất tiện lợi.
Tuy nhiên, sức mạnh của puppeteer không chỉ có thế! Ở phần sau, mình sẽ cùng các bạn tìm hiểu về automation test và cách dùng pupeteer để viết automation test nhé.
Mọi thắc mắc các bạn cứ thoải mái comment trong bài viết nhé.
(Mục đích dùng lưu trữ)
Nội dung lấy từ đây:
https://toidicodedao.com/2017/12/19/puppeteer-headless-chrome-api-phan-2-cao-du-lieu-kenh14/#more-5100