2017-12-06 4 views
2

PythonでSeleniumを使用してWebページをスクラブしています。私はこのコードを使用して要素を見つけることができています:PythonセレニウムWebdriverコードパフォーマンス

from selenium import webdriver 
import codecs 

driver = webdriver.Chrome() 
driver.get("url") 
results_table=driver.find_elements_by_xpath('//*[@id="content"]/table[1]/tbody/tr') 

results_tableの各要素は、順に要素に要素から変化するサブ要素の数とサブ要素の集合です。私の目標は、各要素をリストまたは区切り文字列として出力ファイルに出力することです。私のコードは、これまでのところ、このです:

results_file=codecs.open(path+"results.txt","w","cp1252") 

for element in enumerate(results_table): 
    element_fields=element.find_elements_by_xpath(".//*[text()][count(*)=0]") 
    element_list=[field.text for field in element_fields] 
    stuff_to_write='#'.join(element_list)+"\r\n" 
    results_file.write(stuff_to_write) 
    #print (i) 
results_file.close() 
driver.quit() 

このコードの第二部は、〜400の要素のリストで約2.5分、約10のサブ要素を持つそれぞれかかります。私は希望の出力を得るが、それは遅すぎる。それを改善するために私は何ができますか? python 3.6

+2

ワンショットで全ページをダウンロードし、BeautifulSoupのようなものを使って処理します。私はしばらくスプリントやセレンを使用していませんが、splinterでは .htmlがページを表示します。私はセレンの構文が何であるか分かりませんが、ページ全体を取得する方法があるはずです。 – Gary02127

+0

私はセレンを使用しています。なぜなら、ログインが必要なウェブサイトのページを徹底的に調べる必要があるからです。ページごとに一度ログインしないようにしたいと思います。 BeautifulSoupはオプションですが、アクティブなchromedriverページをどのように取得するのかわかりません。それでも、学習上、私はコード内で構造的に間違ったことをしているに違いない。 –

+0

@horace_vrファイルの最後に1回だけ書き込むと、各繰り返しの代わりにforループの後にスピードアップしますか? – Grasshopper

答えて

1

、それを処理するためにBeautifulSoupのようなものを使用し、一発で全ページをダウンロードを使用して

。私はしばらくスプリントやセレンを使用していませんが、スプリッターでは.htmlがあなたにページを提供します。 Seleniumの構文がどういうものなのか分かりませんが、ページ全体を取得する方法があるはずです。

Selenium(およびSplinter、これはSeleniumの上に積層されています)は、Webページのコンテンツにランダムにアクセスするのが非常に遅いことが知られています。見た目は.page_sourceのように、私がstackoverflow.com/questions/35486374/…で見つけたセレンのページの内容全体を与えるかもしれません。ページ上のすべてのチャンクを一度に読み取るとパフォーマンスが低下する場合は、ページ全体を一度読み取ってオフラインで処理すると、より早く完了します。

関連する問題