Googleイメージローラー


イメージスクロール-Google


Seleniumを使用したWebページのスライス

  • Naverと同様の方法でスクロールを実現した.Naverと異なり、elementの名前は認識できません.
  • [Google]スクロール
  • Googleの画像検索結果は、スクロール中に「より多くの結果を表示」ボタンがあり、すべての検索結果が表示されると、その下部に「表示する内容はありません」と表示されます.このようなヒントメッセージが表示されます.これを利用してスクロールを実現しました.
  • fdef infinite_scroll_down(driver, wait=.5):
        body = driver.find_element_by_tag_name('body')
        # more result btn
        while driver.find_element(By.XPATH, '//input[@class="mye4qd"]').is_displayed() is False:
            body.send_keys(Keys.END)
            time.sleep(wait)
        driver.find_element(By.XPATH, '//input[@class="mye4qd"]').click()
        while driver.find_element(By.XPATH, '//div[@class="OuJzKb Bqq24e"]').text != '더 이상 표시할 콘텐츠가 없습니다.':
            body.send_keys(Keys.END)
            time.sleep(wait)
        body.send_keys(Keys.END)
    [Google]サムネイル画像の取得
  • 22021.1.26を基準として、グーグル画像検索では、上位20ビットの検索結果にbase 64符号化画像が提供され、その後、自分のサーバの画像url形式でサムネイル画像が提供される.
  • 画像要素のsrcがない場合、data-srcにサムネイルURLがあり、スクロール時にURLがsrcにコピーされることを確認します.Chrollerはこのプロセスを待つ必要がないので、srcまたはdata-srcをチェックしてサムネイルのURLを取得できます.しかしながら、呼び出しget_attrubute()によっては、elementの状態が異なる可能性があるため、重複検査が実現される.
  • def get_thumbnail_urls(driver, wait=.1, retry=3):
        imgs = driver.find_elements(By.XPATH, '//img[@class="rg_i Q4LuWd"]')
        urls = []
        for img in imgs:
            count = retry
            while count:
                src = img.get_attribute('src')
                if src is None:
                    src = img.get_attribute('data-src')
                if src is not None:
                    urls += [src]
                    break
                count -= 1
                time.sleep(wait)
    
        print(f'{len(urls)}/{len(imgs)} images are loaded')
        return urls
    
    [Google]オリジナル画像のインポート
  • 22021.1.26を基準に、グーグルの画像検索は検索語の検索結果のサムネイルをリストし、サムネイルをクリックすると右側に元の画像に似た画像が提供されます.
  • ソースとサムネイル画像は異なるリソースなので、それぞれサムネイルをクリックしてソースのurlを取得する必要があります.
  • 元の画像のロードが完了するまで、元のurlは取得できません.操作が完了すると、進捗バーのスタイルプロパティにdisplay:noneが設定されます.
  • def get_image_urls(driver, wait=.1, retry=3):
        def check_loaded():
           loading_bar = driver.find_element(By.XPATH,
                                             '//div[@class="tvh9oe BIB1wf"]//div[@class="k7O2sd"]')       
           return loading_bar.get_attribute('style') == 'display: none;'
    
        body = driver.find_element_by_tag_name('body')
        body.send_keys(Keys.HOME)
    
        imgs = driver.find_elements_by_xpath('//img[@class="rg_i Q4LuWd"]')
    
        urls = []
        for n, img in enumerate(imgs):
            if n == 0:
                img.click()
    
            count = retry
            while count and not check_loaded():
                time.sleep(wait)
                count -= 1
    
            if check_loaded():
                xpath = '//div[@class="tvh9oe BIB1wf"]//img[@class="n3VNCb"]'
                urls.append(driver.find_element_by_xpath(xpath).get_attribute('src'))
            driver.find_element_by_xpath('//div[@class="tvh9oe BIB1wf"]//a[@class="gvi3cf"]').click()
        print(f'{len(urls)}/{len(imgs)} images are loaded')
        return urls
    [Google] ToDo
  • クリック時の右側の類似画像検索結果により、より多くの関連画像を得ることができる.
  • URLアドレスを用いる重複除外方法
  • を改良する.