概述
为了让用户在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库显式手动登录后自动获取接口数据所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复