某网站,年久失修,使用chromedp开发自动登录及内容抓取程序时面临一系列问题,为了后人少走弯路,简单记录一下整体实现过程。
js错误问题:
chrome 打开登录页面时有如下提示,找不到jquery框架文件:
我们需要自己写代码修复一下网站里面的js错误,解决方法如下:
var executed *runtime.RemoteObject
err = chromedp.Run(ctx, chromedp.Tasks{
chromedp.Evaluate(`var jq = document.createElement('script'); jq.src = "https://cdn.bootcss.com/jquery/1.4.2/jquery.js"; document.getElementsByTagName('head')[0].appendChild(jq);`,&executed),
})
其他的还是直接看代码吧,
package main
import (
"context"
"github.com/chromedp/cdproto/emulation"
"github.com/chromedp/cdproto/runtime"
"github.com/chromedp/chromedp"
"io/ioutil"
"log"
"strings"
"time"
)
func main() {
var buf []byte
// create chrome instance
ctx, cancel := chromedp.NewContext(
context.Background(),
chromedp.WithDebugf(log.Printf),
)
defer cancel()
// create a timeout
ctx, cancel = context.WithTimeout(ctx, 50*time.Second)
defer cancel()
// run task list
var res string
var err error
width, height := 1920, 1080
err=chromedp.Run(ctx, chromedp.Tasks{
emulation.SetDeviceMetricsOverride(int64(width), int64(height), 1.0, false),
})
loginUrl:=`http://a.b.c.d/login`
var executed *runtime.RemoteObject
username:="yourusername"
password:="yourpassword"
err = chromedp.Run(ctx, chromedp.Tasks{
chromedp.Navigate(loginUrl),
chromedp.Sleep(5 * time.Second),
chromedp.Evaluate(`var jq = document.createElement('script'); jq.src = "https://cdn.bootcss.com/jquery/1.4.2/jquery.js"; document.getElementsByTagName('head')[0].appendChild(jq);`,&executed),
chromedp.Sleep(5 * time.Second),
chromedp.WaitVisible(`#mypassword`, chromedp.ByID),
chromedp.SendKeys (`input[name="username"]`, username,chromedp.NodeVisible),
chromedp.SendKeys(`#mypassword`, password, chromedp.ByID),
chromedp.Sleep(2 * time.Second),
chromedp.Click(`#login_btn`, chromedp.ByID),
chromedp.Sleep(5 * time.Second),
chromedp.CaptureScreenshot(&buf),
})
if err != nil {
log.Fatal(err)
}
if err := ioutil.WriteFile("1.png", buf, 0644); err != nil {
log.Fatal(err)
}
indexPageUrl:=`http://a.b.c.d/somepage`
err = chromedp.Run(ctx, chromedp.Tasks{
chromedp.Navigate(indexPageUrl),
chromedp.Sleep(5 * time.Second),
chromedp.CaptureScreenshot(&buf),
chromedp.WaitVisible(`#somehtmlid`,chromedp.ByID),
})
if err != nil {
log.Fatal(err)
}
if err := ioutil.WriteFile("2.png", buf, 0644); err != nil {
log.Fatal(err)
}
log.Printf("got: `%s`", strings.TrimSpace(res))
}