python使用selenium+chromedriver調(diào)用chrome截圖

selenium在使用時一直提醒換掉phantomjs 改用 chrome的headless模式,主要是因?yàn)閜hantomjs的維護(hù)已經(jīng)很少了酗失,而chrome的headless模式越來越完善嵌器。
本來只是自己研究研究,踩了幾個坑,想不到昨天線上截圖服務(wù)器出了問題痘儡,初步判斷是淘寶搞事,用js獲取當(dāng)前瀏覽器類型枢步,直接不去請求數(shù)據(jù)了沉删。
只好馬上開始換用chrome,踩了很多坑醉途,留下了悲傷的淚水矾瑰。
以下步驟可以先在windows嘗試。都兼容的

首先是chromedriver的下載隘擎,https://sites.google.com/a/chromium.org/chromedriver/ 去官網(wǎng)選最新版就好
下好后殴穴,服務(wù)器上要添加執(zhí)行權(quán)限

 chmod +x chromedriver

然后安裝chromium-browser,windows本來就有chrome桌面版就可以了
這里有個坑,服務(wù)器安裝完chrome直接截圖的話采幌,中文會表現(xiàn)為方塊恍涂,所以要安裝字體包

sudo apt-get install ttf-wqy-zenhei

在windows下可以直接啟動了

browser = webdriver.Chrome(chrome_driver_path)
browser.get('http://www.reibang.com')
chrome.save_screenshot(img_name)
browser.quit()

但是服務(wù)器并沒有屏幕。很多教程比較老植榕。都是用虛擬屏幕的再沧,現(xiàn)在完全不需要了,headless模式登場

chrome_option = webdriver.ChromeOptions()
chrome_option.add_argument('--headless')
browser = webdriver.Chrome(chrome_driver_path)
browser.get('http://www.reibang.com')
browser.quit()

如果這時候還是報未知錯誤尊残〕慈常可能是沙盒模式啟動錯誤,添加這個關(guān)閉沙盒模式

chrome_option.add_argument('no-sandbox')

接下來是代理設(shè)置寝衫,普通的http代理很簡單顷扩,proxy為'http://ip:port'這樣的形式

chrome_option.add_argument('--proxy-server={}'.format(proxy))

可是https就有問題了。需要關(guān)閉chrome的證書認(rèn)證慰毅,找了很久隘截,終于找到了解決方案,原來之前headless模式一直沒有實(shí)現(xiàn)這個功能汹胃,直到半個月前才有消息
圍觀大佬 https://bugs.chromium.org/p/chromium/issues/detail?id=721739#c60
于是有了解決方案婶芭,= = 找了好久啊,注意這里的版本是有限制的 chroem >= 65 chromedriver>2.35 反正最新版就對了

# 配置忽略ssl錯誤
capabilities = DesiredCapabilities.CHROME.copy()
capabilities['acceptSslCerts'] = True
capabilities['acceptInsecureCerts'] = True
browser = webdriver.Chrome(desired_capabilities=capabilities)

還有一個坑,chrome直接設(shè)置超時會使瀏覽器崩潰着饥,導(dǎo)致無法進(jìn)行下去犀农,像我的需求,載入了一段時間后還是想停止載入并截圖的
20180414 更新
我之前這里寫的是用調(diào)用插件的辦法宰掉,但是仔細(xì)研究后呵哨,現(xiàn)在chrome headless 還不支持插件,不過普通的在頁面加載前執(zhí)行js還是可以的轨奄,就是沒有那么高的權(quán)限

def send(driver, cmd, params={}):
    resource = "/session/%s/chromium/send_command_and_get_result" % driver.session_id
    url = driver.command_executor._url + resource
    body = json.dumps({'cmd': cmd, 'params': params})
    response = driver.command_executor._request('POST', url, body)
    if response['status']:
        raise Exception(response.get('value'))
    return response.get('value')


def add_script(driver, script):
    send(driver, "Page.addScriptToEvaluateOnNewDocument", {"source": script})


WebDriver.add_script = add_script

browser = webdriver.Chrome('./chromedriver', chrome_options=chrome_option)
assert isinstance(browser, WebDriver)

browser.add_script("""
setInterval(function () {document.title = 'sb sb'}, 1000);
""")

想要插件的高權(quán)限只能不用headless模式了
最后是完整代碼

class get_chroem:
    def __init__(self, *args, **kwargs):
        self.browser = None
        self.args = args
        self.kwargs = kwargs
        self.window_size = None

  def _get_chrome(self, type, use_proxy):
    chrome_option = webdriver.ChromeOptions()
    user_agent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
    self.window_size = ('1440', '900')
    chrome_option.add_argument('--proxy-server={}'.format(proxy))
    chrome_option.add_argument('no-sandbox')
    chrome_option.add_argument('--headless')
    # 配置忽略ssl錯誤
    capabilities = DesiredCapabilities.CHROME.copy()
    capabilities['acceptSslCerts'] = True
    capabilities['acceptInsecureCerts'] = True
    browser = webdriver.Chrome(
        chrome_driver_path,
        chrome_options=chrome_option,
        # service_log_path='/opt/logs/chrome.log',
        desired_capabilities=capabilities)

    if self.window_size is not None:
        browser.set_window_size(*self.window_size)
    return browser

def __enter__(self):
    """
    :rtype: selenium.webdriver.chrome.webdriver.WebDriver
    :return:
    """
    self.browser = self._get_chrome(*self.args, **self.kwargs)
    return self.browser

def __exit__(self, exc_type, exc_value, traceback):
    if self.browser is None:
        return
    try:
        self.browser.quit()
    except:
        pass

用with語法調(diào)用口味更佳

# 截圖
chrome.save_screenshot(img_name)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末孟害,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子挪拟,更是在濱河造成了極大的恐慌挨务,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舞丛,死亡現(xiàn)場離奇詭異耘子,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)球切,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門谷誓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吨凑,你說我怎么就攤上這事捍歪』瑁” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵糙臼,是天一觀的道長庐镐。 經(jīng)常有香客問我,道長变逃,這世上最難降的妖魔是什么必逆? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮揽乱,結(jié)果婚禮上名眉,老公的妹妹穿的比我還像新娘。我一直安慰自己凰棉,他們只是感情好损拢,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著撒犀,像睡著了一般福压。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上或舞,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天荆姆,我揣著相機(jī)與錄音,去河邊找鬼嚷那。 笑死胞枕,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的魏宽。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼决乎,長吁一口氣:“原來是場噩夢啊……” “哼队询!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起构诚,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤蚌斩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后范嘱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體送膳,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年丑蛤,在試婚紗的時候發(fā)現(xiàn)自己被綠了叠聋。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡受裹,死狀恐怖碌补,靈堂內(nèi)的尸體忽然破棺而出虏束,到底是詐尸還是另有隱情,我是刑警寧澤厦章,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布镇匀,位于F島的核電站,受9級特大地震影響袜啃,放射性物質(zhì)發(fā)生泄漏汗侵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一群发、第九天 我趴在偏房一處隱蔽的房頂上張望晰韵。 院中可真熱鬧,春花似錦也物、人聲如沸宫屠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽浪蹂。三九已至,卻和暖如春告材,著一層夾襖步出監(jiān)牢的瞬間坤次,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工斥赋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缰猴,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓疤剑,卻偏偏與公主長得像滑绒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子隘膘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容