Ý tưởng chính của tool này là bóc tách dữ liệu từ mã html của trang báo điện tử vnexpress.net. Sử dụng Regular Expression, xử lý chuỗi có được để lọc ra tiêu đề, tóm tắt, nội dung. Sau đó lưu những nội dung này vào cơ sở dữ liệu của chúng ta.
Chúng ta có thể dùng tool này để đăng tin nhanh lên website của mình mà không cần phải thao tác nhiều! Góp phần làm nội dung website phong phú thêm, đặc biệt là các website về tin tức.
Chuẩn bị:
- IIS 6.x hay 7.x đều được chứa thư mục web là VNExpress
- Tạo một database mới, ở đây mình dùng MS SQL Server.
- Sử dụng Visual Studio để viết code, thiết kế giao diện và tạo chuỗi kết nối đến database.
- Copy đầy đủ các tệp tin khác như hình ảnh, java, Editor Script,...
Tiến hành:
Bước 1: Thiết kế cơ sỡ dữ liệu
- Khởi động MS SQL Server và tạo database mới với tên VNEXPRESS
- Chọn database vừa tạo và Run đoạn Query sau:
CREATE TABLE TINTUC
(
ID INT IDENTITY PRIMARY KEY,
CHUYENMUC NVARCHAR(50),
TIEUDE NVARCHAR(200),
MOTA NVARCHAR(1000),
NOIDUNG NVARCHAR(MAX),
NGAYPOST SMALLDATETIME
)
Đoạn trên là cấu trúc table chứa tin tức cần lưu, bạn có thể thay đổi cấu trúc này cho phù hợp với một website có sẵn.
Bước 2: Giao diện chung
- Dùng Visual Studio tạo một website trống mới, add một webform với tên Default.aspx
Chuyển qua chế độ Design View và sử dụng HTML Toolbox để chèn vào 1 table 2 dòng 5 cột.
Table này chứa các thành phần như: Dropdownlist, Button, hình ảnh và các label Title, Description, Content,...
Bước 3: Viết code
- Chuyển qua chế độ Source của file Default.aspx, thêm đoạn sau ở phần HEADER
<link href="scripts/style.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="scripts/jquery-1.4.4.min.js"></script>
<script language="javascript" type="text/javascript" src="scripts/CLEditor1_2/jquery.cleditor.min.js"></script>
<link href="scripts/CLEditor1_2/jquery.cleditor.css" rel="stylesheet" type="text/css" />
<script type="text/javascript">
$(document).ready(function () {
$("#txtContent").cleditor({
width: 600,
height: 400,
});
});
</script>
- Tiếp tục mở file code behind Default.aspx.cs và thực hiện viết các đoạn xử lý sự kiện, xử lý chuỗi,..
Ở đây mình chỉ nêu ra một số đoạn chính, phần còn lại các bạn có thể download mã nguồn về để tham khảo
Sự kiện Page_Load. Khi người dùng bắt đầu load trang, thì một Dropdownlist sẽ được tạo ra, chứa các Chuyên mục tin tức cần được lấy.
{
if (!IsPostBack)
{
string[,] Categories = { { "----Chọn Chuyên Mục----", "" },
{ "Xã hội", "http://vnexpress.net/GL/Xa-hoi/" },
{ "Thế giới", "http://vnexpress.net/GL/The-gioi/" },
{ "Kinh doanh", "http://vnexpress.net/GL/Kinh-doanh/" },
{ "Văn hóa", "http://vnexpress.net/GL/Van-hoa/" },
{ "Thể thao", "http://vnexpress.net/GL/The-thao/" },
{ "Pháp luật", "http://vnexpress.net/GL/Phap-luat/" },
{ "Đời sống", "http://vnexpress.net/GL/Doi-song/" },
{ "Khoa Học", "http://vnexpress.net/GL/Khoa-hoc/" },
{ "Vi tính", "http://vnexpress.net/GL/Vi-tinh/" },
{ "Ô tô - Xe máy", "http://vnexpress.net/GL/Oto-Xe-may/" },
{ "Cười", "http://vnexpress.net/GL/Cuoi/" } };
for (int i = 0; i < Categories.GetLength(0); i++)
{
ddlCategory.Items.Add(new ListItem(Categories[i, 0], Categories[i, 1]));
}
}
}
- Sự kiện khi người dùng chọn 1 chuyên mục bất kì:
// Su kien cho List Category
protected void ddlCategory_OnSelectedIndexChanged(Object Source, EventArgs e)
{
if (ddlCategory.SelectedIndex != -1 && ddlCategory.SelectedItem.Value != "")
{
string[,] ListTopic = GetTitleAndLinkofTopic(GetWebContent(ddlCategory.SelectedItem.Value));
ddlTopic.Items.Clear();
for (int i = 0; i < ListTopic.GetLength(0); i++)
{
ddlTopic.Items.Add(new ListItem(ListTopic[i, 0], ListTopic[i, 1]));
}
}
}
- Sau khi chọn chuyên mục, người dùng sẽ tiến hành chọn các tin cần đăng, hàm xử lý sự kiện chọn tin như sau:
// Su kien chon List Topic
protected void ddlTopic_OnSelectedIndexChanged(Object Source, EventArgs e)
{
if (ddlTopic.SelectedIndex != -1 && ddlTopic.SelectedItem.Value != "")
{
string Content = GetWebContent(ddlTopic.SelectedItem.Value);
txtTitle.Text = GetTitle(Content);
txtDescription.Text = GetDescription(Content);
InsertSpecialChar(ref Content);
txtContent.Text = GetContent(Content);
}
}
- Hàm tải nội dung HTLM của một địa chỉ cho trước
public string GetWebContent(string strLink)
{
string strContent = "";
try
{
WebRequest objWebRequest = WebRequest.Create(strLink);
objWebRequest.Credentials = CredentialCache.DefaultCredentials;
WebResponse objWebResponse = objWebRequest.GetResponse();
Stream receiveStream = objWebResponse.GetResponseStream();
StreamReader readStream = new StreamReader(receiveStream, System.Text.Encoding.UTF8);
strContent = readStream.ReadToEnd();
objWebResponse.Close();
readStream.Close();
}
catch (Exception ex)
{
return ex.Message;
}
return strContent;
}
- Tiếp theo là các hàm Regex để bóc tách dữ liệu. Ở đây mình chỉ nêu ra phần lấy Tiêu Đề của tin tức, các hàm sau tương tự, các bạn có thể tham khảo ở file mã nguồn
// Lay tieu de
public string GetTitle(string Content)
{
string pattern = "[^<]+";
Regex Title = new Regex(pattern);
Match m = Title.Match(Content);
if (m.Success)
return m.Value.Substring(16,m.Value.Length-16);
return "";
}
- Hàm xử lý sự kiện button click để đưa dữ liệu vào Database của chúng ta, cái này quan trọng nhất, ko có nó thì tool này vô nghĩa ;))
// Su kien Submit dua du lieu vao DB
protected void btnSubmit_OnClick(object sender, EventArgs e)
{
if (txtTitle.Text != "" && txtDescription.Text != "" && txtContent.Text != "")
{
SqlDataSource1.InsertParameters["CHUYENMUC"].DefaultValue = ddlCategory.SelectedItem.Text;
SqlDataSource1.InsertParameters["TIEUDE"].DefaultValue = txtTitle.Text;
SqlDataSource1.InsertParameters["MOTA"].DefaultValue = txtDescription.Text;
SqlDataSource1.InsertParameters["NOIDUNG"].DefaultValue = txtContent.Text;
SqlDataSource1.InsertParameters["NGAYPOST"].DefaultValue = DateTime.Now.ToString();
SqlDataSource1.Insert();
Response.Write("<script type="text/javascript"><!--mce:0--></script>");
txtTitle.Text = "";
txtDescription.Text = "";
txtContent.Text = "";
}
else
Response.Write("<script type="text/javascript"><!--mce:1--></script>");
}
Dữ liệu sau khi Click button sẽ được đưa vào Database của MS SQL Server
Trước khi có hàm xử lý sự kiện button click ở trên thì thiết lập chuỗi kết nối tới Database trước nhé. Ở chế độ Design của file Default.aspx thực hiện kéo và thả SqlDataSource trong Toolbox vào.
Chuỗi kết nối trong file Web.config sẽ có dạng
<add name="VNExpress" connectionString="Data Source=.;User ID=sa;Password=abc123!@#;persist security info=False;initial catalog=VDMayViTinh;" providerName="System.Data.SqlClient"/>
Như vậy là các bước chính để hoàn thành tool lấy tin tức tự động từ Vnexpress.Net mình đã trình bày xong. Phần còn lại là mắm muối các bạn có hoàn toàn thể thêm vào/thay đổi cho phù hợp với website của bạn. Chúc bạn thực hiện thành công, có được một tool hữu ích!