使用Go语言实现豆瓣电影Top250爬虫
一、项目概述
本爬虫程序使用Go语言实现对豆瓣电影Top250榜单数据的抓取,主要功能包括多页爬取、电影信息提取和格式化展示。通过该案例可以学习到HTTP请求处理、正则表达式匹配和基础并发控制等爬虫核心技术。
二、实现思路
- 分页处理机制:通过构造start参数实现分页,每页包含25部电影
- 请求伪装:设置浏览器User-Agent绕过基础反爬
- 数据提取:使用正则表达式匹配关键数据
- 数据验证:检查抓取结果的字段一致性
- 增量排名:全局计数器实现电影排名统计
三、代码解析
- HTTP请求模块
func HttpGet(url string) (result string, err error) {
client := &http.Client{}
req, _ := http.NewRequest("GET", url, nil)
req.Header.Set("User-Agent", "Mozilla/5.0...")
resp, err := client.Do(req)
if resp.StatusCode != 200 {
return "", fmt.Errorf("HTTP错误 状态码: %d", resp.StatusCode)
}
body, _ := ioutil.ReadAll(resp.Body)
return string(body), nil
}
核心功能:
• 自定义Client实现请求控制
• 设置浏览器级User-Agent
• 状态码验证机制
• 响应体读取与返回
- 页面解析模块
func SpiderPage(i int) {
// 构造分页URL
url := "https://movie.douban.com/top250?start=" + strconv.Itoa((i-1)*25)
// 数据提取正则表达式
titleReg := regexp.MustCompile(`<img width="100" alt="(?s:(.*?))"`)
scoreReg := regexp.MustCompile(`<span class="rating_num">(?s:(.*?))</span>`)
numReg := regexp.MustCompile(`<span>(.*?)人评价</span>`)
// 数据验证
if len(title) != len(score) || len(score) != len(num) {
fmt.Println("数据不匹配!")
}
// 格式化输出
fmt.Printf("标题: %-30s | 评分: %-4s | 评价人数: %s | 排名: %d \n",
title[i][1], score[i][1], num[i][1], n)
}
核心功能:
• 动态URL构造
• 多字段正则匹配
• 数据一致性验证
• 格式化输出控制
- 主控模块
func CrawlPages(start, end int) {
for i := start; i <= end; i++ {
SpiderPage(i)
}
}
func main() {
var start, end int
fmt.Print("起始页: ")
fmt.Scan(&start)
// 输入验证
if start > end || start < 1 {
fmt.Println("无效的页码范围")
return
}
CrawlPages(start, end)
}
四、关键功能点
-
反爬应对策略:
• 设置浏览器User-Agent• 合理请求间隔(可扩展)
• 随机代理支持(需扩展)
-
数据提取优化:
// 非贪婪匹配示例 ret := regexp.MustCompile(`alt="(?s:(.*?))"`) // 多行匹配模式 ret := regexp.MustCompile(`(?s)<span>(.*?)</span>`)
-
错误处理机制:
• HTTP状态码验证• 响应体读取异常处理
• 正则匹配结果验证
五、运行效果示例
标题: 肖申克的救赎 | 评分: 9.7 | 评价人数: 2838436 | 排名: 1
标题: 霸王别姬 | 评分: 9.6 | 评价人数: 1984256 | 排名: 2
标题: 阿甘正传 | 评分: 9.5 | 评价人数: 1856325 | 排名: 3
...
本程序仅用于学习交流,请勿用于商业用途。抓取数据可能涉及版权问题,请谨慎使用。建议在遵守相关法律法规和网站协议的前提下使用爬虫技术。