分析

1.首先获得每个主页面的内容
豆瓣电影 Top 250 URL:https://movie.douban.com/top250
第一页URL:https://movie.douban.com/top250?start=0&filter=
第二页URL:https://movie.douban.com/top250?start=25&filter=
第三页URL:https://movie.douban.com/top250?start=50&filter=
第四页URL:https://movie.douban.com/top250?start=75&filter=
……
第X页:https://movie.douban.com/top250?start=(X-1)*25&filter=

2.提取每个主页面中的有价值信息
获取电影名称:< img width=“100” alt="(.?)"
获取电影评分:< span class=“rating_num” property=“v:average”>(.
?)< /span>
获取评价人数:< span>(.?)人评价< /span>
获取电影总结:< span class=“inq”>(.
?)< /span>
获取电影详情页面URL:< a href="(.*?)/" class="">

3.打开电影详情页面获取有价值信息
导演:rel=“v:directedBy”>(.?)< /a>
类型:< span property=“v:genre”>(.
?)< /span>
制片国家:地区:< /span>(.?)< br/>
语言:语言:< /span>(.
?)< br/>
上映时间:< span property=“v:initialReleaseDate” content="(.?)"
片长:< span property=“v:runtime” content="(.
?)"
简介:< span property=“v:summary” class="">(?s:(.*?))< /span>

package mainimport("io""fmt""regexp""strings""strconv""net/http""github.com/360EntSecGroup-Skylar/excelize"
)//定义一个方法, 获得页面全部内容
func HttpGet(url string) (result string, err error){resp, err1 := http.Get(url)if err1 != nil{err = err1return}defer resp.Body.Close()buf := make([]byte, 4096)for{num, err2 := resp.Body.Read(buf)if num == 0{break;}if err2 != nil && err2 != io.EOF{err = err2return}result += string(buf[:num])}return
}func EditingRegularExpressions(Expression, result string)([][]string){return regexp.MustCompile(Expression).FindAllStringSubmatch(result, -1)
}func SpiderDetail(url string) (Director, Type, Country, Language, Time, Duration [][]string, content string){result, _ := HttpGet(url)Director = EditingRegularExpressions(`rel="v:directedBy">(.*?)</a>`,result)Type = EditingRegularExpressions(`<span property="v:genre">(.*?)</span>`,result)Country = EditingRegularExpressions(`地区:</span>(.*?)<br/>`,result)Language = EditingRegularExpressions(`语言:</span>(.*?)<br/>`,result)Time = EditingRegularExpressions(`<span property="v:initialReleaseDate" content="(.*?)"`,result)Duration = EditingRegularExpressions(`<span property="v:runtime" content="(.*?)"`,result)Introduction := EditingRegularExpressions(`<span property="v:summary"(?s:(.*?))</span>`,result)for _, temp := range Introduction{content = temp[1]content = strings.Replace(content, ">", "", -1)content = strings.Replace(content, " ", "", -1)content = strings.Replace(content, "\n", "", -1)content = strings.Replace(content, "\t", "", -1)content = strings.Replace(content, "<br/", "", -1)content = strings.Replace(content, "&nbsp; ", "", -1)content = strings.Replace(content, `class=""`, "", -1)}return
}func SpiderPage(index int){fmt.Println("Climbing page ", index, ".....")f, err := excelize.OpenFile("./Film.xlsx")if err != nil{fmt.Println("open file err: ", err)return}rows, _ := f.GetRows("Sheet1")lens := len(rows)url := "https://movie.douban.com/top250?start=" + strconv.Itoa((index-1)*25) + "&filter="result, err := HttpGet(url)if err != nil{fmt.Println("HttpGet err: ", err)return}MovieTitle := EditingRegularExpressions(`<img width="100" alt="(.*?)"`, result)FilmRating := EditingRegularExpressions(`<span class="rating_num" property="v:average">(.*?)</span>`, result)NumberOfPeopleAssessed := EditingRegularExpressions(`<span>(.*?)人评价</span>`, result)FilmSummary := EditingRegularExpressions(`<span class="inq">(.*?)</span>`, result)DetailsPageURL := EditingRegularExpressions(`<a href="(.*?)/" class="">`, result)for i := 0; i < len(DetailsPageURL); i++{Director, Type, Country, Language, Time, Duration, Introduction := SpiderDetail(DetailsPageURL[i][1])content := []string{MovieTitle[i][1],FilmRating[i][1],NumberOfPeopleAssessed[i][1],FilmSummary[i][1],DetailsPageURL[i][1],Director[0][1],Type[0][1],Country[0][1],Language[0][1],Time[0][1],Duration[0][1],Introduction}for j := 0; j < 12; j++{coor := fmt.Sprintf("%c",j + 65)coor = coor + strconv.Itoa(lens + i +1)f.SetCellValue("Sheet1", coor, content[j])}}err = f.SaveAs("./Film.xlsx")if err != nil {fmt.Println(err)}
}func Spider(start, end int){var cont = []string{"电影名","电影评分","评分人数","电影总结","电影详情网页","导演","类型","制片国家","语言","上映时间","电影时长","简介"}file := excelize.NewFile()for i := 0; i < len(cont); i++{col := fmt.Sprintf("%c1",i + 65)file.SetCellValue("Sheet1", col, cont[i])}err := file.SaveAs("./Film.xlsx")if err != nil {fmt.Println(err)}fmt.Printf("Crawl from page %d to page %d \n", start, end)for i := start; i < end + 1; i++{SpiderPage(i)}
}func main(){var start, end intfmt.Printf("Please enter the crawl start page(>=1):")fmt.Scan(&start)fmt.Printf("Please enter the crawled termination page(>=start):")fmt.Scan(&end)Spider(start, end)
}

