要使用Chromium模拟登录并获取Cookie,然后进行抓取新浪微博接口的数据,通常我们可以通过以下方法:
使用
chromedp:Go语言的chromedp包允许你使用无头浏览器(Headless Chrome/Chromium)进行模拟浏览器操作,包括模拟用户登录,获取页面的Cookie,并发送HTTP请求。模拟用户操作:使用
chromedp完成表单填写和提交,模拟用户登录新浪微博。获取登录后的Cookie:登录成功后,从浏览器上下文中获取Cookie并使用它进行API请求。
使用chromedp模拟登录新浪微博并获取Cookie的步骤:
安装
chromedp: 首先需要在你的Go项目中引入chromedp包,使用以下命令安装:
go get -u github.com/chromedp/chromedp
编写代码:下面是一个完整的示例代码,通过
chromedp自动登录新浪微博,获取登录后的Cookie,然后进行API请求抓取数据。
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"`
}
// 登录微博并获取cookie
func loginWeibo(username, password string) (string, error) {
// 创建Chromium浏览器上下文
ctx, cancel := chromedp.NewContext(context.Background())
defer cancel()
// 创建上下文执行超时控制
ctx, cancel = context.WithTimeout(ctx, 60*time.Second)
defer cancel()
var cookies []string
// 执行Chromium操作
err := chromedp.Run(ctx,
// 打开微博登录页面
chromedp.Navigate(`https://weibo.com/login.php`),
// 等待页面加载
chromedp.WaitVisible(`#loginname`),
// 填写用户名
chromedp.SendKeys(`#loginname`, username),
// 填写密码
chromedp.SendKeys(`input[name="password"]`, password),
// 点击登录按钮
chromedp.Click(`.login_btn`),
// 等待页面跳转完成
chromedp.Sleep(5*time.Second),
// 获取登录后的Cookie
chromedp.Evaluate(`document.cookie`, &cookies),
)
if err != nil {
return "", fmt.Errorf("登录失败: %v", err)
}
// 将Cookie拼接成HTTP头的格式
return cookies[0], 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
username := "your_weibo_username" // 替换为你的微博用户名
password := "your_weibo_password" // 替换为你的微博密码
// 登录微博,获取Cookie
cookie, err := loginWeibo(username, password)
if err != nil {
log.Fatalf("登录失败: %v", err)
}
fmt.Println("获取到的Cookie: ", cookie)
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, 内容: %sn", post.ID, post.Text)
}
}代码说明:
loginWeibo函数:该函数使用
chromedp模拟登录新浪微博,填写用户名和密码后,模拟点击登录按钮并获取登录后的Cookie。这个Cookie将用于后续的接口请求。
fetchWeibo函数:在登录成功后,使用获取到的Cookie来请求新浪微博API。
使用HTTP请求的头信息模拟正常的浏览器访问。
chromedp.Run:chromedp允许你控制浏览器页面的各项操作,包括导航、填写表单、点击按钮等,适用于模拟用户行为。chromedp.Evaluate:该方法用于获取登录成功后的页面Cookie,这些Cookie将被用于后续API请求。
使用说明:
用户名和密码:请替换代码中的
your_weibo_username和your_weibo_password为你的微博用户名和密码。安装依赖:
需要先安装Chromium浏览器,并确保环境中能够正常启动。
如果需要非无头浏览器以便调试,使用
chromedp.WithDebugf(log.Printf)来启用非无头模式。代理问题:
如果需要使用代理,你可以配置
chromedp.NewContext中的浏览器选项,或通过设置代理IP来规避反爬虫。安全性:
请勿将用户名、密码等敏感信息硬编码在代码中,建议使用配置文件或环境变量来存储敏感信息。
注意事项:
新浪微博有可能针对自动化脚本采取更多的反爬措施。如果遇到登录失败,可能需要进一步优化模拟行为,例如处理验证码、滑动验证等复杂登录流程。如果遇到这些问题,可能需要使用其他工具或服务进行辅助。
最后
以上就是名字长了才好记最近收集整理的关于使用Chromium模拟登录获取cookie来登录并获取调试请求中的接口数据的全部内容,更多相关使用Chromium模拟登录获取cookie来登录并获取调试请求中内容请搜索靠谱客的其他文章。
发表评论 取消回复