Erlo

golang + selenium + xpath 实现web自动化案...

2022-10-20 15:00:04 发布   283 浏览  
页面报错/反馈
收藏 点赞

1 . 安装

go get github.com/antchfx/htmlquery//安装xpath解析go get github.com/tebeka/selenium//安装selenium控制浏览器

下载"chromedriver.exe",版本要与chrome浏览器一致.

2 . 启动远程web驱动

./chromedriver.exe --port=9515 --url-base=wd/hub --verbose

这里推荐使用远程模式 . 因为本地端启动的话 , 首先要配置驱动程序 , 并且启动速度没有远程的快 .

3 . 源码及解读

package mainimport (   "fmt"   "github.com/antchfx/htmlquery"   "github.com/tebeka/selenium"   "log"   "strings"   "time")func main() {   // 连接到本地运行的WebDriver实例。   // 功能配置WebDriver进程和目标浏览器,带有标准和特定于浏览器的选项。   caps := selenium.Capabilities{"browserName": "chrome"}   //NewRemote创建新的远程客户端,启动一个新的会话。   //urlPrefix:Selenium服务器的URL必须以协议(http, https,…)为前缀。   //如果urlPrefix是空字符串,则默认使用DefaultURLPrefix。   wd, err := selenium.NewRemote(caps, fmt.Sprintf("http://localhost:9515/wd/hub"))   if err != nil {      panic(err.Error())   }   //Quit结束当前会话。   //浏览器实例将被关闭。   defer func(wd selenium.WebDriver) {      _ = wd.Quit()   }(wd)   //Get将浏览器打开提供的URL。   _url := "https://www.baidu.com/"   if err := wd.Get(_url); err != nil {      panic(err)   }   for {      //PageSource返回当前页面的源代码。      _, err := wd.PageSource()      if err != nil {         return      }      //获取当前的url      currentURL, err := wd.CurrentURL()      if err != nil {         return      }      log.Println(wd.CurrentURL())      //判断当前url是不是百度      if currentURL == "https://www.baidu.com/" {         //首先找到输入的搜索框         element, err := wd.FindElement("id", "kw")         //如果找不到,就等待1秒         if err != nil {            time.Sleep(time.Second)         }         //如果等待1秒后,或者已经找到,就 输入内容hello         err = element.SendKeys("hello")         if err != nil {            time.Sleep(time.Second)         }         // 获取页面的源码         pageSource, err := wd.PageSource()         if err != nil {            return         }         //申明1个reader类型 , 因为htmlquery.Parse的参数要求是reader类型         reader := strings.NewReader(pageSource)         parse, err := htmlquery.Parse(reader)         if err != nil {            return         }         //找到所有的a链接, 要求a链接中有href属性         nodes := htmlquery.Find(parse, "//a[@href]")         for i, node := range nodes {            //循环获取每个a标签的文本(htmlquery.InnerText(node)),href属性值(htmlquery.SelectAttr(node, "href"))            log.Println(i, htmlquery.InnerText(node), htmlquery.SelectAttr(node, "href"))         }      }      time.Sleep(time.Second * 3)   }}
登录查看全部

参与评论

评论留言

还没有评论留言,赶紧来抢楼吧~~

手机查看

返回顶部

给这篇文章打个标签吧~

棒极了 糟糕透顶 好文章 PHP JAVA JS 小程序 Python SEO MySql 确认