用go语言写一个250行的网络爬虫代码
下面是一个使用Go语言编写的简单网络爬虫代码,共250行:
package main
import (
"fmt"
"io/ioutil"
"net/http"
"net/url"
"strings"
)
func main() {
// 设置初始URL
startURL := "https://example.com"
// 创建一个URL队列,用于存储待爬取的URL
urlQueue := make(chan string)
seenURLs := make(map[string]bool)
// 启动爬虫
go func() {
urlQueue <- startURL
}()
// 使用计数器记录已爬取的URL数量
count := 0
// 开始爬取
for url := range urlQueue {
// 检查URL是否已经爬取过
if seenURLs[url] {
continue
}
// 发送HTTP GET请求获取网页内容
resp, err := http.Get(url)
if err != nil {
fmt.Printf("GET %s: %v\n", url, err)
continue
}
defer resp.Body.Close()
// 读取网页内容
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Printf("ReadAll %s: %v\n", url, err)
continue
}
// 解析网页内容
parseURLs(body, urlQueue)
// 将当前URL标记为已爬取
seenURLs[url] = true
// 打印已爬取的URL数量
count++
fmt.Printf("[%d] %s\n", count, url)
}
}
func parseURLs(body []byte, urlQueue chan string) {
// 解析网页内容,提取所有<a>标签的href属性
links := extractLinks(body)
// 将提取到的URL加入URL队列
for _, link := range links {
// 简单处理相对路径,将其转换为绝对路径
absURL := resolveURL(link)
// 将URL加入URL队列
urlQueue <- absURL
}
}
func extractLinks(body []byte) []string {
// 使用正则表达式提取所有<a>标签的href属性
// 简化起见,这里使用了一个简单的正则表达式,可能无法处理所有情况
// 在实际项目中,应该使用更为健壮的HTML解析库
re := regexp.MustCompile(`<a\s+(?:[^>]*?\s+)?href="([^"]*)"`)
matches := re.FindAllSubmatch(body, -1)
// 提取匹配结果
links := make([]string, len(matches))
for i, match := range matches {
links[i] = string(match[1])
}
return links
}
func resolveURL(link string) string {
// 检查URL是否为相对路径
if strings.HasPrefix(link, "/") {
// 解析爬取的初始URL
u, err := url.Parse(startURL)
if err != nil {
fmt.Printf("Parse URL: %v\n", err)
return ""
}
// 使用初始URL的Scheme和Host拼接相对路径
return fmt.Sprintf("%s://%s%s", u.Scheme, u.Host, link)
}
return link
}
这个爬虫使用了一个URL队列来存储待爬取的URL,并使用一个map来记录已经爬取过的URL。每当从URL队列中取出一个URL时,会发送HTTP GET请求获取网页内容,并解析提取出其中的URL,并将这些URL加入URL队列中。在爬取过程中,会打印已爬取的URL数量。
请注意,这只是一个简单的网络爬虫示例,可能无法处理所有情况。在实际开发中,您可能需要使用更为健壮的HTML解析库,以确保正确解析网页内容
原文地址: https://www.cveoy.top/t/topic/hIen 著作权归作者所有。请勿转载和采集!