为了让用户在Chromium浏览器中手动登录新浪微博,然后继续自动化操作,我们可以利用chromedp库,启动一个显式的Chromium浏览器,暂停操作让用户手动登录,完成登录后再继续自动化抓取微博数据的流程。具体的流程如下:
流程概述:
启动Chromium浏览器。
导航到新浪微博登录页面,让用户手动登录。
等待用户登录完成。
获取登录后的Cookie。
使用获取到的Cookie进行后续的API数据抓取。
核心改动点:
使用显式浏览器(非无头模式)让用户手动登录。
通过暂停执行代码等待用户完成登录。
登录完成后,通过
chromedp获取Cookie。
下面是实现该功能的完整代码:
package main
import (
"context"
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
"time"
"github.com/chromedp/chromedp"
)
// 定义微博接口返回的结构体
type WeiboResponse struct {
Data []struct {
ID string `json:"id"`
Text string `json:"text"`
} `json:"data"`
}
// 启动Chromium手动登录并获取Cookie
func getCookiesAfterManualLogin() (string, error) {
// 创建Chromium浏览器上下文,显式启动浏览器
opts := append(chromedp.DefaultExecAllocatorOptions[:],
// 显示浏览器
chromedp.Flag("headless", false),
// 窗口大小
chromedp.WindowSize(1200, 900),
)
allocCtx, cancel := chromedp.NewExecAllocator(context.Background(), opts...)
defer cancel()
// 创建Chromedp上下文
ctx, cancel := chromedp.NewContext(allocCtx)
defer cancel()
// 设置执行上下文超时控制
ctx, cancel = context.WithTimeout(ctx, 120*time.Second)
defer cancel()
// 打开微博登录页面
if err := chromedp.Run(ctx, chromedp.Navigate(`https://weibo.com/login.php`)); err != nil {
return "", fmt.Errorf("无法打开微博登录页面: %v", err)
}
// 提示用户手动登录
fmt.Println("请手动登录新浪微博...")
// 等待手动登录完成,可以根据实际情况调整超时时间
time.Sleep(30 * time.Second)
// 获取登录成功后的Cookie
var cookies string
err := chromedp.Run(ctx, chromedp.Evaluate(`document.cookie`, &cookies))
if err != nil {
return "", fmt.Errorf("获取cookie失败: %v", err)
}
fmt.Println("登录成功,获取到的Cookie: ", cookies)
return cookies, nil
}
// 使用Cookie请求抓取微博API数据
func fetchWeibo(uid string, page int, cookie string) (*WeiboResponse, error) {
// 构建URL
url := fmt.Sprintf("https://weibo.com/ajax/statuses/mymblog?uid=%s&page=%d&feature=0", uid, page)
// 创建一个HTTP客户端,设置超时
client := &http.Client{
Timeout: 10 * time.Second,
}
// 创建HTTP请求
req, err := http.NewRequest("GET", url, nil)
if err != nil {
return nil, err
}
// 模拟浏览器请求头
req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36")
req.Header.Set("Referer", "https://weibo.com/")
req.Header.Set("Accept-Language", "zh-CN,zh;q=0.9")
req.Header.Set("Cookie", cookie) // 使用手动登录获取到的Cookie
// 发送请求
resp, err := client.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
// 读取响应体
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, err
}
// 打印原始响应,便于调试
// fmt.Println(string(body))
// 解析JSON数据
var weiboResp WeiboResponse
if err := json.Unmarshal(body, &weiboResp); err != nil {
return nil, err
}
return &weiboResp, nil
}
func main() {
// 启动Chromium手动登录并获取cookie
cookie, err := getCookiesAfterManualLogin()
if err != nil {
log.Fatalf("获取cookie失败: %v", err)
}
uid := "7839005930" // 新浪微博用户ID
page := 1 // 要抓取的页面
// 使用获取到的Cookie抓取微博API数据
weiboData, err := fetchWeibo(uid, page, cookie)
if err != nil {
log.Fatalf("抓取数据失败: %v", err)
}
// 打印抓取到的数据
for _, post := range weiboData.Data {
fmt.Printf("ID: %s, 内容: %s\n", post.ID, post.Text)
}
}代码解读:
显式启动Chromium:
通过
chromedp.ExecAllocator配置显式浏览器启动,chromedp.Flag("headless", false)用于禁用无头模式,这样浏览器窗口会显示出来,允许用户手动操作。chromedp.WindowSize(1200, 900)指定浏览器窗口的大小。手动登录:
浏览器启动后,打开新浪微博的登录页面。然后程序暂停(使用
time.Sleep)等待用户手动登录。这里使用了
time.Sleep(30 * time.Second)暂停30秒,可以根据实际情况调整时间。如果页面有进一步的跳转或验证码验证,可能需要等待更长时间。获取Cookie:
用户手动登录成功后,程序通过
chromedp.Evaluate获取浏览器上下文中的Cookie。document.cookie返回的是当前页面的Cookie字符串,随后可以用它来发起后续的API请求。抓取API数据:
获取到Cookie后,通过
fetchWeibo函数进行API请求,模拟正常用户请求获取微博数据。
使用说明:
手动登录:当程序提示“请手动登录新浪微博...”时,用户需要手动完成登录流程。包括输入用户名、密码以及可能的验证码。
延长登录等待时间:默认的等待时间是30秒。你可以根据实际情况修改
time.Sleep的时间,确保有足够的时间来完成登录。保存Cookie:如果需要保存Cookie以便下次重用,可以将获取到的Cookie存储到本地文件中。
注意事项:
验证码问题:如果微博登录过程中出现了验证码,用户需要手动解决。程序会暂停等待用户操作。
频率限制:微博可能会对抓取请求的频率进行限制,请根据实际情况控制请求频率,避免触发反爬虫机制。
最后
以上就是名字长了才好记最近收集整理的关于golang利用chromedp库显式手动登录后自动获取接口数据的全部内容,更多相关golang利用chromedp库显式手动登录后自动获取接口数据内容请搜索靠谱客的其他文章。
发表评论 取消回复