Go分布式爬虫学习笔记(十二)_golang 分布式爬虫

文章目录

12_四种文本处理

获取澎拜新闻内容

package main

import (
	"fmt"
	"io"
	"net/http"
)

func main() {
	url := "https://www.thepaper.cn/"
	resp, err := http.Get(url)
	if err != nil {
		fmt.Println("fetcjh url error:%v", err)
		return
	}
	defer resp.Body.Close()

	if resp.StatusCode != http.StatusOK {
		fmt.Println("Error status code:%v", resp.StatusCode)
		return
	}

	body, err := io.ReadAll(resp.Body)
	if err != nil {
		fmt.Println("read content failed:%v", err)
		return
	}

	fmt.Println("body:", string(body))

}

字符串

  • Go 语言提供了 strings 标准库用于字符处理函数。如下所示,在标准库 strings 包中,包含字符查找、分割、大小写转换、修剪(trim)、计算字符出现次数等数十个函数。go1.20.2 strings doc
// 判断字符串s 是否包含substr 字符串
func Contains(s, substr string) bool
// 判断字符串s 是否包含chars 字符串中的任一字符
func ContainsAny(s, chars string) bool
// 判断字符串s 是否包含符文数r
func ContainsRune(s string, r rune) bool
// 将字符串s 以空白字符分割,返回一个切片
func Fields(s string) []string
// 将字符串s 以满足f(r)==true 的字符分割,返回一个切片
func FieldsFunc(s string, f func(rune) bool) []string
// 将字符串s 以sep 为分隔符进行分割,分割后字符末尾去掉sep
func Split(s, sep string) []string

  • strconv提供类型转化的函数
// 字符串转换为十进制整数
func Atoi(s string) (int, error)
// 字符串转换为某一进制的整数,例如八进制、十六进制
func ParseInt(s string, base int, bitSize int) (i int64, err error)
// 整数转换为字符串
func Itoa(i int) string
// 某一进制的整数转换为字符串,例如八进制整数转换为字符串
func FormatInt(i int64, base int) string

字符编码

  • 在 Go 语言中,字符串是默认通过 UTF-8 的形式编码的。
  • 目前大多数网站都使用 UTF-8 编码,但其实服务器发送过来的 HTML 文本可能拥有很多编码形式。一些国内的网站就会采用 GB2312 的编码方式。
  • 要实现编码的通用性,我们使用官方处理字符集的库:
go get golang.org/x/net/html/charset
go get golang.org/x/text/encoding

封装编码和获取网页内容

package main

import (
	"bufio"
	"fmt"
	"github.com/funbinary/go\_example/pkg/errors"
	"golang.org/x/net/html/charset"
	"golang.org/x/text/encoding"
	"golang.org/x/text/encoding/unicode"
	"golang.org/x/text/transform"
	"io"
	"net/http"
)

func main() {
	//url := "https://www.thepaper.cn/"
	url := "https://www.chinanews.com.cn/"
	body, err := Fetch(url)

	if err != nil {
		fmt.Println("read content failed:%v", err)
		return
	}

	fmt.Println(string(body))
}

func Fetch(url string) ([]byte, error) {
	var e encoding.Encoding
	resp, err := http.Get(url)

	if err != nil {
		return nil, errors.Wrap(err, "fetch url error")
	}

	defer resp.Body.Close()

	if resp.StatusCode != http.StatusOK {
		return nil, errors.Errorf("Error status code:%v", resp.StatusCode)
	}

	r := bufio.NewReader(resp.Body)
	e, err = DeterminEncoding(r)
	utf8r := transform.NewReader(r, e.NewDecoder())
	return io.ReadAll(utf8r)
}

func DeterminEncoding(r \*bufio.Reader) (encoding.Encoding, error) {
	bytes, err := r.Peek(1024)
	if err != nil {
		return unicode.UTF8, err
	}

	e, \_, \_ := charset.DetermineEncoding(bytes, "")
	return e, nil
}


正则表达式

正则表达式是一种描述文本内容组成规律的表示方式,它可以描述或者匹配符合相应规则的字符串。

用途

  • 校验数据的有效性
  • 搜索
  • 替换特定模式的字符串

标准

  • POSIX

    • BRE
    • ERE
    • Linux 和 Mac 在原生集成 GNU 套件(例如 grep 命令)时,遵循了 POSIX 标准,并弱化了 GNU BRE 和 GNU ERE 之间的区别。
    • GNU BRE 和 GNU ERE 的差别主要体现在一些语法字符是否需要转义上
    # BRE
    > echo  "addf" | grep  'd\{1,3\}'
    # ERE 需要使用-E参数
    > echo  "addf" | grep -E 'd{1,3}'
    
    
  • PCRE

    • perl演进
    • 大部分高级语言,包括Go使用
    • grep要使用 -P
    # 使用 ERE 标准
    > echo  "11d23a" | grep -E '[[:digit:]]+' 
    
    # 使用 PCRE 标准
    > echo  "11d23a" | grep -P '\d+'
    
    

获取推荐页面标题

​[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aKEIRy1k-1679758861177)(https://assets.b3logfile.com/siyuan/1658627274984/assets/image-20230325230448-leqouxs.png)]​​

image

package main

import (
	"bufio"
	"fmt"
	"github.com/funbinary/go\_example/pkg/errors"
	"golang.org/x/net/html/charset"
	"golang.org/x/text/encoding"
	"golang.org/x/text/encoding/unicode"
	"golang.org/x/text/transform"
	"io"
	"net/http"
	"regexp"
)

// var headerRe = regexp.MustCompile(`<div class="news\_li"[\s\S]\*?<h2>[\s\S]\*?<a.\*?target="\_blank">([\s\S]\*?)</a>`)
var headerRe = regexp.MustCompile(`<div class="small\_cardcontent\_\_BTALp"[\s\S]\*?<h2>([\s\S]\*?)</h2>`)

func main() {
	url := "https://www.thepaper.cn/"
	body, err := Fetch(url)

	if err != nil {
		fmt.Println("read content failed:%v", err)
		return
	}
	matches := headerRe.FindAllSubmatch(body, -1)
	for \_, m := range matches {
		fmt.Println("fetch card news:", string(m[1]))
	}
}

func Fetch(url string) ([]byte, error) {
	var e encoding.Encoding
	resp, err := http.Get(url)

	if err != nil {
		return nil, errors.Wrap(err, "fetch url error")
	}

	defer resp.Body.Close()

	if resp.StatusCode != http.StatusOK {
		return nil, errors.Errorf("Error status code:%v", resp.StatusCode)
	}

	r := bufio.NewReader(resp.Body)
	e, err = DeterminEncoding(r)
	utf8r := transform.NewReader(r, e.NewDecoder())
	return io.ReadAll(utf8r)
}

func DeterminEncoding(r \*bufio.Reader) (encoding.Encoding, error) {


![img](https://img-blog.csdnimg.cn/img_convert/5a2de1e6a30abb72834bdba1b5e29c2c.png)
![img](https://img-blog.csdnimg.cn/img_convert/446bebfeacd19caf88db5d67849119cb.png)
![img](https://img-blog.csdnimg.cn/img_convert/ce6b053301b290b9d297f945578bde70.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**

oder())
	return io.ReadAll(utf8r)
}

func DeterminEncoding(r \*bufio.Reader) (encoding.Encoding, error) {


[外链图片转存中...(img-ZugudgRo-1726037357044)]
[外链图片转存中...(img-s7IUv613-1726037357045)]
[外链图片转存中...(img-zHCZTu5l-1726037357045)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**

  • 16
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值