Python 爬蟲入門範例:建立簡易抓取網路資料的爬蟲程式

閱讀時間約 10 分鐘

網路爬蟲(web crawler),也叫網路蜘蛛(spider) 是一個強大的自動化工具,可以自由瀏覽、擷取訪問網頁的各項資訊,例如:新聞文章、電商商品價格,當專案中需要添加外部數據或進行大量資料收集時,網路爬蟲就是一個非常實用的工具。

這篇主要說明爬蟲的基礎概念原理、以及爬蟲常用的 package ,最後實作爬取運動視界的文章為範例,那我們開始吧 😝

爬蟲概念

基本概念是: 透過程式模擬瀏覽網頁訪問的行為,例如: 上下捲動頁面、登入、點選…等動作,然後自動化從網頁擷取想要的資訊,資訊可以是文字、圖片、表格,或是網站上的各種內容。

實際的技術行為是,爬蟲(自動化的程式),透過網路的傳輸協定(HTTP/HTTPS)發送請求到目標網站,然後目標網站的伺服器會 return 網頁的原始碼(HTML) 。這些原始碼就包含了網頁的內容,而我們可以利用 HTML Tag 去提取與篩選需要的資訊。

可以把他簡化成兩個步驟以及其對應的套件
1. 對目標網站伺服器發送請求 -> requests
2. 解析返回的網頁 html -> beautifulsoup4

安裝套件

pip install requests 
pip install beautifulsoup4

實作策略

我們選擇運動視界作為目標網站 : https://www.sportsv.net/basketball


https://www.sportsv.net/basketball/nba

https://www.sportsv.net/basketball/nba

這個頁面是一個所有文章的列表,他包含多篇文章在這個頁面上,那實作的測略為:
1. 先爬取此頁的所有文章連結
2. 再到每一個文章的頁面爬取該文章的標題與內文

另外為保留未來多支爬蟲運行,且有相同功能的 function 可以沿用與好管理,我們把程式的架構分成兩個部分和多個 function,架構為:


程式架構

程式架構

因為每個網站爬取的方式不太相同,要取的 tag 會不同,所以我們以獨立的 Crawler 去管理各個網站的爬蟲,但因為他們有一些功能會相同並且沿用,所以先以 BaseCrawler 定義基礎 fucntion ,並讓未來 Class 可以繼承。

Code

# crawler.py 

import os
import requests
from tqdm import tqdm
from datetime import datetime
from bs4 import BeautifulSoup

class BaseCrawler:
def __init__(self, root_url, topic_url):
self.root_url = root_url
self.topic_url = topic_url

def send_http_request(self, url):
response = requests.get(url)
return response

def parse_html(self, response):
soup = BeautifulSoup(response.text, 'html.parser')
return soup

def save_data(self, folder_path, title, content):

# check title and data is str
if not isinstance(title, str):
title = str(title)
if not isinstance(content, str):
content = str(content)

# check file exist
if not os.path.exists(folder_path):
os.makedirs(folder_path)

# valid title when it as filename
filename = "".join(c for c in title if c.isalnum() or c.isspace()).rstrip()
file_path = os.path.join(folder_path, f"{filename}.txt")

# save
with open(file_path, "w", encoding="utf-8") as f:
f.write(content)


class SportVisionCrawler(BaseCrawler):

def __init__(self, root_url, topic_url):
self.root_url = root_url
self.topic_url = topic_url

def get_all_links(self, topic_url):

# check request root_url
response = self.send_http_request(topic_url)
if not response.ok:
print("Request failed")
return

if response.ok:
print("Request successful")

soup = self.parse_html(response)
h4_elements = soup.find_all('h4')

link_list = []
for h4_element in h4_elements:
a_element = h4_element.find('a')
if a_element:
link = a_element['href']
link_list.append(link)
return link_list

def crawl(self, link_list):
for link in tqdm(link_list):

response = self.send_http_request(link)
soup = self.parse_html(response)
title = soup.find('h1').text
content = soup.find('div', class_='article-content').get_text(strip=True)

self.save_data('./output_crawl/Sport_vision_crawl',title, content)

if __name__ == "__main__":

print('SportVisionCrawler')
root_url = ''
topic_url = 'https://www.sportsv.net/basketball'
crawler = SportVisionCrawler(root_url, topic_url)
link_list = crawler.get_all_links(topic_url)
crawler.crawl(link_list)


Output

raw-image

爬取這篇產出的文:

