【问题标题】:Selenium: difference between chrome and PhantomJS?-pythonSelenium:chrome 和 PhantomJS 的区别?-python
【发布时间】:2018-02-12 08:04:00
【问题描述】:

我想对 Bing 的搜索结果进行网络抓取。基本上,我使用的是 selenium,这个想法是使用 selenium 自动单击“下一步”并废弃每个页面的搜索结果的 URL。我让它在我的 Ubuntu 上使用 chrome 浏览器运行:

from selenium import web driver
import os

class bingURL(object):

    def __init__(self):
        self.driver=webdriver.Chrome(os.path.expanduser('./chromedriver'))

    def get_urls(self,url):
        driver=self.driver
        driver.get(url)
        elems = driver.find_elements_by_xpath("//a[@href]")
        href=[]
        for elem in elems:
            link=elem.get_attribute("href") 
            try:
                if 'bing.com' not in link and 'http' in link and 'microsoft.com' not in link and 'smashboards.com' not in link:
                    href.append(link)
            except:
                pass

        return list(set(href))




    def search_urls(self,keyword,pagenum):
        driver=self.driver
        searchurl=self.lookup(keyword) ### url of first page of google search
        driver.get(searchurl)
        results=self.get_urls(searchurl) 

        for i in range(pagenum):

            driver.find_elements_by_class_name("sb_pagN")[0].click() # click 'Next' of bing search result
            time.sleep(5) # wait to load page
            current_url=driver.current_url
            #print(current_url)
            #print(self.get_urls(current_url))
            results[0:0]=self.get_urls(current_url)

        driver.quit()
        return results






    def lookup(self,query):

        return "https://www.bing.com/search?q="+query



if __name__ == "__main__":
    g=bingURL()
    result=g.search_urls('Stackoverflow is good',10)

完美运行,当我运行代码时,它会启动 Chrome 浏览器,我可以看到它自动转到下一页,并获取 10 页搜索结果的 URL。

但是,我的目标是在 AWS 上成功运行这些代码。原始代码因错误“Chrome 无法启动”而失败。谷歌之后,似乎我需要在 AWS 上使用像 PhantomJS 这样的无头浏览器。因此我安装了 PhantomJS,并将def __init__(self): 更改为:

 def __init__(self):
        self.driver=webdriver.PhantomJS() 

但是,它不能再点击“下一步”,也不能使用旧代码废弃 URL。错误信息是:

 File ".../SEARCH_BING_MODULE.py", line 70, in search_urls
    driver.find_elements_by_class_name("sb_pagN")[0].click() 

IndexError: list index out of range

看起来改变浏览器完全改变了规则。我应该如何修改更原始的代码以使其再次工作?或者如何使用 selenium+PhantomJS 删除 Bing 搜索结果的 URL?

感谢您的帮助!

【问题讨论】:

  • 这可能与浏览器的用户代理字符串有关,如果你让Phantom匹配Chrome会发生什么?或者只使用无头 Chrome。
  • Headless Chrome 类似于 PhantomJS 等工具。两者都可以用于无头环境中的自动化测试。两者的主要区别在于 Phantom 使用旧版本的 WebKit 作为其渲染引擎,而 Headless Chrome 使用最新版本的 Blink

标签: python selenium selenium-webdriver web-scraping selenium-chromedriver


【解决方案1】:

是的,您可以使用无头浏览器按照所有 3 点执行所有操作。不要使用 HTMLUnit,因为它有很多配置问题。

PhamtomJS 是无头浏览器的另一种方法,但由于维护不善,PhantomJs 近来出现了错误。

您可以将 chromedriver 本身用于无头作业。

您只需要在 chromedriver 中传递一个选项,如下所示:-

chromeOptions.addArguments("--headless");

完整代码将如下所示:-

System.setProperty("webdriver.chrome.driver","D:\\Workspace\\JmeterWebdriverProject\\src\\lib\\chromedriver.exe");
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.addArguments("--headless");
chromeOptions.addArguments("--start-maximized");
WebDriver driver = new ChromeDriver(chromeOptions);
driver.get("https://www.google.co.in/");

希望对你有帮助:)

【讨论】:

    猜你喜欢
    • 2015-04-17
    • 2017-04-06
    • 2016-03-29
    • 2017-08-17
    • 2016-05-25
    • 2012-06-14
    • 1970-01-01
    • 2012-05-05
    • 2021-10-04
    相关资源
    最近更新 更多