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()