用一顆籃球練出自信與成就感 翻轉孩子的未來舞台.txt
在花蓮,有一群偏鄉孩子與教練透過他們熱愛的籃球運動,實現改變自我的歷程。籃球已成為生活中、呼吸中不可或缺的一部分,在他們人生中扮演重要角色!走進花蓮市區「籃海計畫」比賽現場,熱鬧、快節奏的西洋歌曲將整個賽場的氛圍炒熱最高點,擔任花蓮熱血鳳凰隊副隊長的鄧安,頭一回穿上繡有自己姓名的球衣,不時穿梭在隊伍中,主動帶動氣氛,鼓勵隊友們拿出積極的精神、平日練好的球技,開心、努力地參賽。請繼續往下閱讀在台灣世界展望會的陪伴下 內斂鄧安勇敢蛻變成長Photo credit:TNL Brand Studio他是副隊長鄧安,今年從花蓮縣鳳林國中畢業,即將進入四維高中就讀,從國小與籃球結緣,在籃球場上他看見自己成長與蛻變。來自單親家庭的他,與媽媽一起生活,天生個性比較膽小、安靜,不會主動表達意見,但在鄧安的內心深處就蘊藏著一顆籃球魂。

Next step

  • Selenium crawler
  • 加入logger管理
  • Error handling
  • Content save to DB

總結

1. 爬取所有文章列表的連結
2. 從連結在爬取所有標題與內文
3. 設計可擴展的框架,以管理未來新增的爬蟲管道

小心得

最近因為對外部數據有需要,而寫爬蟲程式,並且一邊學習一邊實作的過程,很感謝網上豐富的資源、還有 gpt 的協助

這是一個簡單的爬蟲範例,分享給從來沒有使用過爬蟲的人,也可以快速上手跟實作,那當然也有比較複雜的案例,有些網站的機制,可能要多繞幾層才能爬到對應的內容,或需要模擬登入、點擊的動作、甚至是前一頁是否為正常的連結導流的,這都可能成為在爬蟲的過程中需要去解決的問題。

不過覺得也不需要擔心,當爬不到的時候就再去找方法即可!

希望這篇分享有幫助正需要使用爬蟲的你,我們下次見!

