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 的協助

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

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

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

avatar-img
32會員
40內容數
歡迎來到《桃花源記》專欄。這裡不僅是一個文字的集合,更是一個探索、夢想和自我發現的空間。在這個專欄中,我們將一同走進那些隱藏在日常生活中的"桃花源"——那些讓我們心動、讓我們反思、讓我們找到內心平靜的時刻和地方
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
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
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
在這篇教學中,我們將使用 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
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
在這篇教學中,我們將使用 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 抓靜態網頁上的文字 (以下部分為網路資料擷取)