diff --git a/baidu/search.go b/baidu/search.go index b547be1..774b50f 100644 --- a/baidu/search.go +++ b/baidu/search.go @@ -166,8 +166,14 @@ func (baid *Baidu) SearchImage(query core.Query) ([]core.SearchResult, error) { if !baid.Browser.LeavePageOpen { defer page.Close() } - page.Reload() - page.WaitLoad() + if err := page.Reload(); err != nil { + baid.logger.Error("Page reload failed: %s", err) + return nil, core.ErrSearchTimeout + } + if err := page.WaitLoad(); err != nil { + baid.logger.Error("Page load wait failed: %s", err) + return nil, core.ErrSearchTimeout + } result, err := page.Timeout(baid.Timeout).Search("body > pre") if err != nil { @@ -235,7 +241,9 @@ func (baid *Baidu) SearchImage(query core.Query) ([]core.SearchResult, error) { searchPage += 1 if !baid.Browser.LeavePageOpen { - page.Close() + if err := page.Close(); err != nil { + baid.logger.Debug("Page close error: %v", err) + } } } diff --git a/bing/search.go b/bing/search.go index e39f029..5726adf 100644 --- a/bing/search.go +++ b/bing/search.go @@ -82,7 +82,9 @@ func (bing *Bing) acceptCookies(page *rod.Page) { if err != nil { return } - consentBtn.Click(proto.InputMouseButtonLeft, 1) + if err := consentBtn.Click(proto.InputMouseButtonLeft, 1); err != nil { + bing.logger.Debug("Cookie consent click failed: %v", err) + } time.Sleep(time.Millisecond * 500) } @@ -113,7 +115,10 @@ func (bing *Bing) Search(query core.Query) ([]core.SearchResult, error) { } defer bing.close(page) - page.WaitLoad() + if err := page.WaitLoad(); err != nil { + bing.logger.Error("Initial page load wait failed: %s", err) + return nil, core.ErrSearchTimeout + } if bing.checkCaptcha(page) { bing.logger.Error("Captcha detected: %s", url) @@ -121,7 +126,10 @@ func (bing *Bing) Search(query core.Query) ([]core.SearchResult, error) { } bing.acceptCookies(page) - page.WaitLoad() + if err := page.WaitLoad(); err != nil { + bing.logger.Error("Post-consent page load wait failed: %s", err) + return nil, core.ErrSearchTimeout + } organicElements, err := page.Timeout(bing.Timeout).Elements("li.b_algo") if err != nil { @@ -262,7 +270,10 @@ func (bing *Bing) SearchImage(query core.Query) ([]core.SearchResult, error) { } defer bing.close(page) - page.WaitLoad() + if err := page.WaitLoad(); err != nil { + bing.logger.Error("Initial image page load wait failed: %s", err) + return nil, core.ErrSearchTimeout + } // Check for captcha if bing.checkCaptcha(page) { @@ -274,7 +285,10 @@ func (bing *Bing) SearchImage(query core.Query) ([]core.SearchResult, error) { bing.acceptCookies(page) // Wait for image results to load - page.WaitLoad() + if err := page.WaitLoad(); err != nil { + bing.logger.Error("Image results load wait failed: %s", err) + return nil, core.ErrSearchTimeout + } time.Sleep(time.Second * 2) // Find all image result containers using CSS selector diff --git a/duckduckgo/search.go b/duckduckgo/search.go index 1670ed4..dfc0209 100644 --- a/duckduckgo/search.go +++ b/duckduckgo/search.go @@ -285,7 +285,10 @@ func (ddg *DuckDuckGo) SearchImage(query core.Query) ([]core.SearchResult, error } // Wait for page to load - page.WaitLoad() + if err := page.WaitLoad(); err != nil { + ddg.logger.Error("Wait load failed: %s", err) + return searchResults, core.ErrSearchTimeout + } time.Sleep(time.Second * 2) // Give time for images to load // Try multiple selectors for DuckDuckGo image results diff --git a/google/search.go b/google/search.go index 96ae9e3..e38094a 100644 --- a/google/search.go +++ b/google/search.go @@ -147,7 +147,13 @@ func (gogl *Google) acceptCookies(page *rod.Page) { gogl.logger.Debug("Cannot get cookie consent buttons: %s", err) return } - btnElms[3].Click(proto.InputMouseButtonLeft, 1) + if len(btnElms) < 4 { + gogl.logger.Debug("Cookie consent buttons unavailable") + return + } + if err := btnElms[3].Click(proto.InputMouseButtonLeft, 1); err != nil { + gogl.logger.Debug("Cookie consent click failed: %s", err) + } } @@ -219,7 +225,9 @@ func (gogl *Google) Search(query core.Query) ([]core.SearchResult, error) { gogl.logger.Debug("Missing link") continue } - link.MoveMouseOut() + if err := link.MoveMouseOut(); err != nil { + gogl.logger.Debug("Move mouse out failed: %s", err) + } href, err := link.Property("href") if err != nil { @@ -255,8 +263,13 @@ func (gogl *Google) Search(query core.Query) ([]core.SearchResult, error) { // Unvail answer contents for _, answ := range answers { - answ.Click(proto.InputMouseButtonLeft, 1) - answ.Focus() + if err := answ.Click(proto.InputMouseButtonLeft, 1); err != nil { + gogl.logger.Debug("Answer expand click failed: %s", err) + continue + } + if err := answ.Focus(); err != nil { + gogl.logger.Debug("Answer focus failed: %s", err) + } //answ.Page().WaitRepaint() } time.Sleep(time.Millisecond * 2000) @@ -274,7 +287,9 @@ func (gogl *Google) Search(query core.Query) ([]core.SearchResult, error) { gogl.logger.Debug("Missing answer link") continue } - link.MoveMouseOut() + if err := link.MoveMouseOut(); err != nil { + gogl.logger.Debug("Move mouse out failed: %s", err) + } href, err := link.Property("href") if err != nil { @@ -368,9 +383,18 @@ func (gogl *Google) SearchImage(query core.Query) ([]core.SearchResult, error) { defer gogl.close(page) for len(searchResultsMap) < query.Limit { - page.WaitLoad() - page.Mouse.Scroll(0, 1000000, 1) - page.WaitLoad() + if err := page.WaitLoad(); err != nil { + gogl.logger.Error("Image page load wait failed: %s", err) + return *core.ConvertSearchResultsMap(searchResultsMap), core.ErrSearchTimeout + } + if err := page.Mouse.Scroll(0, 1000000, 1); err != nil { + gogl.logger.Error("Image page scroll failed: %s", err) + return *core.ConvertSearchResultsMap(searchResultsMap), core.ErrSearchTimeout + } + if err := page.WaitLoad(); err != nil { + gogl.logger.Error("Image results load wait failed: %s", err) + return *core.ConvertSearchResultsMap(searchResultsMap), core.ErrSearchTimeout + } results, err := page.Timeout(gogl.Timeout).Search("div[data-hveid][data-ved][jsaction]") if err != nil { @@ -453,7 +477,9 @@ func (gogl *Google) SearchImage(query core.Query) ([]core.SearchResult, error) { } searchResultsMap[*dataVed] = gR - r.Remove() + if err := r.Remove(); err != nil { + gogl.logger.Debug("Failed to remove parsed image element: %s", err) + } } } diff --git a/google/search_raw.go b/google/search_raw.go index 6fedf9f..ed65730 100644 --- a/google/search_raw.go +++ b/google/search_raw.go @@ -52,7 +52,7 @@ func googleResultParser(response *http.Response) ([]core.SearchResult, error) { // Find URL - look for the anchor that contains the h3 title linkTag := item.Find("h3").Parent() - if linkTag.Is("a") == false { + if !linkTag.Is("a") { linkTag = item.Find("h3").Closest("a") }