前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >chromedp和Go语言相结合采集天涯社区

chromedp和Go语言相结合采集天涯社区

原创
作者头像
华科云商小彭
发布2023-10-24 17:02:37
4190
发布2023-10-24 17:02:37
举报

今天还是给大家带来采集天涯社区的一个代码示例,主要是用chromedp和Go语言相结合编写而成,相对比较复杂,主要对于进阶中的老手可能会有些帮助,让我们一起来看看,这段代码究竟难在哪里。

代码语言:javascript
复制
```go
package main
import (
"context"
"fmt"
"github.com/chromedp/chromedp"
"github.com/chromedp/chromedp/cdp"
"github.com/chromedp/chromedp/protocol/network"
"github.com/chromedp/chromedp/protocol/page"
"github.com/chromedp/chromedp/protocol/target"
"github.com/chromedp/chromedp/protocol/tracing"
"io/ioutil"
"net/http"
"net/url"
"strings"
)
func main() {
// 创建一个Chrome会话
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
// 使用自定义的HTTP客户端,以便在网络请求中使用代理
customClient := &http.Client{
Transport: &http.Transport{
Proxy: http.ProxyFromEnvironment,
},
}
// 使用自定义的URL解析器,以便在解析URL时使用代理
customURL, _ := url.Parse("https://www.tianya.cn")
// 获取代理服务器
proxy, err := getProxy(customClient, customURL)
if err != nil {
fmt.Printf("Error getting proxy: %v\n", err)
return
}
// 设置代理服务器
chromedp.SetProxy(proxy)
// 创建一个新的浏览器实例
browser, err := chromedp.NewBrowser(ctx, chromedp.WithProxy(proxy))
if err != nil {
fmt.Printf("Error creating browser: %v\n", err)
return
}
// 打开一个新的标签页
page, err := browser.NewPage(ctx)
if err != nil {
fmt.Printf("Error creating page: %v\n", err)
return
}
// 导航到www.tianya.cn
err = page.Navigate(ctx, "https://www.tianya.cn")
if err != nil {
fmt.Printf("Error navigating: %v\n", err)
return
}
// 等待页面加载
err = page.Wait(ctx, cdp.PageLoadEventFired)
if err != nil {
fmt.Printf("Error waiting for page load: %v\n", err)
return
}
// 获取页面内容
content, err := page.GetContent(ctx)
if err != nil {
fmt.Printf("Error getting content: %v\n", err)
return
}
// 保存页面内容到文件
err = ioutil.WriteFile("tianya.html", []byte(content), 0644)
if err != nil {
fmt.Printf("Error saving file: %v\n", err)
return
}
fmt.Println("Download completed!")
}
func getProxy(client *http.Client, url *url.URL) (string, error) {
resp, err := client.Get(url.String())
if err != nil {
return "", err
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return "", err
}
// 从HTML内容中提取代理服务器地址
proxy := strings.Split(string(body), "\"")[1]
return proxy, nil
}
```

同样的,这段代码首先获取代理服务器地址,然后使用chromedp库创建一个新的Chrome会话,设置代理,创建一个新的浏览器实例,然后导航到天涯社区,这是一个难点。在页面加载后,程序获取页面内容并将其保存到一个文件中。注意,这个示例代码天涯社区网站是不会更改的,且代理服务器获取的方式可能需要根据实际情况进行调整。在实际应用中,我们可能需要稍微添加自己需要的内容以确保稳定性。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档