go爬取豆瓣电影

好久没使用go语言做个项目了,上午闲来无事花了点时间使用golang来爬取豆瓣top电影,这里我没有用colly框架而是自己设计简单流程。mark一下

思路

定义两个channel,一个channel存放web网页源内容,另一个存放提取后的有效内容。

多个goroutine并发爬取网页源内容放到存放web网页的channel里,再启动goroutine去存放web网页的channel里读取内容,读取到内容后启动goroutine去提取有效值存放到channel里,最后持久化写入本地文件(文件写操作并非线程安全所以这里我没有使用多goroutine)。

代码

具体代码如下,如果想执行看效果需要go get github.com/PuerkitoBio/goquery安装三方包或者直接点这里拉取代码设置GOPATH之后便可运行

package main

import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"regexp"
"strings"
"time"
"os" "github.com/PuerkitoBio/goquery"
) /*
通过多个goroutine并发执行爬取操作,channel存放要爬取url内容和爬取结果
这样只需要设计爬取函数和提取函数
*/ func get_web_content(url string, chan_web chan string) {
resp, err := http.Get(url)
if err != nil {
fmt.Println("http get error", err)
return
}
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("read error", err)
return
}
chan_web <- string(body)
} func extract_valid_content(body string, chan_r chan []byte) {
dom, err := goquery.NewDocumentFromReader(strings.NewReader(body))
if err != nil {
fmt.Println(err)
}
dom.Find("ol.grid_view div.item").Each(func(i int, selection *goquery.Selection) {
// extract result
result := make(map[string]string)
name := selection.Find("div.info span.title").First().Text()
doctor_str := selection.Find("div.info div.bd p").First().Text()
r := regexp.MustCompile(`导演:(?s:(.*?))(主演|主|&|\.\.\.)`)
doctor := r.FindAllStringSubmatch(doctor_str, -1)[0][1]
rating_num := selection.Find("div.star span.rating_num").First().Text()
evaluation_str := selection.Find("div.star span").Last().Text()
r = regexp.MustCompile(`(?s:(.*?))人评价`)
evaluation := r.FindAllStringSubmatch(evaluation_str, -1)[0][1]
ranking := selection.Find("div.pic em").First().Text()
result["name"] = name
result["doctor"] = doctor
result["rating_num"] = rating_num
result["evaluation"] = evaluation
result["ranking"] = ranking
json_str, err := json.Marshal(result)
if err != nil {
fmt.Println(err)
return
}
chan_r <- json_str
})
} func main() {
var (
OutputFile = "./film_crawl.txt"
)
base_url := "https://movie.douban.com/top250?start=%d&filter="
chan_web_content := make(chan string)
defer close(chan_web_content)
chan_r := make(chan []byte)
defer close(chan_r)
for i := 0; i < 10; i++ {
url := fmt.Sprintf(base_url, i*25)
go get_web_content(url, chan_web_content)
} go func() {
for {
web_content, ok := <- chan_web_content
if !ok {
break
}
go extract_valid_content(web_content, chan_r)
}
}() flag := false
to := time.NewTimer(time.Second * 5)
file, err := os.OpenFile(OutputFile, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0644)
if err != nil {
fmt.Println("Failed to open the file", err.Error())
return
}
defer file.Close()
for {
if flag {
break
}
to.Reset(time.Second * 5)
select {
case res := <- chan_r:
fmt.Printf("%s\n", res)
file.Write(res)
file.WriteString("\n")
case <- to.C:
flag = true
break
}
}
fmt.Println("end")
}

