頭前咱介紹 Python 上基本的用法佮概念,久--來,嘛真無聊。咱佇遮來介紹一个例,會當去網路去
捎(sa)資料轉--來。這咧程式真簡單,
uì頭到尾,無算空
逝佮註解,差不多十
逝。
這篇是參考原文:
How to scrape websites with Python and BeautifulSoup,另外佇 TechOrange 有華語的翻譯:
附範例與完整程式碼!手把手帶著你用 Python 做出爬蟲、抓取網頁資料。
毋過,伊毋是
共頂面 ê 例 Copy and Paste 就好,嘛是有一寡鋩
鋩角角愛修整。而且原例是 Python 2 的程式,我會閣揣出方法來予伊踮 Python3 會使振動。
當然,你若會曉一寡網頁 ê 設計智識閣
較好。毋過,就算毋捌嘛免煩惱。因為,這款的寫法是一種 SOP ê 寫法。咱講个 SOP (台羅: e-su-oo-phi, 英文: Standard Operation Procedure),
就是講只要你會電腦環境和我相仝,抑是差不多,干焦照文章內講个照步來共命令拍入去,你的程式就會振動。
啥乜是鑢網 (Web scraping)?
鑢網(Web scraping) 是一種踮網路頂,共你欲
挃的資訊搜揣出來的技術。
你會問,咱用 Chrome, IE, Firebox, Safari 去看就好,那有
啥乜特別咧? 咱佇遮講个揣資料,毋是一筆兩筆,是大量的資料。比如講,我干焦想欲知影一百間公司的股票這馬
偌懸? 平均
偌濟? 你當然會當一間一間去拍開,用
鳥鼠一直點點點,揣著公司股票,
共伊記--落來。仝款的動作做一百改。每擺你拍開一間公司的網頁,
干焦欲
挃一咧數字niâ-niâ。。
不而過,你會看著圖啦,公司的 li-li-khok-khok 的資料,這攏
毋是你想欲--ê。這時,咱愛
共咱無愛
ê 物件鑢予清氣,
賰咱欲愛ê物就好。
鑢網
就是佇網頁中,
共你欲
挃的物件
捎--出來的技術。鑢網是叫電腦共你鬥做,毋是你家己去鑢。
開始
咱是想欲使用 Python 語言來鑢,閣加上伊的一咧程式庫 BeautifulSoup (台羅發音: piú-tho-hu-sup)。
- 若是 Mac/Linux 使用人,本底就有 Python, 先檢查伊的版本。開一咧 terminal,拍 python --version ,你會當看著伊的版本是 2.7
- 若是 Windows,參考Python 官網來安裝。
- 因為咱目標是佇 Python3 頂仔運行,嘛愛檢查有 Python3 無? 佇我的 Linux (Ubuntu 17.04),是 python3。
閣落--來,咱
安裝 pip,佇 terminal,
揤
easy_install pip
easy_install3 pip
pip install BeautifulSoup4
注意: 這愛佇 superuser/root 的身份運行,有
一寡系統直接佇頂仔三的命令前
添 sudo 就有法度運行。
基礎
佇開始進前,咱先了解
一寡 HTML (台羅:e-tshi-thi-emu-elo) ê 基礎和鑢網 ê 規則。
HTML 標籤(piau-tshiam)
你若已經知影 HTML tag, 會共這段
躘--過。
簡單講,你佇
遊覽器(英文: Browser,像 Google Chrome, Firefox, IE, Safari 等等) 看著 ê
網頁,毋是
遊覽器實際看著 ê
網頁。
遊覽器看著 ê
網頁。你會使想做是電影抑是電視ê 劇本: 觀眾看 ê 戲,是先有劇本予導演拍戲,伊會寫一寡台詞無 ê 物件,親像表情,場所來予演員搬戲。HTML 就是劇本,Tag (標籤) 就是共
遊覽器講這咧所在个字是用啥物字體,大細,色緻,
遊覽器照咧做出ê,就是你看著--ê。
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<h1> First Scraping </h1>
<p> Hello World </p>
<body>
</html>
頂仔這段,就是上基礎 ê HTML 網頁。
1. <!DOCTYPE html>: HTML 定著愛用這款 ê 型態宣告 (Type Declaration).
2. 規个 HTML ê 文件,是予 <html> 和 </html>包--咧。
3. HTML 文件 ê meta (台羅: mé-thà) 佮戲文( script) 宣告是囥佇 <head>佮</head>方
4. HTML 文件看會著ê部分是囥佇 <body>佮 </body>籤中方。
5. 標題是囥佇uì <h1> 到<h1>標籤。
6. 段落是用 <p>標籤.
閣有一寡有路用的標籤,像 <a> 來表示超連結(hyperlinks),<table> 來標示表格,<tr> 來表示橫逝(Row),<td> 來表示直逝(Column)。
HTML 標籤不時有用著id(ái-ti) 抑是class(ku-lé-sū)ê 性質(attributes)。id 性質指定一咧唯一 ê 值(Value),這个值踮規个 HTML 文件裡愛是獨一無二。class 性質用來共一寡定定用的 HTML 標籤組合,合起來準做一咧 class,後擺若使用這咧 class,就是仝款 ê 效果。咱會當利用 id 和 class 來搜揣欲挃 ê 乜件。
若欲了解較濟 HTML 標籤,id,和 class,會用(ē-i̋ng) 參考
W3Schools Tutorials
鑢網愛守 ê 規則
1 欲鑢進前,先檢查網站 ê 使用條文和條件 (Terms and Conditions)。特別愛注意和使用資料有關係ê法律條文。普通是袂用佇商業使用。
2 你 ê 程式莫
雄霸霸佇咧
掠資料,按呢有可能共網站
舞害--去。予你 ê 程式較有禮貌咧,親像咱人類上網彼囉款,差不多一秒鐘
掠一咧網頁較好。
3 網頁 ê 佈置 (Layout)
定定變,有時你嘛愛用遊覽器去彼咧網站確認,修改你 ê code。
分析網頁
有一咧做股票ê人,想欲 uì 這咧網頁來
掠出股票名抑是代碼(Index name),佮伊的價數。首先咱開一咧遊覽器(我ê是 Google Chrome),先共鳥鼠徙去股價頂仔,揤鳥鼠 ê 正鈕,揀 "檢查" :
咱就會當看著全頁變按呢:
咱共
正手爿,頂仔 ê 所在共伊放大來看:
咱會當看著股價是囥佇幾落棧 ê HTML 標籤tiőng,就是
<div class="basic-quote"> → <div class="price-container up"> → <div class="price">
利用 HTML tag,這馬咱了解價數是囥佇這咧網頁 ê 佗位。
仝款 ê 道理,咱會當揣其他 ê 物件,親像 S&P 500 Index,恁會使家己試看mài。
行入 Code 裡
咱知影欲挃 ê 資料佇佗,會用咧開始寫咱的鑢網程式。這馬拍開你 ê 編輯器 (Editor)。
咱先用
import 來引入欲使用著 ê 程式庫:
# import libraries
import urllib2
from bs4 import BeautifulSoup
紲--落來,宣告一咧變數,囥網頁 ê URL(台羅: iú-a-e-lo),也就是咱連鞭欲去掠資料 ê 網頁:
# specify the url
quote_page = 'http://www.bloomberg.com/quote/SPX:IND'
利用 urllib2,去共彼咧網頁捎--轉來:
# query the website and return the html to the variable ‘page’
page = urllib2.urlopen(quote_page)
落尾,用 BeautifulSoup 來
kā伊滾滾ê,做好啉 ê 湯,就是
kā網頁
成做 BeautifulSoup ê 樣(format):
# parse the html using beautiful soap and store in variable `soup`
soup = BeautifulSoup(page, ‘html.parser’)
這馬,湯/soup內底就是規个 HTML ê 料,咱欲開始去
kā股價
撈--出來。
閣會記得彼 HTML 標籤有幾落
棧--無? BeautifulSoup 有一咧 find() 來kā咱
鬥相共。佇咱這咧例--
裡,HTML class
name 是唯一ê,先kā伊揣--出來:
# Take out the
of name and get its value
name_box = soup.find(‘h1’, attrs={‘class’: ‘name’})
揣著這咧標籤,咱會使用伊的 text 來提伊的資料:
name = name_box.text.strip() # strip() is used to remove starting and trailing
print name
和頂仔
相siâng,股價嘛
掠會著:
# get the index price
price_box = soup.find(‘div’, attrs={‘class’:’price’})
price = price_box.text
print price
這馬你會使共頂--仔
殕色裡的 code, 都
囥入去編輯器內,
存予好,嘛會使 uì 附件連結,
彼是我試過會
振動 ê
戲文。你
搝--落來(Download)
囥佇電腦,用
python web-scrape.py 來運行。
web-scrape.py
佇下一篇,我欲
共這篇小khua改一咧,先欲共伊uì
Python 2 改做 Python3。