>백엔드 개발 >Golang >golang 크롤러의 기본 구성 요소 및 작성 방법

golang 크롤러의 기본 구성 요소 및 작성 방법

PHPz
PHPz원래의
2023-04-25 16:19:25690검색

인터넷의 대중화와 정보화의 가속화로 인해 인터넷에 저장되는 데이터의 양이 점점 많아지면서 웹 크롤러는 많은 사람들에게 없어서는 안 될 도구가 되었습니다. 그중 golang 크롤러는 단순성, 효율성 및 확장성으로 인해 많은 프로그래머가 선호하는 크롤러 작성 언어가 되었습니다.

이 글에서는 golang 크롤러의 기본 구성요소와 작성 방법을 소개합니다.

1. golang 크롤러의 기본 구성 요소

  1. URL Manager(UrlManager)

URL Manager는 주로 크롤링해야 하는 URL 대기열 관리와 중복 제거 등 관련 작업을 담당합니다. 여기에는 주로 다음 기능이 포함됩니다.

  • URL 추가: 크롤링해야 할 URL을 대기열에 추가합니다.
  • URL 가져오기: URL 대기열에서 크롤링할 URL을 가져옵니다.
  • Storage URL: 해당 URL을 추가합니다. 크롤링되었습니다. 저장하세요.
  • 중복 제거: 동일한 URL의 반복 크롤링을 방지합니다.
  1. 웹페이지 다운로더(Downloader)

웹페이지 다운로더는 주로 해당 URL에 해당하는 웹페이지를 로컬로 다운로드하는 역할을 담당합니다. HTTP, HTTPS, FTP 등과 같은 URL의 다양한 특성에 따라 다양한 다운로드 방법을 사용할 수 있습니다. golang에서는 net/http와 같은 타사 라이브러리를 사용하여 웹 페이지를 다운로드할 수 있습니다.

  1. Webpage Parser(Parser)

Webpage Parser는 주로 다운로드한 웹페이지를 구문 분석하고 필요한 데이터를 가져와 저장하는 역할을 담당합니다. golang에서는 정규 표현식, html5 파서, goquery 및 기타 방법을 통해 웹 페이지를 구문 분석할 수 있습니다.

  1. 저장소

저장소는 주로 구문 분석된 데이터를 저장하는 역할을 하며 일반적으로 데이터베이스 저장과 로컬 파일 저장의 두 가지 방법이 있습니다. GORM, orm 등과 같은 타사 라이브러리를 데이터 저장을 위해 golang에서 사용할 수 있습니다.

2. golang 크롤러 작성 방법

  1. URL 관리자 만들기

URL 관리자는 주로 크롤링/크롤링할 URL을 관리하는 데 사용되며 URL 추가, URL 획득, URL 존재 여부 확인 등의 작업을 제공합니다. .

type UrlManager struct {
    Urls map[string]bool
}
// 新建URL管理器
func NewUrlManager() *UrlManager {
    return &UrlManager{Urls: make(map[string]bool)}
}
// 添加URL到管理器队列
func (um *UrlManager) AddUrl(url string) bool {
    if um.Urls[url] {
        // URL已经存在
        return false
    }
    um.Urls[url] = true
    return true
}
// 添加URL列表到管理器队列
func (um *UrlManager) AddUrls(urls []string) bool {
    added := false
    for _, url := range urls {
        if um.AddUrl(url) {
            added = true
        }
    }
    return added
}
// 判断URL是否存在
func (um *UrlManager) HasUrl(url string) bool {
    return um.Urls[url]
}
// 获取待爬取的URL
func (um *UrlManager) GetUrl() string {
    for url := range um.Urls {
        delete(um.Urls, url)
        return url
    }
    return ""
}
// 获取URL数量
func (um *UrlManager) UrlCount() int {
    return len(um.Urls)
}
  1. 웹페이지 다운로더 만들기

웹페이지 다운로더는 주로 지정된 URL에 해당하는 웹페이지 콘텐츠를 다운로드하고 반환하는 데 사용됩니다.

