web-dev-qa-db-ja.com

セレンは遅いですか、それとも私のコードは間違っていますか?

したがって、Python=を使用してQuoraにログインし、いくつかのものを削り取ろうとしています。

Seleniumを使用してサイトにログインしています。これが私のコードです:

from Selenium import webdriver
from Selenium.webdriver.common.keys import Keys

driver = webdriver.Firefox()
driver.get('http://www.quora.com/')

username = driver.find_element_by_name('email')
password = driver.find_element_by_name('password')

username.send_keys('email')
password.send_keys('password')
password.send_keys(Keys.RETURN)

driver.close()

今の質問:

  1. ログインフォームを見つけて入力するのに4分ほどかかりました。プロセスをスピードアップするために私ができることはありますか?

  2. ログインしたときに、エラーがないことを確認するにはどうすればよいですか?つまり、応答コードを確認するにはどうすればよいですか?

  3. ログイン後にCookieを保存して、スクレイピングを続行するにはどうすればよいですか?

  4. Seleniumを高速化する方法がない場合、ログインする他の方法はありますか? (QuoraにはAPIがありません)

14
KGo

Python Selenium in ChromeDriverを使用した非常に遅いfind_elements_xxx呼び出しで同様の問題がありました。find_element_xxx()呼び出しの前に行ったdriver.implicitly_wait()呼び出しまでトラブルを追跡しました。取り出したところ、find_element_xxx()の呼び出しがすぐに実行されました。

今、私はknow find_elements_xxx()呼び出しを行ったときにそれらの要素がありました。したがって、implicit_waitがこれらの操作の速度に影響を与えたはずなのに、私は想像できませんが、影響を与えました。

10
Polly
  1. 私はそこに行ったことがあります、セレンは遅いです。フォームへの入力に4分ほどかかることはありません。その後、phantomjsを使い始めました。これは、Firefoxよりもはるかに高速です。最新のphantomjsをインストールした後、webdriver行でFirefox()をPhantomJS()に置き換えるだけです。

  2. ログインしていることを確認するには、ログイン後に表示される要素をアサートできます。

  3. ドライバーを終了しない限り、Cookieを使用してリンクをたどることができます

  4. Urllibを使用して、ログインリンクに直接投稿できます。 cookiejarを使用してCookieを保存できます。あなたは単にクッキーを保存することさえできます、結局のところ、クッキーは単にhttpヘッダーの文字列です

3
manish

独自のsetAttributeメソッドを使用してフォームの入力を固定できます。ここにJavaのコードを示します

public void setAttribute(By locator, String attribute, String value) {
    ((JavascriptExecutor) getDriver()).executeScript("arguments[0].setAttribute('" + attribute
            + "',arguments[1]);",
            getElement(locator),
            value);
}
3
Stormy

Webドライバーをヘッドレスで実行すると、実行速度がある程度向上するはずです。

from Selenium.webdriver import Firefox
from Selenium.webdriver.firefox.options import Options

options = Options()
options.add_argument('-headless')
browser = webdriver.Firefox(firefox_options=options)

browser.get('https://google.com/')
browser.close()
1
BugWhisperer

Python Seleniumを使用するWindows 7およびIEDRIVERの場合、Windowsコマンドラインを終了して再起動すると問題が解決しました。

Find_element..clicksで問題が発生しました。彼らは30秒プラス少しかかっていました。これは、実行時間のキャプチャを含めたコードのタイプです。

timeStamp = time.time()
elem = driver.find_element_by_css_selector(clickDown).click()
print("1 took:",time.time() - timeStamp)

timeStamp = time.time()
elem = driver.find_element_by_id("cSelect32").click()
print("2 took:",time.time() - timeStamp)

それはクリックごとに約31秒を記録していました。コマンドラインを終了して再起動すると(IEDRIVERSERVER.exeプロセスは終了します)、クリック1回あたり1秒でした。

0
user3002067

ロケーターを変更しましたが、これは高速に動作します。また、私はクッキーでの作業を追加しました。以下のコードを確認してください:

from Selenium import webdriver
from Selenium.webdriver.common.by import By
from Selenium.webdriver.support import expected_conditions as EC
from Selenium.webdriver.support.ui import WebDriverWait
from Selenium.webdriver.common.keys import Keys
import pickle


driver = webdriver.Firefox()
driver.get('http://www.quora.com/')
wait = WebDriverWait(driver, 5)
username = wait.until(EC.presence_of_element_located((By.XPATH, '//div[@class="login"]//input[@name="email"]')))
password = wait.until(EC.presence_of_element_located((By.XPATH, '//div[@class="login"]//input[@name="password"]')))

username.send_keys('email')
password.send_keys('password')
password.send_keys(Keys.RETURN)

wait.until(EC.presence_of_element_located((By.XPATH, '//span[text()="Add Question"]'))) # checking that user logged in
pickle.dump( driver.get_cookies() , open("cookies.pkl","wb")) # saving cookies
driver.close()

Cookieを保存したので、新しいブラウザーに適用します:

driver = webdriver.Firefox()
driver.get('http://www.quora.com/')
cookies = pickle.load(open("cookies.pkl", "rb"))
for cookie in cookies:
    driver.add_cookie(cookie)
driver.get('http://www.quora.com/')

これが役立つことを願っています。

0
Alex Makarenko