这几天看了go语言,练习一下写法,结合项目会比较有趣,碰到的问题也会比较多。

Go爬虫

参考网站 【go语言爬虫】go语言爬取豆瓣电影top250

使用Go爬豆瓣电影Top250 并写入数据库

#####先看效果

准备工作

mysql(如未安装,也可以不要安装,直接看代码,打印控制台即可)
go 环境, 略,baidu并配置环境变量
开发工具 当前使用过的是LiteIDE,好像还有更好的编译工具

mysql

如何安装,略
数据库结构如下

DROP TABLE IF EXISTS `film`;
CREATE TABLE `film` (`id` int(255) NOT NULL AUTO_INCREMENT,`name` varchar(255) NOT NULL,`detail` varchar(255) DEFAULT NULL,`score` float DEFAULT '0',`commentCount` int(11) DEFAULT '0',`icon` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=175 DEFAULT CHARSET=utf8;
##清空id=0,学习的时候,经常删表再建..否则不需要
truncate table `film`;

当前代码链接数比较多… 需要修改mysql最大链接数

mysql -u root
show variables like "max_connections";
set GLOBAL max_connections=1000;

go代码

main.go

// FilmProject project main.go
package mainimport ("fmt""time"
)func main() {fmt.Println("Hello World!")getAllFilm()// getFirstFilmList()fmt.Println("end")
}func getFirstFilmList() {list, err := GetFilm(true)if err != nil {fmt.Println("err  ")}fmt.Println(list)if list != nil && len(list) > 0 {for _, v := range list {DbInsert(v)}}
}func getAllFilm() {count := 10list, err := GetFilm(true)if err != nil {fmt.Println("- --  ")}for i := 1; i < count; i++ {time.Sleep(2000)fmt.Println("开始第", i, "页")l, e := GetFilm(false)if e != nil {continue} else {list = append(list, l...)}}printFilmList(list)fmt.Println("size: ", len(list))
}func printFilmList(list []FilmBean) {for _, bean := range list {bean.String()DbInsert(bean)}
}

RequestParseUtils.go
请求/解析film,并返回

// RequestParseUtils
package mainimport ("fmt""io/ioutil""net/http""regexp""strconv"//"strings"
)var (forgeHeaders = map[string]string{"Host":                      "movie.douban.com","Connection":                "keep-alive","Cache-Control":             "max-age=0","Upgrade-Insecure-Requests": "1","User-Agent":                "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36","Accept":                    "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8","Referer":                   "https://movie.douban.com/top250",}// urlTitleRe = regexp.MustCompile(`img alt="(.*?)" src=`)// urlTitleRe = regexp.MustCompile(`<a href="(.*?)"> </a>`)// urlTitleRe = regexp.MustCompile(`<a href="(.*?)"> <img [^>]* alt="(.*?)" src="(.*?)" [^>]*></a>`)curPage = 0pageUrl = "https://movie.douban.com/top250?start=%d&filter="
)/*主要用于请求,并解析,返回数据*///电影bean
type FilmBean struct {detail       stringicon         stringname         stringscore        float32commentCount int
}func (f FilmBean) String() {fmt.Println("")fmt.Printf("name:%s,score %f,comment %d, detail: %s, icon: %s", f.name, f.score, f.commentCount, f.detail, f.icon)
}func GetFilm(isFirst bool) (arr []FilmBean, err error) {if isFirst {curPage = 0} else {fmt.Print("第几页")}s := fmt.Sprintf(pageUrl, curPage*25)fmt.Printf("url: %s", s)resp, err := sendHttp(s)if err != nil {return nil, err}list := parseFilmFormResp(resp)curPage++return list, nil
}//发送http请求
func sendHttp(url string) (resp string, err error) {client := http.Client{}req, err := http.NewRequest("GET", url, nil)fmt.Println("发送请求")if err != nil {fmt.Print("出错了")return "", err}for k, v := range forgeHeaders {req.Header.Add(k, v)}response, err2 := client.Do(req)if err2 != nil {return "", err2}defer response.Body.Close()//body := response.Body// fmt.Println(response)//fmt.Println(body)bytearr, err3 := ioutil.ReadAll(response.Body)if err3 != nil {return "", err3}str := string(bytearr)// fmt.Printf("result: %s", str)return str, nil
}func parseFilmFormResp(resp string) (arr []FilmBean) {fmt.Println("parse-------------")pattern22 := `<a href="(.*?)">[^>]*<img [^>]* alt="(.*?)" src="(.*?)"[^>]*>[^>]*</a>`urlTitleRe := regexp.MustCompile(pattern22)detailTitle := urlTitleRe.FindAllStringSubmatch(resp, -1)// fmt.Println(resp)// fmt.Println(detailTitle)//评价人数commentPattern := `<span>(.*?)人评价</span>`commentRe := regexp.MustCompile(commentPattern)commentList := commentRe.FindAllStringSubmatch(resp, -1)//评分人数scorePattern := `property="v:average">(.*?)</span>`scoreRe := regexp.MustCompile(scorePattern)scoreList := scoreRe.FindAllStringSubmatch(resp, -1)var fmlist22 []FilmBeanif detailTitle != nil && len(detailTitle) > 0 {length := len(detailTitle)// fmlist := [length]FilmBean{}fmlist22 = make([]FilmBean, length, length)item := detailTitle[0]fmt.Printf("url: %s, name:%s,  img:%s", item[1], item[2], item[3])fmt.Println("")for index, item := range detailTitle {fb := FilmBean{}fb.detail = item[1]fb.name = item[2]fb.icon = item[3]score1, _ := strconv.ParseFloat(scoreList[index][1], 32)fb.score = float32(score1)fb.commentCount, _ = strconv.Atoi(commentList[index][1])fmt.Printf("url: %s, name:%s,  img:%s", item[1], item[2], item[3])// fmt.Printf("url:%s ", item[0])fmt.Println("", index)fmlist22[index] = fb}}return fmlist22
}

FilmDb.go

// FilmDb
package mainimport ("database/sql""fmt"_ "github.com/go-sql-driver/mysql"
)//插入demo
func DbInsert(f FilmBean) {fmt.Println("")db, err := sql.Open("mysql", "root:@/go_film?charset=utf8")checkErr(err)stmt, err := db.Prepare(`INSERT film (name,detail,score,commentCount,icon) values (?,?,?,?,?)`)checkErr(err)res, err := stmt.Exec(f.name, f.detail, f.score, f.commentCount, f.icon)checkErr(err)id, err := res.LastInsertId()checkErr(err)fmt.Println(id)
}
func checkErr(err error) {if err != nil {panic(err)}
}

注意:
如果接入mysql,把main里面 DbInsert(v) 、DbInsert(bean) 删除即可
如接入mysql, 注意上面的import _ “github.com/go-sql-driver/mysql”
非windows系统,根据网上使用git安装mysql驱动

此处对windows 手动安装说明
参考 https://www.cnblogs.com/wangqishu/p/5147108.html

下载包
https://github.com/go-sql-driver/mysql/releases
当前最新版本,mysql-1.4.1
查看自己的gopath 如:D:\devTools\go
在path/src/ 创建 github.com\go-sql-driver\mysql 目录,对应import的结构;解压刚下载的zip 到该目录; (应该也可以直接吧mysql解压到src下,import改成mysql,不带前面路径)

例:D:\devTools\go\src\github.com\go-sql-driver\mysql

使用Go爬豆瓣电影Top250 并写入数据库相关推荐

  1. python使用多线程进行爬豆瓣电影top250海报图片,附源码加运行结果

    使用多线程进行爬豆瓣电影top250海报图片 # -- coding: UTF-8 -- import time import requests import urllib.request from ...

  2. python 豆瓣电影top250_python 爬豆瓣电影top250

    基础页面:https://movie.douban.com/top250 代码: from time import sleep from requests import get from bs4 im ...

  3. python BeautifulSoup爬取豆瓣电影top250信息并写入Excel表格

    豆瓣是一个社区网站,创立于2005年3月6日.该网站以书影音起家,提供关于书籍,电影,音乐等作品信息,其描述和评论都是由用户提供的,是Web2.0网站中具有特色的一个网站. 豆瓣电影top250网址: ...

  4. 爬取“豆瓣电影Top250”的电影排名、电影名和评分并写入文档

    想要爬取豆瓣电影Top250的电影排名.电影名和评分并写入文档吗?其实很简单. 打开Pycharm 得到豆瓣电影Top250的网址: https://movie.douban.com/top250?s ...

  5. python爬取豆瓣电影top250并保存为xlsx_python抓取豆瓣电影Top250数据并写入Excel

    douban python抓取豆瓣电影Top250数据并写入Excel 1.将目标网站上的页面抓取下来 2.将抓取下来的数据根据一定的规则进行提取 create table `tb_movie`( i ...

  6. 利用python爬取豆瓣电影top250

    利用python爬取豆瓣电影top250: 注:本内容只是作为个人学习记录 1.业务分析 进入网页https://movie.douban.com/top250 可以看见每部电影都呈现在眼前,点击电影 ...

  7. 豆瓣电影Top250信息爬取并保存到excel文件中

    豆瓣电影Top250下载并保存到excel文件中 效果图 前言 确定目标网页url 爬取过程 导入相关库 页面内容的获取 页面解析 数据提取 主函数的编写 函数调用 数据存储 完整代码 结语 效果图 ...

  8. #爬取豆瓣电影top250

    文章目录 1 创建jupyter环境及安装相关的包 1.1 安装jupyter 1.2安装requests和lxml 2 分析网页链接 3 爬取网页 3.1 请求源代码 3.2 设置浏览器代理 3.3 ...

  9. python爬取豆瓣电影top250_Python爬虫——爬取豆瓣电影Top250代码实例

    利用python爬取豆瓣电影Top250的相关信息,包括电影详情链接,图片链接,影片中文名,影片外国名,评分,评价数,概况,导演,主演,年份,地区,类别这12项内容,然后将爬取的信息写入Excel表中 ...

最新文章

  1. 重磅:ATT的《5G移动边缘计算白皮书》!
  2. svg做自定义折线图表
  3. 怎样才算熟悉python-怎样才算python入门
  4. c++类中成员的构造顺序
  5. JAVA IO修改文本内容
  6. c语言为正数无限大,无限大整数相加算法的C语言源代码
  7. 【推荐】揭秘谷歌电影票房预测模型
  8. php oop 实际工作,PHP OOP注意点(一)
  9. java Enumset
  10. centos清除dns cache.
  11. (五)uboot移植补基础之shell
  12. 程序员工资为什么普遍很高,原来是因为这个...
  13. 强化学习读书笔记 - 06~07 - 时序差分学习(Temporal-Difference Learning)
  14. poj 2406 Power Strings kmp基础
  15. Java面向对象编程及其三大特征
  16. 计算机可行性分析报告,计算机可行性分析报告范文.docx
  17. 日更100天(53)每天进步一点点
  18. kubeadm,kubevip,containerd部署高可用的kubernetes集群
  19. RocketMQ的消费者消息重试和生产者消息重投
  20. java获取浏览器url_java 打开浏览器 url

热门文章

  1. java jxl 筛选_JAVA 用 JXL导出excel怎么给标题设置自动筛选功能,求代码。
  2. 不使用函数实现字符串拼接函数strcat
  3. 中南民族大学计算机科学与技术学院,中南民族大学计算机科学技术学院介绍
  4. 敏捷教练的六顶帽子|洞见
  5. android 颜色值16进制转换int类型;
  6. VBA宏:outlook收件箱中发件人使用联系人
  7. 算法 C语言 压缩字符串
  8. 页面禁止长按保存图片和长按复制文字
  9. 你上次被程序猿喷是因为啥?
  10. ADG配置(主备库环境)