Kết nối Python với MariaDB trên Anaconda

Trong nhiệm vụ crawl dữ liệu cho những dự án linh tinh của mình, việc cần thiết là phải lưu trữ lại các dữ liệu trong một hệ quản trị cơ sở dữ liệu nào đó, mình đã chọn MariaDB để làm điều này.
Vì việc lựa chọn Python trên Anaconda để thực hiện nên mình cần một hệ quản trị cơ sở dữ liệu nào đó vừa nhẹ, dễ sử dụng và quen thuộc. Đối với SQL Server và Oracle thì quá quen thuộc nhưng phải cài đặt nó mất rất nhiều thời gian mà không cần thiết vì nó hơi to so với dự án của mình. Với lại Oracle thì mình cũng đã kết nối được với Python rồi. Sử dụng No SQL thì mình đã từng sử dụng Nodejs kết nối với MongoDB thì thực sự mình không ưa cái anh MongoDB này lắm vì thấy cũng hơi phức tạp.
Cái tên quen thuộc nữa là MySQL, ban đầu định dùng nó nhưng đúng là lúc đó đang gặp vấn đề về việc cài đặt Xampp và Wampp lên máy tính ở nhà (do xung đột một số cổng của các phần mềm khác như Skype…). Với có thông tin rằng MySQL dần dần không còn là nguồn mở nữa, anh bạn Oracle đã mua lại và không còn được hào phóng như cộng đồng nguồn mở nữa. Cho nên cái nên MariaDB là lựa chọn cuối cùng của mình.

  • MariaDB là một phiên bản khác của MySQL và được cộng đồng nguồn mở dần chuyển qua để thay thế cho MySQL ngày càng đóng lại.
    Để cài đặt MariaDB thì khá đơn giản, hoàn toàn có thể cài đặt được ở máy tính cá nhân và trên server. Các bạn có thể vào địa chỉ: https://mariadb.com/downloads/#mariadb_platform-mariadb_server để tải về và cào đặt dễ dàng (chỉ cần next thôi).
  • Trong gói này mặc định có một GUID để thao tác các câu lệnh trên đó là HeidiSQL. Ta có thể sử dụng nó để thực hiện các truy vấn cơ bản tới cơ sở dữ liệu MySQL hoặc MariaDB.

Về phần DB là xong, để kết nối từ Python tới MariaDB ta cần sử dụng một thư viện để thực hiện kết nối và thực hiện các câu lệnh như Select, Insert, Update, Delete. Vì MariaDB là một phiên bản được fork từ MySQL nên ta có thể sử dụng thư viện mysql-connector.

Trên Anaconda ta có 2 cách để cài đặt thư viện là:

  1. Vào mục Environments, tìm gói đã được Anaconda tập hợp vừa tương thích Python và tương thích với các thư viện khác.
  2. Nếu cách trên không được do một lỗi nào đó hoặc Anaconda chưa hỗ trợ thì ta có thể cài đặt thực tiếp thông qua dòng lệnh. Có thể tham khảo thông qua hướng dẫn: https://enterprise-docs.anaconda.com/en/latest/data-science-workflows/data/mariadb.html

Khi mọi thứ done ta có thể sử dụng đoạn lệnh sau để test kết nối.

import pandas as pd
 import numpy as np
 import matplotlib.pyplot as plt
 import seaborn as sns
 %matplotlib inline
 from urllib.request import urlopen
 from bs4 import BeautifulSoup
 #
 import MySQLdb
 db = MySQLdb.connect(host="127.0.0.1", port=2017, user="root", passwd="test", db="test")
 c = db.cursor()
 a1="https://trituenhantao.info/posts"
 c.execute("SELECT url FROM test")
 d=c.fetchall()
 a2=0
 for url in d:
     #if url.startswith('http://trituenhantao.info'):
         a2=a2+1
         print(f'{a2} URL: {url}')
         print(url)
 print(c.fetchone())

Convert csv sang excel với pandas trên Anaconda

