2016-04-15 29 views
3

セレンとphantomjsを使って約20ページの動的ページをチェックし、変更があったときに警告するスクリプトは、スクリーンショット部分がなくても速く動作しますが、ページのスクリーンショットを取得するには1-2私に警告し、スクリーンショットを取る時間。 Pythonでページの特定の部分のスクリーンショットを取得するためのより良い、より速い方法がありますか?Selenium Screenshot Works遅い(Python)

ここに私がスクリーンショットのために使用するコードがあります。

from selenium import webdriver 
from PIL import Image 

fox = webdriver.Firefox() 
fox.get('http://stackoverflow.com/') 

# now that we have the preliminary stuff out of the way time to get that image :D 
element = fox.find_element_by_id('hlogo') # find part of the page you want image of 
location = element.location 
size = element.size 
fox.save_screenshot('screenshot.png') # saves screenshot of entire page 
fox.quit() 

im = Image.open('screenshot.png') # uses PIL library to open image in memory 

left = location['x'] 
top = location['y'] 
right = location['x'] + size['width'] 
bottom = location['y'] + size['height'] 


im = im.crop((left, top, right, bottom)) # defines crop points 
im.save('screenshot.png') # saves new cropped image 

は解決:

問題はセレンモジュール、いずれかのスクリーンショットではありません。ファントムズについては ですが、クロムドライバーを使い始めた後は非常に速く、より多くは 効率的です。

ソリューションUPDATE:

phantomjsの問題は、画像を無効にしています。私が使用するとき --load-images=no私はメモリリークの問題に直面し、スクリプトはそれなしで実際には遅くなります は問題ありません。

+0

を、あなたは時間がかかりすぎているあなたのコードのどの部分を決定しましたか? Seleniumのスクリーンショット、またはPILの作物?あなたはその時に何が起こっているのか判断しましたか?その時のCPUリソースはどうなっていますか? – SiKing

+0

はい、私はしました。私がそれを閉じるまで、ファントムズのメモリは3GBに増加し、3GBに固執していましたが、アクティビティモニタで5GBを見たのですが、それは1回だけでしたし、消費するCPUもそれほど増えています。状況は確実ではありません。私は問題はSeleniumのスクリーンショット部分についてだと思います。なぜなら、私はそれをフォローして、フォルダー内の2番目に完全なイメージを切り抜くことができるからです。 – hzleonardo

答えて

3

あなたは、ファイルに最初にそれを保存せずにメモリ内のスクリーンショットをトリミングすることによっていくつかの時間を節約することができます:

import StringIO 
from selenium import webdriver 
from PIL import Image 

driver = webdriver.Firefox() 
driver.get('http://stackoverflow.com') 
element = driver.find_element_by_id('hlogo') 

crop_points = driver.execute_script(""" 
    var r = arguments[0].getBoundingClientRect(); 
    return [r.left, r.top, r.left + r.width, r.top + r.height]; 
    """, element) 

with Image.open(StringIO.StringIO(driver.get_screenshot_as_png())) as img : 
    with img.crop(crop_points) as imgsub : 
     imgsub.save(logo.png', 'PNG') 
+0

答えはありがたいですが、最速の部分はクロッピングです。なぜ私は本当に知りませんが、phantomjsは正常ではなく非常に遅いメモリを消費します。私は4GBのRAM、i5とphantomjsのメモリ消費量は3GBまで可能ですosxを使用しています。それはどのようにすることができますか? – hzleonardo

+0

どのようにChromeでですか?それは悪いですか?おそらくメモリリークがありますが、再現可能な例がなければ、言うことは難しいです。 –

+0

あなたは私を信じていませんが、イメージを読み込むのに使ってもわずか35MBです。同じスクリプト、同じ条件。私は実際にファントムズが何が間違っているのか分かりません。それは最新です。だから、問題はスクリプトやセレンに関する問題ではなく、問題は完全にファントムです。私はオックスフォードにいるので、クロムドライブをヘッドレスにすることはできないので、私はファントムを使用しなければなりませんでした。 – hzleonardo