定义一个方法, 获得页面全部内容

func (*Client) Get

Get issues a GET to the specified URL. If the response is one of the following redirect codes, Get follows the redirect after calling the Client’s CheckRedirect function:
get发出到指定url的get。如果响应是以下重定向代码之一,则get在调用客户端的checkredirect函数后遵循重定向:

301 (Moved Permanently)
301(永久移动)
302 (Found)
302(发现)
303 (See Other)
303(见其他)
307 (Temporary Redirect)
307(临时重定向)
308 (Permanent Redirect)
308(永久重定向)

An error is returned if the Client’s CheckRedirect function fails or if there was an HTTP protocol error. A non-2xx response doesn’t cause an error. Any returned error will be of type url.Error. The url.Error value’s Timeout method will report true if request timed out or was canceled.
如果客户端的检查重定向函数失败或存在HTTP协议错误,则返回错误。非2xx响应不会导致错误。任何返回的错误都将是
url.error类型。如果请求超时或被取消,URL.Error值的超时方法将报告TRUE。

When err is nil, resp always contains a non-nil resp.Body. Caller should close resp.Body when done reading from it.
当err为nil时,resp始终包含非nil resp.body。调用方完成读取后应关闭响应体。

To make a request with custom headers, use NewRequest and Client.Do.
要使用自定义头发出请求,请使用newrequest和client.do。

func (re *Regexp) FindAllStringSubmatch(s string, n int) [][]string

FindAllStringSubmatch is the ‘All’ version of FindStringSubmatch; it returns a slice of all successive matches of the expression, as defined by the ‘All’ description in the package comment. A return value of nil indicates no match.
FindAllStringSubmatch是FindStringSubmatch的“all”版本;它返回表达式所有连续匹配项的一部分,如包注释中的“all”描述所定义。返回值nil表示不匹配。

遇到的问题

1.正则表达式的返回结果为空
排查后发现是获得网页信息有问题:

检测到有异常请求从你的 IP 发出

貌似是IP被封了啊。

大概是请求过多了吧。

这是在服务器上做的,没办法,只能把文件下载到Windows上run了。