Trong quá trình làm việc, mình rất hay phải thao tác với các file csv, excel, html… vì liên quan đến nhiều các phòng ban và làm việc nhiều với dữ liệu, báo cáo.
Đặc thù hệ thống bên mình sử dụng Oracle, họ đã viết sẵn các thủ tục chỉ có thể xuất ra các file có định dạng là csv và html. Nhưng đối với mọi người thì dùng excel thuận tiện hơn, không chỉ IT mà các phòng khác như kế toán… Thế nên mọi người, trong đó cả mình thường xuyên phải chuyển file csv sang định dạng excel để xử lý.
Để chuyển csv sang excel có nhiều cách:

  • Sử dụng tính năng Load data từ file csv có sẽ trong Excel. Cách này đòi hỏi vài bước để xử lý, nhất là đối với dữ liệu text toàn chữ số dài và Tiếng Việt có dấu.
  • Sử dụng tính năng convert trên mạng, có thể google.

Đa phần mọi người đều phải dùng tính năng của excel vì không thể tùy tiện dùng các tool linh tinh nhất là trên mạng vì tính nhạy cảm của dữ liệu. Thế là mình nghĩ ra việc tự làm tool hoặc script xử lý vấn đề trên cho bản thân. Đơn giản là convert từ csv sang excel.
Ban đầu định dùng .NET vì mình đã triển khai nhiều tool cho công việc. Nhưng hiện mình đang mày mò Machine Learning với Anaconda nên mình nghĩ viết bằng Python xem sao.
Với Python có thư viện pandas xử lý rất tốt về mặt dữ liệu, đặc biệt là dữ liệu với excel và csv. Đối với Anaconda thì pandas là một trong những thư viện mặc định trong đó nên không cần cài đặt gì cả.
Đoạn code rất đơn giản như sau:

import pandas as pd 

data = pd.read_csv("C:/Users/SVPK/Desktop/Extract_warranty_201909.csv",delimiter = ';',prefix = 'T',header = 0)  

# print(data) 

 data.to_excel("C:/Users/SVPK/Desktop/Extract_warranty_201909.xlsx") 

Mình giải thích qua đoạn code trên như sau:
Mục đích sẽ load dữ liệu từ csv lên một biến, sau đó tiến hành ghi nó ra file excel.(Đơn giản vậy thôi)
Các tham số chủ yếu mình đã thử là:

  • delimiter: Mặc định csv nó là dấu ‘,’ nhưng hệ thống mình toàn sử dụng dấu ‘;’ để ngăn cách trong file csv
  • prefix: Đối với file mà không chứ tên cột mà muốn đặt tên cột thì mình để tiền tố này để nó đặt mặc định
  • header: Vì có tên cột với không có tên cột nên thực chất data của mình sẽ bắt đầu từ đâu sẽ do tham số này quyết định.

Từ đây dùng cho mình ok, nhưng nhược điểm khó chuyển cho người khác dùng vì phải cài Anaconda hoặc ít nhất là python và pandas. Nên mình đang nghĩ các cách để dùng như:

  • Tạo 1 thư mục cho mọi người ftp để đẩy file vào. Mình có 1 job quét và xử lý sau đó đưa file kết quả sang 1 thư mục khác để mọi người dùng.
  • Tạo một tính năng trên Tool để mọi người upload lên và tải file kết quả xuống (hoặc nhập email để gửi về)
  • Gửi email đến email của mình. Mình sẽ dùng job trên Pentaho tiến hành tự load email, bóc tách file đính kèm, xử lý và gửi trả lại.

Thôi, tạm thời thế đã, dùng Anaconda để chạy cho riêng mình vậy.

Xóa dấu Tiếng Việt

Trong quá trình làm việc với Oracle trên Toad, mình hay lưu các câu lệnh SQL ra file SQL hoặc biên dịch các package, procedure có chứa các đoạn text có dấu Unicode – cụ thể là Tiếng Việt có dấu. Nhưng mình hay thấy sau khi load file SQL lại lên thì toàn bộ dấu Tiếng Việt bị lỗi, tự nó chuyển sang dấu hỏi. Việc này gây cho mình nhiều lúc bực mình vì bị lỗi hết đoạn text không đọc được, có thể do mình chưa config Toad để có thể phù hợp với Tiếng Việt.

Bình thường mình hay xử lý bằng cách làm thủ công bằng tay chuyển các đoạn text có dấu thành Tiếng Việt không dấu hoặc viết bằng Tiếng Anh. Nhưng như thế là không thuận lợi, mình không thích thế.

