2017-07-07 6 views
0

私はSeleniumとそのPythonバインディングを使用して、LinkedInのWebScrapeから研究プロジェクトを行っています。私は人々のプロフィールを書き留める。SeleniumがLinkedIn回転円を明示的に待ちます

LinkedInでは、ユーザープロファイルを読み込むと、サイトは経験と教育が完全に読み込まれるまで回転サークルを置きます。 HTMLソースコード、経験と教育のセクションを得るために、回転サークルが消えるまでSeleniumが待つようにします。

私の質問は次のとおりです。LinkedInスピンサークルを明示的に待つようにコードを書くにはどうしたらよいですか?

編集:より正確な質問は次のようになります:旋回円のロケータを取得するにはどうすればよいですか? ブラウザの開発ツールからこれを行う時間はありません。彼らはあまりにも速く消える

EDIT 2:別のポイント。人は教育課を持っていてもいなくてもよい。クリックするか、そうでなければ存在する教育セクションをチェックすることは解決策ではありません。教育部門がない(教育部門をDOMに入れていないLinkedInに関する情報を入力していない)、またはまだロードされていないため、教育部門は存在しない可能性があります(スピンサークルがあります)。私はそれがどれであるかを知りたい。 2番目の理由(回転円がある)なら、私は待っています。 (セクションはeducation-sectionというクラスのdivです)。同じことが経験に当てはまる

ここはこの質問の目的のためのプロジェクトの中核です。

これらは、クラス内の2つの関数です。 self.getBrowser() WebDriverオブジェクトを返します。明快さと簡潔さのために、私は2つの関数の中のコードを含む非面白い部分をカットしているので、現実には使われていないと思われる引数があります。残りの変数が自己説明的であることを願っています。

def waitForPresenceCondition(self, by, value, sleep = True, check_for_404 = True): 
    try: 
     condition = EC.visibility_of_element_located((by, value)) 
     WebDriverWait(self.getBrowser(), self.wait_timeout).until(condition) 
    except TimeoutException: 
     logging.critical("Timed out waiting for page element. Fatal. Exiting") 
     raise 
    except: 
     logging.error("Unexpected exception waiting for page element. Exiting") 
     raise 
    else: 
     logging.debug("Element found in URL") 

# Scrape an organization 
def scrape(self, url): 
    self.getBrowser().get(url) 
    try: 
     self.waitForPresenceCondition(By.CLASS_NAME, "pv-profile-wrapper") 
    except Error404: 
     logging.info("waitForPresenceCondition raised 404 error. Returning False") 
     return False 
    #INSERT HERE EXPLICIT WAIT FOR THE SPINNING CIRCLES 

答えて

2

を消えるまで待つことvisible=Falseパラメータを使用してwaitForPresenceCondition()を使用できるようにする必要がありますクラス名はartdeco-spinner

私は、ブレークポイントクロームデベロッパーツールで

フォローthisガイドと私はもう付属見えないかのいずれかであることをlocatorを待ちセレンinvisibility_of_element_located機能を、使用している@Anderssonによって提案次にとして「アニメーション」のイベント

にブレークポイントを挿入DOM。私は2つのケースを区別する必要はありません

def waitForInvisibility(self, by, value): 
    condition_str = "(" + str(by) + "," + value + ")" 
    url = self.getBrowserURL() 
    msg = "Waiting for in-visibility of " 
    msg += condition_str 
    msg += " in URL='" + url + "'" 
    logging.info(msg) 
    try: 
     condition = EC.invisibility_of_element_located((by, value)) 
     WebDriverWait(self.getBrowser(), self.wait_timeout).until(condition) 
    except TimeoutException: 
     logging.critical("Timed out waiting for element invisibility. Exiting") 
     raise 
    except: 
     logging.error("Unexpected exception waiting for element invisibility. Exiting") 
     raise 
    else: 
     logging.debug("Element " + condition_str + " is now invisible in URL='" + url + "'") 
1

あなたは以下のようにコードを更新することができます。

def waitForPresenceCondition(self, by, value, sleep=True, check_for_404=True, visible=True): 
    try: 
     if visible: 
      condition = EC.visibility_of_element_located((by, value)) 
     else: 
      condition = EC.invisibility_of_element_located((by, value)) 
     WebDriverWait(self.getBrowser(), self.wait_timeout).until(condition) 

これは、あなたがスピニング円とdivは糸車を持って

+0

問題は次のとおりです:どのように旋回円のロケータを取得できますか?ブラウザのdelevopmentツールからこれを行う時間はありません。それらはあまりにも速く消えます – raffamaiden

+0

'div'で囲まれた要素に' click() 'しようとすると、' org.openqa.selenium.WebDriverException:要素がポイントでクリックできません411,675)。他の要素はクリックを受け取ります:ここではターゲットdiv'のHTMLが来ます。あなたはセレクタを作るために例外から 'HTML'サンプルを使うことができます – Andersson

+0

もっと具体的にすることができますか?プロファイルをロードすると、回転円が得られます。しばらくしてから、それらのスピンしているサークルは自分たちで離れます(おそらくそれはすべてAJAX経由で処理されます)。 「時間がたつと変わっていますが」、開発ツールからスピンしているサークルを選択し、セレクタとして使うことができる独自のクラスやIDがあるかどうかを確認するだけでは不十分です – raffamaiden

関連する問題