Golang实现并发版网络爬虫:豆瓣-电影名人数评分爬取并保存文件
爬取豆瓣电影信息:
双向爬取:
横向:以页为单位。纵向:以一个页面内的条目为单位。
横向:
https://movie.douban.com/top250?start=0&filter= 1
https://movie.douban.com/top250?start=25&filter= 2
https://movie.douban.com/top250?start=50&filter= 3
https://movie.douban.com/top250?start=75&filter= 4
纵向:
电影名称: <img width="100" alt="电影名称" ——> `<img width="100" alt="(.*?)"`分数:<span class="rating_num" property="v:average">分数</span> ——> `<span class="rating_num" property="v:average">(.*?)</span>`评分人数:<span> 评分人数 人评价</span> ——> `<span>(.*?)人评价</span>`
---- 实现流程:
1. 获取用户输入 起始、终止页、启动 toWork 函数 循环 调用 SpiderPageDB(url) 爬取每一个页面2. SpiderPageDB 中, 获取 豆瓣电影 横向爬取url 信息。封装 HttpGet 函数,爬取一个页面所有数据 存入 result 返回3. 找寻、探索豆瓣网页 纵向爬取规律。找出“电影名”、“分数”、“评分人数”网页数据特征。4. 分别 对这三部分数据使用 go 正则函数: 1) 解析、编译正则表达式 2) 提取信息 ——> string[1]: 代表没有 匹配参考项内容。5. 将提取到的数据,按自定义格式写入文件。使用 网页编号命名文件。6. 实现并发。 1) go SpiderPageDB(url) 。 2) 创建 channel 防止主 go 程退出3) SpiderPageDB 函数末尾,写入 channel 4) 主 go 程 for 读取 channel 。
package mainimport ("fmt""strconv""net/http""io""regexp""os"
)// 爬取指定url 的页面,返回 result
func HttpGetDB(url string) (result string, err error) {resp, err1 := http.Get(url)if err1 != nil {err = err1;return}defer resp.Body.Close()buf := make([]byte, 4096)// 循环爬取整页数据for {n, err2 := resp.Body.Read(buf)if n == 0 {break}if err2 != nil && err2 != io.EOF {err = err2return}result += string(buf[:n])}return
}func Save2file(idx int, filmName, filmScore, peopleNum [][]string) {path := "C:/itcast/"+ "第 " + strconv.Itoa(idx) + " 页.txt"f, err := os.Create(path)if err != nil {fmt.Println("os.Create err:", err)return}defer f.Close()n := len(filmName) // 得到 条目数。 应该是 25// 先打印 抬头 电影名称 评分 评分人数f.WriteString("电影名称" + "\t\t\t" + "评分" + "\t\t" + "评分人数" + "\n")for i:=0; i<n; i++ {f.WriteString(filmName[i][1] + "\t\t\t" + filmScore[i][1] + "\t\t" + peopleNum[i][1] + "\n")}
}// 爬取一个豆瓣页面数据信息
func SpiderPageDB(idx int, page chan int) {// 获取 urlurl := "https://movie.douban.com/top250?start="+ strconv.Itoa((idx-1)*25) + "&filter="// 封装 HttpGet2 爬取 url 对应页面result, err := HttpGetDB(url)if err != nil {fmt.Println("HttpGet2 err:", err)return}//fmt.Println("result=", result)// 解析、编译正则表达式 —— 电影名称:ret1:= regexp.MustCompile(`<img width="100" alt="(?s:(.*?))"`)// 提取需要信息filmName := ret1.FindAllStringSubmatch(result, -1)// 解析、编译正则表达式 —— 分数:pattern := `<span class="rating_num" property="v:average">(?s:(.*?))</span>`ret2 := regexp.MustCompile(pattern)// 提取需要信息filmScore := ret2.FindAllStringSubmatch(result, -1)// 解析、编译正则表达式 —— 评分人数:ret3 := regexp.MustCompile(`<span>(?s:(\d*?))人评价</span>`)//ret3 := regexp.MustCompile(`<span>(.*?)人评价</span>`)// 提取需要信息peopleNum := ret3.FindAllStringSubmatch(result, -1)// 将提取的有用信息,封装到文件中。Save2file(idx, filmName, filmScore, peopleNum)// 与主go程配合 完成同步page <- idx
}func toWork(start, end int) {fmt.Printf("正在爬取 %d 到 %d 页...\n", start, end)page := make(chan int) //防止主go 程提前结束for i:=start; i<=end; i++ {go SpiderPageDB(i, page)}for i:=start; i<=end; i++ {fmt.Printf("第 %d 页爬取完毕\n", <-page)}
}func main() {// 指定爬取起始、终止页var start, end intfmt.Print("请输入爬取的起始页(>=1):")fmt.Scan(&start)fmt.Print("请输入爬取的终止页(>=start):")fmt.Scan(&end)toWork(start, end)
}
Golang实现并发版网络爬虫:豆瓣-电影名人数评分爬取并保存文件相关推荐
- Golang实现并发版网络爬虫:捧腹网段子爬取并保存文件
爬取捧腹网段子 url分页分析 https://www.pengfu.com/xiaohua_1.html 1 下一页+1 https://www.pengfu.com/xiaohua_2.html ...
- Golang实现并发版网络爬虫:斗鱼直播颜值区直播封面图片爬取并保存文件
爬取斗鱼直播颜值区直播封面图片代码实现: 工作流程: 1. 明确目标 Url2. 发送请求,获取应答数据包. http.Get(url)3. 过滤 数据.提取有用信息. 4. 使用.分析得到数据信息. ...
- Python爬虫之豆瓣电影评论数据的爬取(十四)
原创不易,转载前请注明博主的链接地址:Blessy_Zhu https://blog.csdn.net/weixin_42555080 本次代码的环境: 运行平台: Windows Python版本: ...
- Python网络爬虫数据采集实战:Scrapy框架爬取QQ音乐存入MongoDB
通过前七章的学习,相信大家对整个爬虫有了一个比较全貌的了解 ,其中分别涉及四个案例:静态网页爬取.动态Ajax网页爬取.Selenium浏览器模拟爬取和Fillder今日头条app爬取,基本 ...
- python爬取豆瓣电影并分析_Python爬取豆瓣电影的短评数据并进行词云分析处理
前言 对于爬虫很不陌生,而爬虫最为经典的案例就是爬取豆瓣上面的电影数据了,今天小编就介绍一下如果爬取豆瓣上面电影影评,以<我不是药神>为例. 基本环境配置 版本:Python3.6 相关模 ...
- Python网络爬虫实例——“中国最好大学排名爬取”(嵩天:北理工大学)学习笔记
这个例子比较简单也容易理解,我将细致的解析这个例子中算法流程.写一个博客算是给自己一个激励吧.一起加油.(_ZHJ三月和九月) 完整版代码 import requests from bs4 impor ...
- python爬电影排名用os bs4_Pyhton网络爬虫实例_豆瓣电影排行榜_BeautifulSoup4方法爬取...
-----------------------------------------------------------学无止境------------------------------------- ...
- 爬虫笔记(七)——利用selenium对猫眼、豆瓣电影榜单的爬取
系列文章目录 提示: 爬虫学习笔记(四)--糗百爬虫遇到的反爬 爬虫学习笔记(三)--利用JSON爬取豆瓣热映的使用 爬虫学习笔记(二):requests基础用法之爬取各类主流网站2 爬虫学习笔记(一 ...
- 【崔庆才教材】《Python3网络爬虫开发实战》3.4爬取猫眼电影排行代码更正(绕过美团验证码)
前情提要 最近有七八个小伙伴私信问我说崔大神的<Python3网络爬虫开发实战>教材中 "3.4爬取猫眼电影排行" 一节的代码目前不能用. 首先附上崔大神的github ...
最新文章
- Python分析离散心率信号(上)
- 使用RedisDesktopManager客户端无法连接Redis服务器问题解决办法
- Vineyard 加入 CNCF Sandbox,将继续瞄准云原生大数据分析领域
- 【模型解读】GoogLeNet中的inception结构,你看懂了吗
- 线性链表java实现_java实现线性单链表
- C++是一种糟糕的语言 Linux之父炮轰C++
- 核销规则配置好之后 验证核销规则和本地测试过程
- linker command failed with exit code 1 (错误总结)
- 高通平台 ramdump-parser 简介
- Java实现音频格式转换 WAV—mp3,可使音频压缩
- itext7接口和类概述以及pdf常见操作
- 刮刮乐微信html5源码,微信小程序canvas实现刮刮乐效果
- SEO逆东子站生成和权重站提交工具
- 直流电机控制与TB6612FNG驱动芯片
- Git的基本概念和SourceTree的使用
- html网站模版用什么修改,网站后台模版html如何修改?网站模板能随便更改吗?...
- 线程池的使用(结合Future/Callable使用)
- 题目4(15分)对film_log1.csv文件进行重复值处理,并且打印出去掉的条数,然后保存到film_log2中。
- 访问WEB-INF目录中的JSP文件
- 第十一届蓝桥软件类JavaB组