AI Studio 学习 Go 豆瓣电影爬取相关推荐

  1. php 抓取 豆瓣电影,爬取 豆瓣电影Top250

    目标 学习爬虫,爬豆瓣榜单,获取爬取静态页面信息的能力 代码 import requests from bs4 import BeautifulSoup def getHTMLText(url): t ...

  2. 爬虫学习(一)---爬取电影天堂下载链接

    欢迎加入python学习交流群 667279387 爬虫学习 爬虫学习(一)-爬取电影天堂下载链接 爬虫学习(二)–爬取360应用市场app信息 主要利用了python3.5 requests,Bea ...

  3. html登录界面设计代码_Python登录豆瓣并爬取影评

    Cookie是为了交互式web而诞生的,它主要用于以下三个方面: 会话状态管理(如用户登录状态.购物车.游戏分数或其它需要记录的信息) 个性化设置(如用户自定义设置.主题等) 浏览器行为跟踪(如跟踪分 ...

  4. Python 学习 02 —— Python如何爬取数据

    文章目录 系列文章 二.Python 爬 虫 1.任务介绍 2.简介 3.基本流程 3.1.准备工作 3.1.1.分析页面 3.1.2.编码规范 3.1.3.导入模块 3.1.4.程序流程 3.2.获 ...

  5. 爬虫学习(二)--爬取360应用市场app信息

    欢迎加入python学习交流群 667279387 爬虫学习 爬虫学习(一)-爬取电影天堂下载链接 爬虫学习(二)–爬取360应用市场app信息 代码环境:windows10, python 3.5 ...

  6. python爬虫之xpath和lxml应用—爬取豆瓣评分爬取

    python爬虫之豆瓣评分爬取 1 第一步 获取网页源码 2 第二步 获取电影信息 3 第三步 保存数据 4 综合 ''' 需求:爬取电影的名字 评分 引言 详情页的url,每一页都爬取并且把数据保存 ...

  7. python豆瓣影评_教你用python登陆豆瓣并爬取影评

    教你用python登陆豆瓣并爬取影评 一起来 日常学python 这是我的第二篇原创文章 在上篇文章爬取豆瓣电影top250后,想想既然爬了电影,干脆就连影评也爬了,这样可以看看人们评价的电影,再加上 ...

  8. 《恶魔人crybaby》豆瓣短评爬取

    作业要求来源:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/3159 爬虫综合大作业 选择一个热点或者你感兴趣的主题. 选择爬取的对象 ...

  9. 从入门到入土:Python爬虫学习|实例练手|爬取猫眼榜单|Xpath定位标签爬取|代码

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

最新文章

  1. 结合Android去水印APP谈谈分区存储
  2. JupyterLab Server 搭建与使用笔记
  3. 互联网广告系统综述一生态圈
  4. Cannot launch SimulationPipeline in local Eclipse
  5. Java宣言的时候,Java基础恶补——宣言及访问控制
  6. cuda卸载_Ubuntu18.04英伟达显卡驱动、Cuda安装
  7. 应用交付脚本工具在HTTP服务中的应用
  8. java遍历json的key和value_json对象遍历输出key和value
  9. cricheditview实现语法高亮和行号_Markdown语法详解及工具介绍
  10. c++课程设计(水)
  11. 雷达图像与电子海图叠加坐标变化优化方法
  12. 一批恶意Google Play应用窃取用户银行信息
  13. Android获取外网和内网ip地址
  14. oracle系统常见错误(摘自文平书)
  15. 一些简单的局域网入侵命令
  16. increment java_Java LongAdder increment()用法及代码示例
  17. no matching distribution found for XXX 或 read timed out解决办法
  18. JDBC(powernode CD2206)详尽版(内含教学视频、源代码、SQL文件)
  19. Windows 更新安装错误 - 0x80070643
  20. 文章出轨 马伊琍及其家人选择原谅 父亲被称为中国好岳父

热门文章

  1. less的一些用法整理
  2. nginx 日志获取不到远程访问ip问题解决
  3. 从人人网抓取高校数据信息,包括,省份 - 高校 - 院系 (提供最终SQL文件下载)...
  4. 【Markdown/typora】程序员写博客2分钟简单入门
  5. linux怎么看日期,linux 怎么用命令查看日期
  6. android按钮在容器下方,使用flex布局解决安卓手机上固定在底部的按钮,在键盘弹起后挡住input输入框的问题...
  7. python教程长城图案,Python编写万花尺图案实例
  8. 强大的uml java_IDEA 还是强大啊,一键把项目生成 UML 类图…
  9. 2010年杭电计算机研究生复试---笔试编程
  10. Python 解释器