Golang爬虫+正则表达式
最近学习go,爬取网站数据用到正则表达式,做个总结;
Go中正则表达式采用RE2语法(具体是啥咱也不清楚);
字符
. ——匹配任意字符 e.g: abc. 结果: abcd,abcx,abc9;
[] ——匹配括号中任意一个字符 e.g: [abc]d 结果:ad,cd,1d;
- ——[-]中表示范围 e.g: [A-Za-z0-9];
^ ——[^]中表示除括号中的任意字符 e.g:[^xy]a 结果:aa,da,不能为xa,ya;
数量限定
? ——前面单元匹配0或1次;
+ ——前面单元匹配1或多次;
* ——前面单元匹配0或多次;
{,} ——显示个数上下线;e.g : ip地址——[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3};
其他
\ ——转义字符;
| ——条件或;
() ——组成单元 如果字符串本身有括号"[(] aaa. [)]" ;
方法
//参数正则字符串,返回值*Regexp
str := regexp.MustCompile(string)
//参数要查找的数据,查找次数-1为全局,返回值二维数组,查找出的字符串+正则字符串
var result [][]string = str.FindAllStringSubmatch(data, -1)
爬虫
爬取博客园所有文章阅读量,评论,推荐;
package main
import (
"fmt"
"io"
"net/http"
"regexp"
"strconv"
)
var readCount int = 0
var commentCount int = 0
var diggCount int = 0
//http读取网页数据写入result返回
func HttpGet(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)
//fmt.Println(url)
if n == 0 {
break
}
if err2 != nil && err2 != io.EOF {
err = err2
return
}
result += string(buf[:n])
}
return result, err
}
//横向纵向爬取文章标题数据,并累计数值
func SpiderPageDB(index int, page chan int) {
url := "https://www.cnblogs.com/littleperilla/default.html?page=" + strconv.Itoa(index)
result, err := HttpGet(url)
if err != nil {
fmt.Println("HttpGet err:", err)
return
}
str := regexp.MustCompile("post-view-count\">阅读[(](?s:(.*?))[)]</span>")
alls := str.FindAllStringSubmatch(result, -1)
for _, j := range alls {
temp, err := strconv.Atoi(j[1])
if err != nil {
fmt.Println("string2int err:", err)
}
readCount += temp
}
str = regexp.MustCompile("post-comment-count\">评论[(](?s:(.*?))[)]</span>")
alls = str.FindAllStringSubmatch(result, -1)
for _, j := range alls {
temp, err := strconv.Atoi(j[1])
if err != nil {
fmt.Println("string2int err:", err)
}
commentCount += temp
}
str = regexp.MustCompile("post-digg-count\">推荐[(](?s:(.*?))[)]</span>")
alls = str.FindAllStringSubmatch(result, -1)
for _, j := range alls {
temp, err := strconv.Atoi(j[1])
if err != nil {
fmt.Println("string2int err:", err)
}
diggCount += temp
}
page <- index
}
//主要工作方法
func working(start, end int) {
fmt.Printf("正在从%d到%d爬取中...\n", start, end)
//channel通知主线程是否所有go都结束
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 int
fmt.Print("startPos:")
fmt.Scan(&start)
fmt.Print("endPos:")
fmt.Scan(&end)
working(start, end)
fmt.Println("阅读:", readCount)
fmt.Println("评论:", commentCount)
fmt.Println("推荐:", diggCount)
}

