python + selenium でgoogle検索上位10件のURLを取得する
python + selenium で google検索を行なったり検索結果の画像や文言を取得する方法は見つかったが URLを取得する方法はすぐに見つからず自作した
seleniumの導入
こちらを参照
実際のコード
options = Options() options.add_argument('--headless') #ヘッドレスモードを有効 driver = webdriver.Chrome("./chromedriver_win32/chromedriver.exe",options=options) driver.set_page_load_timeout(10) #timeoutを設定10秒 driver.get('https://www.google.com/') search = driver.find_element_by_name('q') search.send_keys('検索したい文字列') search.submit() #ここで検索 elems = driver.find_elements_by_class_name("r") #検索結果の取得 urls = [e.find_element_by_tag_name("a").get_attribute("href") for e in elems][:min(10, len(elems)] #URLを取得して上位10件 (10件以下であれば全部) に絞る
解説
ここは最初の設定
options = Options() options.add_argument('--headless') #ヘッドレスモードを有効 driver = webdriver.Chrome("./chromedriver_win32/chromedriver.exe",options=options) driver.set_page_load_timeout(10) #timeoutを設定10秒
ここでgoogleサイトを開いて検索ボックスを取得する send_keysで検索ボックスに文字を書き込む submit()はclick()でも良いが、ボタンを押す操作に当たる
driver.get('https://www.google.com/') search = driver.find_element_by_name('q') search.send_keys('検索したい文字列') search.submit() #ここで検索
google検索において検索結果にはクラスとして"r"が与えられているようであるのでこれを取得する さらに検索結果にはURLに"href"属性を与えられているため、これで取得が可能 (複数のhrefがあるかまでは見ていないが、最初のhrefは必ず検索結果のURL)
elems = driver.find_elements_by_class_name("r") #検索結果の取得 urls = [e.find_element_by_tag_name("a").get_attribute("href") for e in elems][:min(10, len(elems)] #URLを取得して上位10件 (10件以下であれば全部) に絞る
error: DevToolsActivePort file doesn't exist が起こったら
これはlinuxでしか起こらないらしいが、
options.add_argument('--headless')
を
options.add_argument('--headless') options.add_argument( "--no-sandbox") options.add_argument("--disable-dev-shm-usage")
にすれば良いらしい