32會員
37內容數
歡迎來到《桃花源記》專欄。這裡不僅是一個文字的集合,更是一個探索、夢想和自我發現的空間。在這個專欄中,我們將一同走進那些隱藏在日常生活中的"桃花源"——那些讓我們心動、讓我們反思、讓我們找到內心平靜的時刻和地方
留言0
查看全部
發表第一個留言支持創作者!
Karen的沙龍 的其他內容
上篇我們在安裝 VirtualBox 練習使用虛擬化切割出獨立空間做開發,那除了使用 VM 達到虛擬化外,另一個輕量級的虛擬化技術 - 容器化。 要使用容器,那就不能不認識 Docker
「我只有 Windows 電腦也可以操作 Linux 指令嗎?」 「想試試看其他作業系統,需要移除作業系統再重灌嗎?」 「想了解虛擬化,快來試試看 VirtualBox」 今天就來實作 VirtualBox 安裝 Linux ubuntu 作業系統吧!
上篇我們在安裝 VirtualBox 練習使用虛擬化切割出獨立空間做開發,那除了使用 VM 達到虛擬化外,另一個輕量級的虛擬化技術 - 容器化。 要使用容器,那就不能不認識 Docker
「我只有 Windows 電腦也可以操作 Linux 指令嗎?」 「想試試看其他作業系統,需要移除作業系統再重灌嗎?」 「想了解虛擬化,快來試試看 VirtualBox」 今天就來實作 VirtualBox 安裝 Linux ubuntu 作業系統吧!
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
在這篇教學中,我們將使用 Python 的 requests 和 BeautifulSoup 套件,來爬取台積電股價的最新交易日收盤價。
Thumbnail
上一篇我們已經介紹過Google Colab的基本用法,建議可以先行閱讀「【Google Colab系列】台股分析預備式: Colab平台與Python如何擦出火花?」,進行基本概念與環境的建置再進行下一步會比較容易進行學習。 雖然網路上已經提供非常多的股市資訊,但各個網站可能都零零散散,難免我們得
Thumbnail
今天繼續我們股市LINE BOT的訊息顯示教學,繼上次我們查詢了平均股利的資訊後,這次我們來製作如何查詢歷年股利的部份,其實大同小異,就差在爬取的網站資料差異而已,那我們就開始今天的教學吧!!
Thumbnail
久久沒更新,把這幾天更新在wordpress的文章搬過來囉! 這是篇自己練習爬蟲,並把爬下來的文字內容透過jieba套件分析後產出文字雲的小練習專案
Thumbnail
前陣子因為Heroku被駭客入侵原因,導致Github串聯被封阻,一度無法進行教學,不過近日Heroku已重新全面開放串聯,因此我們將持續恢復教學文章,今天我們要教的是如何爬取個股的平均股利資訊,讓我們輕鬆一鍵了解個股股利的發放狀況
Thumbnail
在上一篇教學中,我們學會如從Goodinfo!中將個股的一些最新與基本資訊爬取下來並打印出來,而先前我們也教過如何爬取台股、全球等較大範圍的新聞爬取,而今天我們就打算將範圍縮小,只針對個股的新聞來進行抓取,那我們就開始今天的教學吧!! 匯入套件 爬取YAHOO!股市
Thumbnail
在上一篇教學中,我們學會了如何將鉅亨網上的新聞爬取下來,並且顯示在LINE BOT中,而我們今天則來教一下如何查詢個股的一些基本資訊,以及最新的開盤價、成交價等資訊吧!!
Thumbnail
在一系列的基礎教學過後,我們終於要來教學跟股票相關的文章了,那就是「如何爬取最新的財經新聞」,別嫌之前的基礎枯燥乏味,基礎打好我們才能夠將功能運用的千變萬化,所以還沒看過之前的基礎教學,可以先去觀看唷!!廢話不多說,我們就開始今天的教學吧!!
Youtube頻道訂閱 免費(Free) 請點擊網址 https://www.youtube.com/channel/UCL-_zTHVc6yrrnSzZChKLjg?sub_confirmation=1 利用jupyter notebook 爬蟲,擷取恆生指數成份股,目前有64檔個股,未來會往1
Thumbnail
有時候需要抓一些網路上的資料 而靜態網頁的呈現方式就是 html 這篇記錄一下怎麼用 Python3 抓靜態網頁上的文字 (以下部分為網路資料擷取)
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
在這篇教學中,我們將使用 Python 的 requests 和 BeautifulSoup 套件,來爬取台積電股價的最新交易日收盤價。
Thumbnail
上一篇我們已經介紹過Google Colab的基本用法,建議可以先行閱讀「【Google Colab系列】台股分析預備式: Colab平台與Python如何擦出火花?」,進行基本概念與環境的建置再進行下一步會比較容易進行學習。 雖然網路上已經提供非常多的股市資訊,但各個網站可能都零零散散,難免我們得
Thumbnail
今天繼續我們股市LINE BOT的訊息顯示教學,繼上次我們查詢了平均股利的資訊後,這次我們來製作如何查詢歷年股利的部份,其實大同小異,就差在爬取的網站資料差異而已,那我們就開始今天的教學吧!!
Thumbnail
久久沒更新,把這幾天更新在wordpress的文章搬過來囉! 這是篇自己練習爬蟲,並把爬下來的文字內容透過jieba套件分析後產出文字雲的小練習專案
Thumbnail
前陣子因為Heroku被駭客入侵原因,導致Github串聯被封阻,一度無法進行教學,不過近日Heroku已重新全面開放串聯,因此我們將持續恢復教學文章,今天我們要教的是如何爬取個股的平均股利資訊,讓我們輕鬆一鍵了解個股股利的發放狀況
Thumbnail
在上一篇教學中,我們學會如從Goodinfo!中將個股的一些最新與基本資訊爬取下來並打印出來,而先前我們也教過如何爬取台股、全球等較大範圍的新聞爬取,而今天我們就打算將範圍縮小,只針對個股的新聞來進行抓取,那我們就開始今天的教學吧!! 匯入套件 爬取YAHOO!股市
Thumbnail
在上一篇教學中,我們學會了如何將鉅亨網上的新聞爬取下來,並且顯示在LINE BOT中,而我們今天則來教一下如何查詢個股的一些基本資訊,以及最新的開盤價、成交價等資訊吧!!
Thumbnail
在一系列的基礎教學過後,我們終於要來教學跟股票相關的文章了,那就是「如何爬取最新的財經新聞」,別嫌之前的基礎枯燥乏味,基礎打好我們才能夠將功能運用的千變萬化,所以還沒看過之前的基礎教學,可以先去觀看唷!!廢話不多說,我們就開始今天的教學吧!!
Youtube頻道訂閱 免費(Free) 請點擊網址 https://www.youtube.com/channel/UCL-_zTHVc6yrrnSzZChKLjg?sub_confirmation=1 利用jupyter notebook 爬蟲,擷取恆生指數成份股,目前有64檔個股,未來會往1
Thumbnail
有時候需要抓一些網路上的資料 而靜態網頁的呈現方式就是 html 這篇記錄一下怎麼用 Python3 抓靜態網頁上的文字 (以下部分為網路資料擷取)