type Downloader struct {
    client *http.Client
}
// 新建网页下载器
func NewDownloader() *Downloader {
    return &Downloader{client: &http.Client{}}
}
// 网页下载
func (d *Downloader) Download(url string) ([]byte, error) {
    req, err := http.NewRequest("GET", url, nil)
    req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36")
    resp, err := d.client.Do(req)
    if err != nil {
        return nil, err
    }
    defer resp.Body.Close()
    // 读取响应正文内容
    contents, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        return nil, err
    }
    return contents, nil
}
  1. 웹 페이지 파서 만들기

웹 페이지 파서는 주로 다운로드한 웹 페이지 콘텐츠를 구문 분석하고 필요한 데이터를 추출하는 데 사용됩니다. 다음은 goquery를 예시로 사용하는 파서의 예입니다.

type Parser struct{}
// 新建网页解析器
func NewParser() *Parser {
    return &Parser{}
}
// 网页解析
func (parser *Parser) Parse(content []byte) []string {
    doc, err := goquery.NewDocumentFromReader(bytes.NewReader(content))
    if err != nil {
        log.Fatal(err)
    }
    var urls []string
    doc.Find("a").Each(func(i int, s *goquery.Selection) {
        href, exists := s.Attr("href")
        if exists && !strings.HasPrefix(href, "javascript") && len(href) > 1 {
            // 绝对路径和相对路径都考虑
            u, err := url.Parse(href)
            if err != nil {
                return
            }
            if u.IsAbs() {
                urls = append(urls, href)
                return
            }
            // 补全相对路径,例如:./abc --> http://example.com/abc
            base, _ := url.Parse(contentUrl)
            urls = append(urls, base.ResolveReference(u).String())
        }
    })
    return urls
}
  1. 스토리지 생성

스토리지는 주로 구문 분석된 데이터를 로컬 또는 데이터베이스에 저장하는 데 사용됩니다. 다음은 MySQL 데이터베이스를 예시로 보여줍니다. 크롤러 컨트롤러

  1. 크롤러 컨트롤러는 주로 크롤러의 예약 및 조정 기능을 구현합니다. 주요 프로세스는 다음과 같습니다.

URL 관리자, 웹페이지 다운로더, 웹페이지 파서 및 저장소를 초기화합니다.

    크롤링할 URL을 URL 관리자 대기열에 추가합니다.
  • 루프를 통해 크롤링할 URL을 얻습니다. URL이 크롤링되었는지 여부, 크롤링된 경우 URL을 건너뜁니다.
  • 웹페이지를 구문 분석하고 데이터를 검색합니다.
  • 추가합니다. 크롤링된 URL 목록의 URL입니다.
type Storage struct {
    db *gorm.DB
}
//新建数据存储器
func NewStorage() *Storage{
    db, _ := gorm.Open("mysql", "root:password@tcp(localhost:3306)/mydb?charset=utf8&parseTime=True&loc=Local")
    return &Storage{db:db}
}
// 保存数据到数据库
func (storage *Storage) SaveData(data []string) {
    for _, item := range data {
        storage.db.Create(&MyModel{Name: item})
    }
}
  • 완전한 코드
  • func Run() {
        // 初始化URL管理器、网页下载器、网页解析器、存储器
        urlManager := NewUrlManager()
        downLoader := NewDownloader()
        parser := NewParser()
        storage := NewStorage()
        // 添加待爬取的URL
        urlManager.AddUrl("http://example.com")
        // 爬虫运行
        for urlManager.UrlCount() > 0 {
            // 获取待爬取的URL
            url := urlManager.GetUrl()
            // 判断URL是否已爬取过
            if downLoader.IsCrawled(url) {
                continue
            }
            // 下载网页
            contents, err := downLoader.Download(url)
            if err != nil {
                continue
            }
            // 解析网页
            urls := parser.Parse(contents)
            // 存储数据
            storage.SaveData(urls)
            // 将URL添加到已爬取过的URL列表
            downLoader.AddCrawled(url)
            // 将解析出来的URL添加到URL队列中
            urlManager.AddUrls(urls)
        }
    }
  • 3. 요약
  • 골랑 크롤러는 단순성, 효율성, 확장성의 특징을 가지며, 자연스러운 동시성 장점으로 인해 데이터 크롤링 속도를 크게 높일 수 있습니다. 이 글은 독자들에게 더 많은 실무 경험을 쌓는 데 도움이 되기를 바라며 golang 크롤러의 기본 구성과 작성 방법을 소개합니다.
  • 위 내용은 golang 크롤러의 기본 구성 요소 및 작성 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.