したがって、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()
今の質問:
ログインフォームを見つけて入力するのに4分ほどかかりました。プロセスをスピードアップするために私ができることはありますか?
ログインしたときに、エラーがないことを確認するにはどうすればよいですか?つまり、応答コードを確認するにはどうすればよいですか?
ログイン後にCookieを保存して、スクレイピングを続行するにはどうすればよいですか?
Seleniumを高速化する方法がない場合、ログインする他の方法はありますか? (QuoraにはAPIがありません)
Python Selenium in ChromeDriverを使用した非常に遅いfind_elements_xxx呼び出しで同様の問題がありました。find_element_xxx()呼び出しの前に行ったdriver.implicitly_wait()呼び出しまでトラブルを追跡しました。取り出したところ、find_element_xxx()の呼び出しがすぐに実行されました。
今、私はknow find_elements_xxx()呼び出しを行ったときにそれらの要素がありました。したがって、implicit_waitがこれらの操作の速度に影響を与えたはずなのに、私は想像できませんが、影響を与えました。
私はそこに行ったことがあります、セレンは遅いです。フォームへの入力に4分ほどかかることはありません。その後、phantomjsを使い始めました。これは、Firefoxよりもはるかに高速です。最新のphantomjsをインストールした後、webdriver行でFirefox()をPhantomJS()に置き換えるだけです。
ログインしていることを確認するには、ログイン後に表示される要素をアサートできます。
ドライバーを終了しない限り、Cookieを使用してリンクをたどることができます
Urllibを使用して、ログインリンクに直接投稿できます。 cookiejarを使用してCookieを保存できます。あなたは単にクッキーを保存することさえできます、結局のところ、クッキーは単にhttpヘッダーの文字列です
独自のsetAttributeメソッドを使用してフォームの入力を固定できます。ここにJavaのコードを示します
public void setAttribute(By locator, String attribute, String value) {
((JavascriptExecutor) getDriver()).executeScript("arguments[0].setAttribute('" + attribute
+ "',arguments[1]);",
getElement(locator),
value);
}
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()
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秒でした。
ロケーターを変更しましたが、これは高速に動作します。また、私はクッキーでの作業を追加しました。以下のコードを確認してください:
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/')
これが役立つことを願っています。