Skip to content

[Python] 使用 Selenium 進行 Google 搜尋引擎的爬蟲

Last Updated on 2021-06-22 by Clay

一直以來,我都想要寫一篇爬蟲的心得文,描述下 Regular Expression、IP 設置、User-Agent ...... 等等經常會用到的各種工具或小知識。一方面是因為當初寫 Blog 的初衷便是想要紀錄下自己學習的過程、一方面則是因為現在花了很多時間進行爬蟲的工作,怕將來若是比較少做,就會慢慢淡忘現在比較熟練的爬蟲技能。

今天的心得筆記以 Google 搜尋引擎為主,使用 Python + Selenium 為主。我可以設定要查詢的關鍵字以及想要爬取的頁數,然後將抓到的標題以及網址印出來。


Selenium 的準備工作

首先,我們自然是要先安裝 "selenium" 這個套件以及 "webdriver_manager":

pip3 install selenium
pip3 install webdriver_manager

然後我們需要安裝 Chromium 的 Driver:

sudo apt-get install chromium-driver

安裝好了以後,再多裝個 "BeautifulSoup4"。其實在我爬蟲的過程中並不是一定需要使用到 "BeautifulSoup4",但是我這次仰賴 "BeatifulSoup4" 的 "prettify()" 印出清楚的版面再進行 Regular Expression 的處理。

pip3 install beautifulsoup4

匯入會用到的套件

首先,先把所有會使用到的套件匯入專案中。

# coding: utf-8
"""
Post the query to Google Search and get the return results
"""
import re
import time
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options




設定參數

# Browser settings
chrome_options = Options()
chrome_options.add_argument('--incognito')
chrome_options.add_argument('user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:65.0) Gecko/20100101 Firefox/65.0')
browser = webdriver.Chrome(chrome_options=chrome_options)


# Query settings
query = 'US Stock'
browser.get('https://www.google.com/search?q={}'.format(query))
next_page_times = 10



在這裡我分別進行了瀏覽器的設定、以及查詢 Query 的關鍵字設定、還有翻頁次數的設定。

chrome_options.add_argument('--incognito')



這行指令是在使用『無痕模式』。

chrome_options.add_argument('user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:65.0) Gecko/20100101 Firefox/65.0')



這行指令是在填入 User-Agent。基本上,Google Chrome 回傳的 HTML 資訊會隨著我們的 User-Agent 而改變。我後續擷取標題及網址的指令是針對我準備的這個 User-Agent 調整的。


進行爬蟲

# Crawler
for _page in range(next_page_times):
    soup = BeautifulSoup(browser.page_source, 'html.parser')
    content = soup.prettify()

    # Get titles and urls
    titles = re.findall('<h3 class="[\w\d]{6} [\w\d]{6}">\n\ +(.+)', content)
    urls = re.findall('<div class="r">\ *\n\ *<a href="(.+)" onmousedown', soup.prettify())

    for n in range(min(len(titles), len(urls))):
        print(titles[n], urls[n])

    # Wait
    time.sleep(5)

    # Turn to the next page
    try:
        browser.find_element_by_link_text('下一頁').click()
    except:
        print('Search Early Stopping.')
        browser.close()
        exit()


# Close the browser
browser.close()