go爬虫之爬取豆瓣电影的更多相关文章

  1. 第一个nodejs爬虫:爬取豆瓣电影图片

    第一个nodejs爬虫:爬取豆瓣电影图片存入本地: 首先在命令行下 npm install request cheerio express -save; 代码: var http = require( ...

  2. 一起学爬虫——通过爬取豆瓣电影top250学习requests库的使用

    学习一门技术最快的方式是做项目,在做项目的过程中对相关的技术查漏补缺. 本文通过爬取豆瓣top250电影学习python requests的使用. 1.准备工作 在pycharm中安装request库 ...

  3. 爬虫——正则表达式爬取豆瓣电影TOP前250的中英文名

    正则表达式爬取豆瓣电影TOP前250的中英文名 1.首先要实现网页的数据的爬取.新建test.py文件 test.py 1 import requests 2 3 def get_Html_text( ...

  4. 零基础爬虫----python爬取豆瓣电影top250的信息(转)

    今天利用xpath写了一个小爬虫,比较适合一些爬虫新手来学习.话不多说,开始今天的正题,我会利用一个案例来介绍下xpath如何对网页进行解析的,以及如何对信息进行提取的. python环境:pytho ...

  5. 初识python 之 爬虫:爬取豆瓣电影最热评论

    主要用到lxml的etree解析网页代码,xpath获取HTML标签. 代码如下: 1 #!/user/bin env python 2 # author:Simple-Sir 3 # time:20 ...

  6. scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250

    scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250 前言 经过上一篇教程我们已经大致了解了Scrapy的基本情况,并写了一个简单的小demo.这次我会以爬取豆瓣电影TOP250为例进一步为大 ...

  7. Python开发爬虫之静态网页抓取篇:爬取“豆瓣电影 Top 250”电影数据

    所谓静态页面是指纯粹的HTML格式的页面,这样的页面在浏览器中展示的内容都在HTML源码中. 目标:爬取豆瓣电影TOP250的所有电影名称,网址为:https://movie.douban.com/t ...

  8. 爬虫系列1:Requests+Xpath 爬取豆瓣电影TOP

    爬虫1:Requests+Xpath 爬取豆瓣电影TOP [抓取]:参考前文 爬虫系列1:https://www.cnblogs.com/yizhiamumu/p/9451093.html [分页]: ...

  9. 爬虫系列(十) 用requests和xpath爬取豆瓣电影

    这篇文章我们将使用 requests 和 xpath 爬取豆瓣电影 Top250,下面先贴上最终的效果图: 1.网页分析 (1)分析 URL 规律 我们首先使用 Chrome 浏览器打开 豆瓣电影 T ...

随机推荐

  1. Qt编写安防视频监控系统11-动态换肤

    一.前言 Qt中的动态换肤技术是非常一流的,直接调用qApp->setStyleSheet(qss);就可以对整个应用程序进行换肤,如果样式表内容不多,或者对应的贴图不对,效率还是蛮好的,不过据 ...

  2. 【UE】常用的UltraEdit使用技巧

    Tip 1: Alt+C 列模式可以说最初选择使用这个文本编辑软件,原因很简单,就是因为“她”具有列编辑模式.如果您还不知道什么是列编辑模式的话,我想您应该好好研究一下啦.这是一个超级“赞”的功能.在 ...

  3. 当微信小程序遇到AR(三)

    当微信小程序遇到AR,会擦出怎么样的火花?期待与激动...... 通过该教程,可以从基础开始打造一个微信小程序的AR框架,所有代码开源,提供大家学习. 本课程需要一定的基础:微信开发者工具,JavaS ...

  4. 能力不足的C++开发会欺辱能力不足C#开发

    能力不足的C++开发会欺辱能力不足C#开发 我被C++开发欺辱的岁月   前言 人被压迫了,为什么不斗争?——鲁迅 作为一个C#开发者,我经历了,也见证了很多同行饱受C++开发的歧视和欺辱. 而且,这 ...

  5. linux用户管理添加用户的默认配置文件useradd详解

    /etc/default/useradd 文件 cat /etc/default/useradd 常用命令: useradd  添加用户 userdel   删除用户 passwd   改密码 use ...

  6. error: audit:backlog limit exceeded

    报错场景:telnet.ping.ftp都通的情况下,无法ssh服务器 原因:audit缓冲区设置过小,服务器默认缓冲区大小为320kb 解决办法:可通过auditctl -b 8192设定缓冲区大小 ...

  7. 正式发布! .NET开发控件集ComponentOne 新版本加入Blazor UI

    近期,由葡萄城推出的ComponentOne .NET开发控件集正式发布最新版本! ComponentOne 是一套专注于企业 .NET开发.支持 .NET Core 平台,并完美集成于 Visual ...

  8. Python+request超时和重试

    Python+request超时和重试 一.什么是超时? 1.连接超时 连接超时指的是没连接上,超过指定的时间内都没有连接上,这就是连接超时.(连接时间就是httpclient发送请求的地方开始到连接 ...

  9. Python解Leetcode: 724. Find Pivot Index

    leetcode 724. Find Pivot Index 题目描述:在数组中找到一个值,使得该值两边所有值的和相等.如果值存在,返回该值的索引,否则返回-1 思路:遍历两遍数组,第一遍求出数组的和 ...

  10. Dijstra_优先队列_前向星

    Dijstra算法求最短路径 具体实现方式 设置源点,将源点从原集u{}中取出并放入新建集s{} 找出至源点最近的点q从原集取出放入新集s{} 由q点出发,更新所有由q点能到达的仍处于原集的点到源点的 ...