Tiện thể mình đang có 1 cái webtool bằng .NET tạo ra các tính năng dành riêng cho mình xử lý các công việc thường ngày. Mình liền xây dựng một tính năng nho nhỏ chuyển 1 đoạn text Tiếng Việt có dấu thành đoạn text Tiếng Việt không dấu.
Tính năng này rất đơn giản, chỉ có 2 ô textbox ở chế độ Multiline và một nút bấm. Nút bấm sẽ tiến hành việc xử lý lấy đoạn text ở textbox 1 tiến hành convert thành không dấu và chuyển sang ô textbox 2.

Mình tách thành một hàm riêng để xử lý như sau:

public static string RemoveUnicode(string text)
         {
             string[] arr1 = new string[] { "á", "à", "ả", "ã", "ạ", "â", "ấ", "ầ", "ẩ", "ẫ", "ậ", "ă", "ắ", "ằ", "ẳ", "ẵ", "ặ",
         "đ",
         "é","è","ẻ","ẽ","ẹ","ê","ế","ề","ể","ễ","ệ",
         "í","ì","ỉ","ĩ","ị",
         "ó","ò","ỏ","õ","ọ","ô","ố","ồ","ổ","ỗ","ộ","ơ","ớ","ờ","ở","ỡ","ợ",
         "ú","ù","ủ","ũ","ụ","ư","ứ","ừ","ử","ữ","ự",
         "ý","ỳ","ỷ","ỹ","ỵ",};
             string[] arr2 = new string[] { "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a",
         "d",
         "e","e","e","e","e","e","e","e","e","e","e",
         "i","i","i","i","i",
         "o","o","o","o","o","o","o","o","o","o","o","o","o","o","o","o","o",
         "u","u","u","u","u","u","u","u","u","u","u",
         "y","y","y","y","y",};
             for (int i = 0; i < arr1.Length; i++)
             {
                 text = text.Replace(arr1[i], arr2[i]);
                 text = text.Replace(arr1[i].ToUpper(), arr2[i].ToUpper());
             }
             return text;
         }

Build lên thế là xong. Mình có thể triển khai ở các ngôn ngữ lập trình khác nhau một cách tương tự.

Crawl một trang về thơ ca

Đây sẽ là một dự án làm cho vui. Mình sẽ crawl toàn bộ các bài thơ của trang: http://vanhoc.xitrum.net/thoca/ về đặt lên wordpress xem chơi.

Bắt đầu từ ngày mai nhé 2019-10-11. 😀

Update: 11/10/2019

Đã triển khai việc crawl danh sách các link liên quan đến thơ ca nội bộ của trang. Kết quả code và dữ liệu nằm tại đường dẫn:

  • Code: https://github.com/phamkhactuy/python_crawl_thoca/blob/master/20191011_crawl_link.py
  • Data: https://github.com/phamkhactuy/python_crawl_thoca/blob/master/thoca.csv

Với dữ liệu này bước tiếp theo phải xử lý:

  • Cần làm sạch dữ liệu, chỉ lấy link có dữ liệu là bài thơ mà thôi
  • Tiếp tục crawl dữ liệu nội bộ trang, loại bỏ trùng lặp
  • Dựng local wordpress để đẩy dữ liệu vào

Update: 08/11/2019

Lơ là một thời gian mới quay lại triển nốt cái này cho dứt điểm.

Dựng local wordpress để đẩy dữ liệu vào: phần này đơn giản sử dụng phần mêm Xampp, sau đó tải wordpress về cài đặt là xong.

Đầu tiên bóc tách thử dữ liệu của một link

Đầu tiên bóc tách thử dữ liệu của một link thì phát hiện thấy cấu trúc của xitrum viết theo dạng cũ sử dụng bảng. Tạm thời chỉ cần lấy Tiêu đề và nội dung của bài viết. Tiêu đề thì ta chỉ lấy riêng text còn nội dung thì lấy cả cấu trúc HTML (gồm div, thẻ b…). Phần này sử dụng Python với thư viện BeautifulSoup, đáng lưu ý là việc lấy thẻ table với các tham số đặc biệt của table chứa nội dung bài thơ là: {“border”:”0″, “width”:”90%”,”cellpadding”:”3″,”cellspacing”:”0″}
Chi tiết code tại: https://github.com/phamkhactuy/python_crawl_thoca/blob/master/Get_content_from_link.py

