/ / Cách cạo trang web bằng Go và goquery

Cách cạo trang web bằng Go và goquery

Gỡ dữ liệu web, còn được gọi là trích xuất dữ liệu web, là một phương pháp tự động trích xuất dữ liệu hoặc nội dung từ các trang web.

Trình duyệt web tự động khai thác dữ liệu mà không cần sự can thiệp của con người. Người quét truy cập một trang web bằng cách gửi các yêu cầu HTTP, giống như một trình duyệt web. Tuy nhiên, thay vì hiển thị HTML mà nó tìm nạp, nó xử lý nó theo hướng dẫn của bạn và lưu trữ kết quả.

Công cụ tìm kiếm trên web rất hữu ích cho việc tìm nạp dữ liệu từ các trang web không cung cấp API. Chúng phổ biến trong các lĩnh vực như khoa học dữ liệu, an ninh mạng, giao diện người dùng và phát triển phụ trợ.


Web Scraping trong Go

Trong Go, có nhiều gói lọc web khác nhau. Các ứng dụng phổ biến bao gồm goquery, Colly và ChromeDP.

ChromeDP là một gói trình điều khiển web giống như selen. Nó hỗ trợ giao thức công cụ dành cho nhà phát triển Chrome trong Go mà không có phụ thuộc.

Colly là một thư viện dành riêng cho việc tìm kiếm web được xây dựng bằng cách sử dụng goquery. Nhưng goquery là tùy chọn nhanh hơn để tìm kiếm các trang web trong Go.

Truy vấn là gì?

Thư viện CSS, jQuery, đã giúp truyền cảm hứng cho goquery. Đó là một thư viện Go dựa trên gói net / html, thực hiện một trình phân tích cú pháp và trình mã hóa tuân thủ HTML5. Nó cũng sử dụng gói Cascadia, thực hiện các bộ chọn CSS để sử dụng với trình phân tích cú pháp được cung cấp bởi net / html.

Cài đặt goquery

Chạy lệnh bên dưới trong thiết bị đầu cuối của bạn để cài đặt goquery. Nếu bạn gặp bất kỳ lỗi nào, hãy thử cập nhật phiên bản Go của bạn.

LÀM VIDEO TRONG NGÀY
go get github.com/PuerkitoBio/goquery

Quy trình Scraping trên Web

Bạn có thể chia quy trình cạo tổng thể thành ba nhiệm vụ nhỏ hơn:

  1. Thực hiện các yêu cầu HTTP.
  2. Sử dụng bộ chọn và bộ định vị để lấy dữ liệu cần thiết.
  3. Lưu dữ liệu trong cơ sở dữ liệu hoặc các cấu trúc dữ liệu để xử lý thêm.

Thực hiện các yêu cầu HTTP khi đang di chuyển

Bạn có thể gửi các yêu cầu HTTP bằng cách sử dụng net / http mà thư viện tiêu chuẩn Go bao gồm.

package main

import "net/http"
import "log"
import "fmt"

func main() {
webUrl := "https:
response, err:= http.Get(webUrl)

if err != nil {
log.Fatalln(err)
} else if response.StatusCode == 200 {
fmt.Println("We can scrape this")
} else {
log.Fatalln("Do not scrape this")
}
}

http.Get trả về một nội dung phản hồi và một lỗi. response.StatusCode là mã trạng thái yêu cầu-phản hồi.

Khi thực hiện các yêu cầu HTTP, nếu mã trạng thái phản hồi là 200 bạn có thể tiến hành cạo trang web.

Nhận dữ liệu cần thiết bằng truy vấn

Lấy HTML của trang web

Đầu tiên, bạn phải phân tích cú pháp HTML thuần túy từ phản hồi (response.body) để có được một đối tượng tài liệu hoàn chỉnh đại diện cho trang web:

document, err := goquery.NewDocumentFromReader(response.Body)

if err != nil {
log.Fatalln(err)
}

Bây giờ bạn có thể sử dụng đối tượng tài liệu để truy cập cấu trúc và nội dung của trang web.

Chọn các phần tử bắt buộc từ HTML

Bạn sẽ cần phải kiểm tra trang web để kiểm tra cấu trúc của dữ liệu bạn cần trích xuất. Điều này sẽ giúp bạn tạo một bộ chọn để truy cập nó.

Sử dụng bộ chọn và bộ định vị, bạn có thể trích xuất HTML bạn cần bằng cách sử dụng Tìm thấy phương thức của đối tượng tài liệu.

Các Tìm thấy phương thức sử dụng bộ chọn CSS để xác định vị trí phần tử chứa dữ liệu bạn yêu cầu:

document.Find("tr.athing")

Đoạn mã trên chỉ trả về phần tử HTML đầu tiên phù hợp với bộ chọn hoặc một danh sách trống nếu không có sự trùng khớp nào cả.