Golang爬虫+正则表达式的更多相关文章
- Golang - 爬虫案例实践
目录 Golang - 爬虫案例实践 1. 爬虫步骤 2. 正则表达式 3. 并发爬取美图 Golang - 爬虫案例实践 1. 爬虫步骤 明确目标(确定在哪个网址搜索) 爬(爬下数据) 取(去掉没用 ...
- Golang爬虫示例包系列教程(一):pedaily.com投资界爬虫
Golang爬虫示例包 文件结构 自己用Golang原生包封装了一个爬虫库,源码见go get -u -v github.com/hunterhug/go_tool/spider ---- data ...
- 爬虫——正则表达式re模块
为什么要学习正则表达式 实际上爬虫一共就四个主要步骤: 明确目标:需清楚目标网站 爬:将所有的目标网站的内容全部爬下来 取:在爬下来的网站内容中去掉对我们没有用处的数据,只留取我们需要的数据 处理数据 ...
- Python爬虫 正则表达式
1.正则表达式概述 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来 ...
- Python入门-编写抓取网站图片的爬虫-正则表达式
//生命太短 我用Python! //Python真是让一直用c++的村里孩子长知识了! 这个仅仅是一个测试,成功抓取了某网站1000多张图片. 下一步要做一个大新闻 大工程 #config = ut ...
- Python 爬虫-正则表达式(补)
2017-08-08 18:37:29 一.Python中正则表达式使用原生字符串的几点说明 原生字符串和普通字符串的不同 相较于普通字符串,原生字符串中的\就是反斜杠,并不表达转义.不过,字符串转成 ...
- Python 爬虫-正则表达式
2017-07-27 13:52:08 一.正则表达式的概念 (1)正则表达式是用来简洁表达一组字符串的表达式,最主要应用在字符串匹配中. 正则表达式是用来简洁表达一组字符串的表达式 正则表达式是一 ...
- Python爬虫-正则表达式基础
import re #常规匹配 content = 'Hello 1234567 World_This is a Regex Demo' #result = re.match('^Hello\s\d\ ...
- 之前写的关于chromedp的文章被别人转到CSDN,很受鼓励,再来一篇golang爬虫实例
示例说明:用chromedp操作chrome,导航到baidu,然后输入“美女”,然后再翻2页,在此过程中保存cookie和所有img标签内容,并保存第一页的baidu logo为png 注释已经比较 ...
随机推荐
- settings.json文件语法错误先清理错误再重试
运行官方demo,提示要微信开发者工具,导入路径出这玩意. 点击工具,设置,源码试图,把左边代码全部复制到右边, "weApp.devTools.path":"W:\\微 ...
- ant的xml解释
ant必须以<project>开始和</project>结束 --project(父节点) --target(子节点) ---javac(孙节点) ---echo(孙节点)
- 【Matrix-tree Theorem学习笔记】
定义度数矩阵\(D(G)\): 定义邻接矩阵\(C(G)\): 定义\(Laplace\)矩阵\(A\) \( A(G) = D(G) - C(G) \) 记图\(G\)的所有生成树权值和为\(t(G ...
- 回文字符串 Manacher
1. Manacher 忘光了,忘光了. 首先将字符串所有字符之间(包括头尾)插入相同分隔符,再在最前方插入另一个分隔符防止越界. 设以 \(s_i\) 为对称中心的回文串中,最长的回文半径为 \(p ...
- Nginx 动态增加扩展
Nginx 动态增加扩展 1. 先查看目前nginx已加载模块 /home/nginx-1.18.0 # nginx -V nginx version: nginx/1.18.0 built by g ...
- kubernetes部署kube-scheduler服务
同样的分非认证授权和认证授权: 非认证授权: cat > /lib/systemd/system/kube-scheduler.service <<EOF [Unit] Descri ...
- JavaScript | 新手村(一)变量,运算和变量方法
资料来自:JavaScript 第一步 1. 向 html 页面添加 JavaScript 1.1 内部 JavaScript 在 html 文件中的 </body> 标签前插入代码: & ...
- 7个连环问揭开java多线程背后的弯弯绕
摘要:很多java入门新人一想到java多线程, 就会觉得很晕很绕,什么可见不可见的,也不了解为什么sync怎么就锁住了代码. 本文分享自华为云社区<java多线程背后的弯弯绕绕到底是什么? 7 ...
- 为构建大型复杂系统而生的微服务框架 Erda Infra
作者|宋瑞国(尘醉) 来源|尔达 Erda 公众号 导读:Erda Infra 微服务框架是从 Erda 项目演进而来,并且完全开源.Erda 基于 Erda Infra 框架完成了大型复杂项目的 ...
- D3基础入门四-事件处理
6.5.0版 .on("mouseover", function(e,d) e: {"isTrusted":true} 第二个参考才是数据,但这在不同的环境可能 ...