iT邦幫忙

2023 iThome 鐵人賽

DAY 13
0
AI & Data

「AI之旅:Python、Keras、PyTorch」 - 深度學習與數據入門挑戰系列 第 13

【Day13】自製訓練集:爬蟲? 為什麼要爬蟲?

  • 分享至 

  • xImage
  •  

今天來稍微講一下爬蟲,你可能會問:爬蟲?跟AI有關係嗎?
下面就讓我們來介紹介紹

  • 爬蟲
  • 前置作業
  • 實作程式

爬蟲(Web Scraping)

爬蟲(Web Scraping)是一種自動化獲取網絡數據的技術,通過模擬瀏覽器的行為,從網站上提取所需的信息。爬蟲可以讀取網頁的HTML代碼,解析其結構,並提取出需要的數據,如文本、圖片、鏈接等。這些數據可以存儲、分析、可視化或用於其他用途。

為什麼要學爬蟲?

  • 數據收集:網絡上包含了大量有用的數據,包括新聞、價格、評論、社交媒體信息等。學習爬蟲可以幫助您自動化數據收集過程,節省大量時間和精力。

  • 自定義內容:通過爬蟲,您可以創建自己的數據集,用在模型訓練上,並且能夠控制所需數據的品質和種類。

但使用爬蟲也要注意一些問題,爬蟲雖然是獲取資料的好方法,但也因此有大量使用者會使用,而這也衍生出網站會有過量請求,進而造成網站負擔,因此在爬蟲普及後大量網站也開始會偵測爬蟲使用者並封鎖,為了避免這情形有使用者代理(user agent)、浮動IP、延遲請求時間等等方式。

總之學習爬蟲是一項有價值的技能,可以應用於各種領域,從數據分析到市場研究等,並能夠幫助有效地獲取和利用網絡上的訊息。


前置準備

簡短介紹一下我們所使用的工具

  • Selenium
    用於自動化瀏覽器操作的工具和框架,可以模擬人類對瀏覽器的交互行為,例如點擊按鈕、填寫表單、瀏覽網頁和提取網頁數據等。

  • BeautifulSoup
    Beautiful Soup(簡稱BS4)是一個Python庫,用於解析HTMLXML文檔,提取其中的數據,並簡化網頁數據的擷取過程。

  • 安裝函式庫
    首先把爬蟲函式庫安裝好,一樣叫出我們的老朋友(土豆)CMD然後

pip install BeautifulSoup
pip install selenium

這樣就完成了,接下來就是程式部分


實作程式

這段程式碼是一個用於爬取Google圖片搜索結果的爬蟲程式。

  • 引入必要的函式庫
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.service import Service
import time
import os
import shutil
import requests

這裡引入了BeautifulSoup用於解析HTML、Selenium用於自動化瀏覽器操作、以及其他必要的函式庫。

  • 設定存儲圖片的本地路徑和目標元素的class
local_path = 'images/1'  # 存圖位置可自己改
img_class = 'rg_i'       # 目標元素的class

這裡定義了存儲圖片的本地路徑(local_path)和要爬取的圖片元素的class名稱(img_class)。

這裡可以直接使用抓取classimg的原因是我們是使用google圖片,若是在其他網站且兩旁有廣告可能就不能這麼做,因為他會把所有img標籤檔案下載,包含廣告圖片,因此若是要下載其他資料則要用其他方式(這裡不多做介紹)。

  • 設定Google圖片搜索的URL和user agent
url = 'https://www.google.com/search?sca_esv=563286194&hl=zh-TW&sxsrf=AB5stBhULplilmDPtWzjSST6XL-DTIN1Mg:1694059984176&q=%E4%BA%BA%E5%83%8F&tbm=isch&source=lnms&sa=X&ved=2ahUKEwiA29ac0ZeBAxUPH3AKHWOyCHAQ0pQJegQICxAB&biw=1920&bih=923&dpr=1'

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36")

在這裡指定了Google圖片搜索的URL(url),並設定了user agent,以模擬正常的瀏覽器訪問。

url裡放的網址是依照所需放置,例子中所使用的是在GooGle搜尋"人像",所以你想找花生就改成放搜尋花生的網址。

  • 創建Chrome WebDriver對象並前往網站
service = Service()
options = webdriver.ChromeOptions()
chrome = webdriver.Chrome(service=service, options=options)
chrome.get(url)

這裡創建了Chrome WebDriver對象,並使用它前往指定的URL

  • 創建本地目錄
if not os.path.exists(local_path):
    os.makedirs(local_path)
    
    img_url_dic = {}

這段程式碼判別如果目錄不存在的話,創建存儲圖片的資料夾

  • 模擬滾動視窗以加載更多圖片
scroll_pause_time = 1
last_height = chrome.execute_script("return document.body.scrollHeight")

在這裡,程序設定了滾動視窗的間歇時間,然後獲取了網頁當前的高度。

  • 開始滾動視窗並點擊"顯示更多"按鈕
while True:
    chrome.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(scroll_pause_time)
    time.sleep(0.05)
    new_height = chrome.execute_script("return document.body.scrollHeight")

    try:
        show_more_button = chrome.find_element("xpath", '//*[@id="islmp"]/div/div/div/div/div[1]/div[2]/div[2]/input')
        show_more_button.click()
    except Exception as e:
        print("無法點擊顯示更多按鈕:", e)
    if new_height == last_height:
        break

    last_height = new_height

這段程式碼模擬滾動視窗以加載更多圖片,同時嘗試找到並點擊"顯示更多"按鈕來加載更多圖片。這樣可以繼續滾動視窗,直到無法再加載更多圖片為止。

try那行標記了按鈕位置
當然可以模仿其他動作,例如右鍵、Enter等等,甚至可以我們把要尋找圖片名稱設好,全讓爬蟲自己搜尋,不需要我們幫他找好網址。

  • 使用BeautifulSoup解析網頁內容
soup = BeautifulSoup(chrome.page_source, 'html.parser')

裡使用BeautifulSoup解析網頁內容,以便後續提取圖片的URL。

  • 下載圖片並保存到本地
m = 1 # 起始圖片編號
for img in soup.find_all('img', class_=img_class):
    try:
        img_url = img.get('src')

        # 保存圖片到指定路徑
        if img_url and not img_url in img_url_dic:
            img_url_dic[img_url] = ''
            m += 1
            ext = os.path.splitext(img_url)[1]
            filename =   str(m) + ext +'.png'
            print(filename)

            # 下載圖片
            img_response = requests.get(img_url, stream=True)
            with open(os.path.join(local_path, filename), 'wb') as out_file:
                shutil.copyfileobj(img_response.raw, out_file)
            del img_response

    except Exception as e:
        print('發生錯誤:', e)

這段程式碼遍歷網頁中的圖片元素,提取圖片的URL,然後下載圖片並保存到本地目錄中。

  • 關閉瀏覽器
chrome.quit()
print('下載完成')

最後,關閉瀏覽器,完成爬取任務。

以上程式碼就是如何使用SeleniumBeautifulSoup來自動化爬取Google圖片搜索結果中的圖片並保存到本地資料夾。


這裡可以練習下載兩種圖片,存檔位置可以分別為images/1 與 images/2 ,後續我們來用自己爬蟲的資料來做訓練,今天就先到這邊~我們明天見~~


上一篇
【Day12】PyTorch - 今晚我想來點不一樣的
下一篇
【Day14】自製訓練集:爬蟲後的資料處理
系列文
「AI之旅:Python、Keras、PyTorch」 - 深度學習與數據入門挑戰22
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言