Tiếp đến ta sẽ tiến hành đưa dữ liệu vào bảng của wordpress là một bài viết mới. Mỗi một bài viết mới là một dòng dữ liệu trong bảng POSTS. Ta sẽ tiến hành chuẩn bị dữ liệu để insert vào bảng này. Ta cần lưu ý một số điểm:

  • Để kết nối với CSDL và hiển thị tốt Tiếng Việt ta sử dụng mã utf-8 (# –– coding: utf-8 –-) trong file python.
  • ID của bảng POSTS sẽ tăng dần nên phải vào đó lấy ID mới nhất và cộng thêm 1. Với ID này ta cũng dùng để làm đường dẫn đến bài viết luôn.
  • User thì ta sử dụng user mặc định Admin có ID là 1.
  • Thời gian tạo và sửa đổi ta sử dụng hàm NOW() hoặc SYSDATE()

Chi tiết code tại: https://github.com/phamkhactuy/python_crawl_thoca/blob/master/Save_content_in_wordpress.py

Load dữ liệu từ file csv lên với thư viện Pandas. Đối với file csv ta cần chuẩn hóa bỏ toàn bộ dấu ngoặc kép và loại bỏ các link trùng bằng excel. Mục tiêu của ta sẽ lấy dữ liệu của từng link và đưa vào bảng POSTS của wordpress. Thử load và in ra màn hình lần lượt từng row trong file csv.
Chi tiết code tại: https://github.com/phamkhactuy/python_crawl_thoca/blob/master/Get_link_from_filecsv.py

Cuối cùng ta có thể ghép code

Cuối cùng ta có thể ghép code các phần trên này lại để lấy lần lượt nội dung từng link để đưa vào CSDL wordpress. Trong phần này ta cần lưu ý đối với mỗi link, ta lấy được 2 cấu trúc table như nhau về định danh (cùng là table và có tham số table là {“border”:”0″, “width”:”90%”,”cellpadding”:”3″,”cellspacing”:”0″}) nhưng 1 cái sẽ là nội dung ta cần lấy. Một cái sẽ là gợi ý các link khác mà ta không cần vì nó không phải là nội dung thơ văn. Và một điều lưu ý nữa là chỉ các link có nội dung là bài thơ mới có cấu trúc ta đã chỉ ra ở trên, các link list tác giả, list bài thơ, list mục sẽ không cấu trúc đó nên sẽ không insert vào hệ thống (Nếu cùng cấu trúc thì ta phải chuẩn hóa các link trước).
Chi tiết code tại: https://github.com/phamkhactuy/python_crawl_thoca/blob/master/Finall_code_crawl.py

Link data.

Ta đã có kết quả cho việc crawl này

https://raw.githubusercontent.com/phamkhactuy/python_crawl_thoca/master/Trang_quan_tri.JPG
https://raw.githubusercontent.com/phamkhactuy/python_crawl_thoca/master/insert_POSTS.JPG
https://raw.githubusercontent.com/phamkhactuy/python_crawl_thoca/master/Giao_dien_trang.JPG

Khởi động app theo đặc quyền

Chuyện là hôm nay đồng nghiệp mình tiến hành thực hiện một số thao tác cập nhật một số file xml trong ứng dụng nhưng không được. Hệ thống báo không có quyền mặc dù việc này bình thường vẫn có thể làm được. Ứng dụng bên mình code bằng Java chạy trên webserver là tomcat. Qua kiểm tra thì thấy gần đây App Tomcat được khởi động lại bằng quyền root. Bình thường thì việc reset App Tomcat chỉ được thực hiện với quyền bình thường (không phải quyền root).

Lý giải điều này là do việc phân quyền trên Linux. Việc cài đặt hay reset app trên Linux với quyền khác nhau là khác nhau trên Linux. Khi reset bằng quyền root thì với các user khác sẽ gặp một số vấn đề về quyền khi truy cập một số file trên đó. Phần này mình chưa rõ lắm nhưng cần note lại để sau tìm hiểu thêm.

Cách khắc phục thì phải stop app Tomcat bằng quyền root và sau đó start bằng quyền vẫn hay sử dụng.

Nhưng trên window thì theo mình thấy không vấn đề gì cả.