인터넷의 대중화와 정보화의 가속화로 인해 인터넷에 저장되는 데이터의 양이 점점 많아지면서 웹 크롤러는 많은 사람들에게 없어서는 안 될 도구가 되었습니다. 그중 golang 크롤러는 단순성, 효율성 및 확장성으로 인해 많은 프로그래머가 선호하는 크롤러 작성 언어가 되었습니다.
이 글에서는 golang 크롤러의 기본 구성요소와 작성 방법을 소개합니다.
1. golang 크롤러의 기본 구성 요소
URL Manager는 주로 크롤링해야 하는 URL 대기열 관리와 중복 제거 등 관련 작업을 담당합니다. 여기에는 주로 다음 기능이 포함됩니다.
웹페이지 다운로더는 주로 해당 URL에 해당하는 웹페이지를 로컬로 다운로드하는 역할을 담당합니다. HTTP, HTTPS, FTP 등과 같은 URL의 다양한 특성에 따라 다양한 다운로드 방법을 사용할 수 있습니다. golang에서는 net/http와 같은 타사 라이브러리를 사용하여 웹 페이지를 다운로드할 수 있습니다.
Webpage Parser는 주로 다운로드한 웹페이지를 구문 분석하고 필요한 데이터를 가져와 저장하는 역할을 담당합니다. golang에서는 정규 표현식, html5 파서, goquery 및 기타 방법을 통해 웹 페이지를 구문 분석할 수 있습니다.
저장소는 주로 구문 분석된 데이터를 저장하는 역할을 하며 일반적으로 데이터베이스 저장과 로컬 파일 저장의 두 가지 방법이 있습니다. GORM, orm 등과 같은 타사 라이브러리를 데이터 저장을 위해 golang에서 사용할 수 있습니다.
2. golang 크롤러 작성 방법
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) }
웹페이지 다운로더는 주로 지정된 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 }
웹 페이지 파서는 주로 다운로드한 웹 페이지 콘텐츠를 구문 분석하고 필요한 데이터를 추출하는 데 사용됩니다. 다음은 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 }
스토리지는 주로 구문 분석된 데이터를 로컬 또는 데이터베이스에 저장하는 데 사용됩니다. 다음은 MySQL 데이터베이스를 예시로 보여줍니다. 크롤러 컨트롤러
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) } }
위 내용은 golang 크롤러의 기본 구성 요소 및 작성 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!