Chọn nhiều phần tử từ HTML

Thông thường, bạn sẽ muốn tìm nạp tất cả các phần tử HTML phù hợp với bộ chọn của mình.

Bạn có thể chọn tất cả các phần tử phù hợp trong HTML bằng cách sử dụng Mỗi phương pháp của giá trị đó Tìm thấy() lợi nhuận. Các Mỗi phương thức nhận vào một hàm có hai tham số: một chỉ mục và một bộ chọn kiểu *goquery.Selection.

document.Find("tr.athing").Each(func(index int, selector *goquery.Selection) {
})

Trong phần thân hàm, bạn có thể chọn dữ liệu cụ thể mà bạn muốn từ HTML. Trong trường hợp này, bạn cần các liên kết và tiêu đề của mọi bài đăng mà trang liệt kê. Sử dụng Tìm thấy phương thức của tham số bộ chọn để thu hẹp tập hợp các phần tử và trích xuất giá trị văn bản hoặc thuộc tính.

document.Find("tr.athing").Each(func(index int, selector *goquery.Selection) {
title := selector.Find("td.title").Text()
link, found := selector.Find("a.titlelink").Attr("href")
})

Đoạn mã trên gọi Bản văn phương pháp của kết quả từ selector.Find để trích xuất nội dung của một ô trong bảng. Việc chọn các thuộc tính — như URL liên kết và URL hình ảnh — yêu cầu bạn sử dụng Attr phương pháp. Phương thức này cũng trả về một giá trị cho biết thuộc tính có tồn tại hay không.

Quá trình này giống nhau đối với việc chọn bất kỳ phần tử và thuộc tính nào trên một trang web.

Các Tìm thấy phương pháp này rất mạnh mẽ, cho phép một loạt các hoạt động để chọn và định vị các phần tử HTML. Bạn có thể khám phá những điều này trong tài liệu truy vấn.

Lưu dữ liệu cóp nhặt

Thuộc tính liên kết và tiêu đề là các chuỗi mà bạn có thể gán cho các biến. Trong các tình huống thực, bạn sẽ lưu vào cơ sở dữ liệu hoặc cấu trúc dữ liệu để thao tác. Thông thường, một cấu trúc tùy chỉnh đơn giản là đủ.

Tạo một cấu trúc với tiêu đề và liên kết của các trường và một phần cấu trúc để giữ kiểu cấu trúc.

type Information struct {
link string
title string
}
info := make([]Information, 0)

Khi bạn đã tạo cấu trúc và lát cắt, trong phần nội dung của hàm phương thức tài liệu, hãy điền lát cắt vào hàm mà bạn chuyển cho phương thức Tìm. Sử dụng kiểu struct để khởi tạo cấu trúc dữ liệu mới, mỗi cấu trúc chứa một kết quả.

info = append(info, Information{
title: title,
link: link,
})

Điều này nối các loại Thông tin(cấu trúc) đến thông tin(phần) mà từ đó bạn có thể thao tác dữ liệu theo ý muốn.

Việc in phần này cho thấy rằng bạn đã quét thành công trang web và điền vào phần đó.

fmt.Println(info)

Điều hợp lý là lưu dữ liệu cóp nhặt trong bộ nhớ cache cục bộ để bạn không nhấn vào máy chủ của trang web nhiều hơn mức cần thiết. Điều này sẽ không chỉ làm giảm lưu lượng truy cập mà còn tăng tốc ứng dụng của bạn vì truy xuất dữ liệu cục bộ nhanh hơn so với việc đưa ra yêu cầu và xử lý trang web.

Có nhiều gói cơ sở dữ liệu trong Go mà bạn có thể sử dụng để lưu dữ liệu. Gói cơ sở dữ liệu / sql hỗ trợ cơ sở dữ liệu SQL. Ngoài ra còn có các ứng dụng khách cơ sở dữ liệu NoSQL như trình điều khiển MongoDB Go và cơ sở dữ liệu không máy chủ như FaunaDB sử dụng trình điều khiển FaunaDB.

Bản chất của Web Scraping in Go

Nếu bạn đang cố gắng thu thập dữ liệu từ một trang web, goquery là một nơi tuyệt vời để bắt đầu. Nhưng đó là một gói mạnh mẽ có thể làm được nhiều việc hơn là chỉ quét web. Bạn có thể tìm hiểu thêm về chức năng của nó trong tài liệu chính thức của dự án.

Lướt web là một kỹ năng quan trọng trong các lĩnh vực công nghệ khác nhau và nó sẽ có ích trong nhiều dự án của bạn.


hướng đối tượng-go

Cách triển khai khái niệm lập trình hướng đối tượng trong Go

Đọc tiếp


Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *