Go秒爬博客园100页新闻

作者:大囚长 时间:2024-04-26 17:15:49 

利用go语言的协程并发优势爬取网页速度相当之快,博客园100页新闻标题只需一秒即可全部爬取


package main

import (
"bytes"
"fmt"
"github.com/PuerkitoBio/goquery"
"log"
"net/http"
"runtime"
"strconv"
"sync"
)

func Scraper(page string) string {
// Request the HTML page.
ScrapeURL := "https://news.cnblogs.com/n/page/" + page
client := &http.Client{}
reqest, _ := http.NewRequest("GET", ScrapeURL, nil)
reqest.Header.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
reqest.Header.Set("Accept-Charset", "GBK,utf-8;q=0.7,*;q=0.3")
//reqest.Header.Set("Accept-Encoding", "gzip,deflate,sdch")
reqest.Header.Set("Accept-Language", "zh-CN,zh;q=0.8")
reqest.Header.Set("Cache-Control", "max-age=0")
reqest.Header.Set("Connection", "keep-alive")
reqest.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36")
res, err := client.Do(reqest)
if err != nil {
 log.Fatal(err)
}
defer res.Body.Close()
if res.StatusCode != 200 {
 log.Fatalf("status code error: %d %s", res.StatusCode, res.Status)
}

// Load the HTML document
doc, err := goquery.NewDocumentFromReader(res.Body)
if err != nil {
 log.Fatal(err)
}

// Find the review items
var buffer bytes.Buffer
buffer.WriteString("**********Scraped page " + page + "**********\n")
doc.Find(".content .news_entry").Each(func(i int, s *goquery.Selection) {
 // For each item found, get the band and title
 title := s.Find("a").Text()
 url, _ := s.Find("a").Attr("href")
 buffer.WriteString("Review " + strconv.Itoa(i) + ": " + title + "\nhttps://news.cnblogs.com" + url + "\n")
})
return buffer.String()
}

func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
ch := make(chan string, 100)
wg := &sync.WaitGroup{}
var page string
for i := 1; i < 101; i++ {
 wg.Add(1)
 go func(i int) {
  page = strconv.Itoa(i)
  fmt.Printf("Scraping page %s...\n", page)
  ch <- Scraper(page)
  wg.Done()
 }(i)
}
wg.Wait()

//print result
for i := 0; i < 101; i++ {
 fmt.Println(<-ch)
}
}

总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

来源:https://blog.csdn.net/Jailman/article/details/81330417

标签:golang,go
0
投稿

猜你喜欢

  • SQL Server无日志恢复数据库(2种方法)

    2024-01-17 03:40:56
  • 浅谈pytorch和Numpy的区别以及相互转换方法

    2022-02-12 03:51:47
  • SingleFlight模式的Go并发编程学习

    2024-04-29 13:05:39
  • 微信公众号token验证失败解决方案

    2022-01-22 14:33:45
  • Python从视频中提取音频的操作

    2021-08-26 23:55:26
  • golang获取网卡信息操作

    2024-02-22 01:57:17
  • vue不通过路由直接获取url中参数的方法示例

    2024-04-30 08:41:06
  • 为什么是 Python -m

    2022-11-25 16:38:21
  • 妙用dw图层与表格进行网页布局

    2009-07-14 21:57:00
  • python实现txt文件格式转换为arff格式

    2022-05-11 16:06:06
  • python 读取二进制 显示图片案例

    2021-10-15 17:27:45
  • Vue开发工具之vuejs-devtools安装教程及常见问题解决(最详细)

    2024-05-10 14:09:33
  • 详解python的webrtc库实现语音端点检测

    2023-07-20 01:44:11
  • JS+CSS实现的日本门户网站经典选项卡导航效果

    2023-09-04 03:40:24
  • PHP平滑关闭/重启的实现方法

    2023-10-05 08:48:29
  • Go语言实现的简单网络端口扫描方法

    2024-04-26 17:23:06
  • python paramiko模块学习分享

    2021-11-10 16:57:00
  • python 处理微信对账单数据的实例代码

    2023-12-19 21:45:23
  • SQL Server误区30日谈 第9天 数据库文件收缩不会影响性能

    2024-01-17 17:45:01
  • python数组循环处理方法

    2023-08-03 16:36:19
  • asp之家 网络编程 m.aspxhome.com