Web API: cnyes & 104.com#

  • slide for getting json data online

  • Finding data url

  • Scraping 104.com job info

  • Understanding how to send request and get back response

  • Send request with Cookie, payload, Referer…

Send web requests#

瀏覽器在瀏覽一個頁面時,實際上所做的動作是對對對方伺服器發出一個HTTP要求(request),對方伺服器會根據這個要求合不合法來決定要給對方什麼樣的回應(response)。這些回應主要有如HTTP Status Code上所有的情形。例如對方伺服器如果發現要求的內容是對的,但權限是有問題的,就會回應一個「403 Forbidden」的狀態碼(Status Code)。而如果能夠順利拿回資料的話,便會回應「200 OK」並把所要求的資料在回應中傳回來。

HTTP要求有兩類,分別是GET()POST()POST()通常是要填寫表單資訊的時候所送出的要求,例如需要指明要哪一區、哪一種類型的房子、或哪一種類型的車票等。而一般新聞網站或社群網站多會用GET()取回資料。

import requests
import json
response = requests.get('https://tcgbusfs.blob.core.windows.net/dotapp/youbike/v2/youbike_immediate.json')
response.json()
type(response.json())
list

Practice: Find out and traverse data behind urls#

逐一測試過每一個link是否都讀得到資料,以獲得對這些資料概略了解。

Canyes#

url_cnyes = "https://news.cnyes.com/api/v3/news/category/headline?startAt=1588262400&endAt=1589212799&limit=30"
res = requests.get(url_cnyes).json()
print(type(res))
print(res.keys())
<class 'dict'>
dict_keys(['items', 'message', 'statusCode'])

Dcard#

Dcard API最近又做了改版,用以下的Code應該沒辦法順利撈回,但你也可以測試看看,可以看到什麼樣的錯誤訊息。

url_dcard = "https://www.dcard.tw/service/api/v2/forums/relationship/posts?limit=50"
user_agent_dcard = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.34"
headers = {'User-Agent': user_agent_dcard}
res = requests.get(url_dcard, headers = headers)
print(res)
<Response [403]>

(Option) Write a function to load json data#

def get_web_json(url, headers=""):
    response = requests.get(url, timeout=(3, 5), headers=headers)
    print("Response Code:", response.status_code)
    if not response.ok:
        return None
    data = response.json()
    return data

# get_web_json(url_pchome)
# get_web_json(url_cnyes)

Scraping 104.com#

Address

https://www.104.com.tw/jobs/search/list?ro=0&kwop=7&keyword=data%20scientist&expansionType=area%2Cspec%2Ccom%2Cjob%2Cwf%2Cwktm&order=14&asc=0&page=2&mode=s&jobsource=2018indexpoc

Step01. Get the 1st page (but fails)#

先嘗試用上面的方法獲取104.com的搜尋結果的第一頁資料網址,結果應該會傳回來一個空的HTML無法傳回資料。這是因為通常服務提供方會嘗試要求提出拜訪要求的瀏覽器需要提供一些簡單的驗證機制,例如是用什麼瀏覽器連上去的(稱為User-agent,DCard會要求這樣的資訊)、是從哪一個頁面跳過去的(稱為Referer,104.com就有這樣的要求)。

撰寫爬蟲時必須「模仿」瀏覽器的機制,如果對方希望瀏覽器提供這樣的資訊,那撰寫爬蟲時也就要提供這樣的資訊。

url_104 = 'https://www.104.com.tw/jobs/search/api/jobs?jobsource=index_s&keyword=%E8%B3%87%E6%96%99%E7%A7%91%E5%AD%B8&mode=s&order=15&page=1&pagesize=20&'
response = requests.get(url_104)
print(response.status_code)
403
print(response.text)
<!DOCTYPE html>
<html lang="zh-Hant-TW">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="refresh" content="0;url=https://www.104.com.tw/jobs/main/syserr?eid=982a19a2dfd34aa4">

</head>
</html>
print(response.headers)
{'Date': 'Sun, 21 Sep 2025 14:02:25 GMT', 'Content-Type': 'text/html; charset=UTF-8', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Referrer-Policy': 'same-origin', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Vary': 'Accept-Encoding', 'Server': 'cloudflare', 'CF-RAY': '982a19a2dfd34aa4-TPE', 'Content-Encoding': 'gzip'}

Trick. Write html to file#

當明明知道他是一個json,卻一直無法順利用.json()將其拆且為list or dict的型態時,最有可能的問題是,該網址設了一些檢核機制讓我們不能那麼粗暴草率地拿到資料,導致它傳回來給我們的是一個用html編寫成的錯誤訊息,例如stuatus code: 403。這時候我要怎麼知道發生錯誤?一種方式是把status code印出來看看;另一種方式是,他可能也是傳給你status code:200,但實際上就是傳回一個告知你不能存取的html。這時候我們可以採取的作法就是把該HTML,也就是回傳的結果寫入到.html檔,然後用瀏覽器開啟看看他究竟傳回來什麼錯誤訊息。

觀察上面response.text中的回應顯然是以HTML格式撰寫,而下方程式碼會把回應內容寫到一個HTML檔案裡面去,可以在本機端或CoLab上點開該HTML檔來觀察看看究竟傳回來什麼東西。

with open('temp_output.html', 'w') as fout:
    fout.write(response.text)

# webbrowser cannot work, why?
import webbrowser
webbrowser.open_new_tab('temp_output.html')
True

Practice. Observe youbike data headers#

Youtube data所回傳的是一個JSON檔,而上述104.com目前回傳的資料內容是個HTML檔,觀察看看,youbike回應標題是什麼(response headers)?如果要很會寫爬蟲,一定要會觀察header,而這只是最簡單的一種情形。

import requests
import json
response = requests.get('https://tcgbusfs.blob.core.windows.net/dotapp/youbike/v2/youbike_immediate.json')

print(response)
print(response.status_code)
print(type(response)) # <class 'requests.models.Response'>
print(type(response.text)) # <class 'str'>
<Response [200]>
200
<class 'requests.models.Response'>
<class 'str'>
print(response.headers)
import pandas as pd
print(pd.DataFrame.from_dict(response.headers, orient='index'))
{'Content-Length': '865450', 'Content-Type': 'application/json', 'Content-MD5': 'dnI1B+WEPF2OpTmhJKDwNg==', 'Last-Modified': 'Sun, 21 Sep 2025 14:02:10 GMT', 'ETag': '0x8DDF9177568BD27', 'Server': 'Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0', 'x-ms-request-id': '921ceb4f-e01e-0030-4500-2bde66000000', 'x-ms-version': '2009-09-19', 'x-ms-lease-status': 'unlocked', 'x-ms-blob-type': 'BlockBlob', 'Access-Control-Allow-Origin': '*', 'Date': 'Sun, 21 Sep 2025 14:02:25 GMT'}
                                                                        0
Content-Length                                                     865450
Content-Type                                             application/json
Content-MD5                                      dnI1B+WEPF2OpTmhJKDwNg==
Last-Modified                               Sun, 21 Sep 2025 14:02:10 GMT
ETag                                                    0x8DDF9177568BD27
Server                       Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
x-ms-request-id                      921ceb4f-e01e-0030-4500-2bde66000000
x-ms-version                                                   2009-09-19
x-ms-lease-status                                                unlocked
x-ms-blob-type                                                  BlockBlob
Access-Control-Allow-Origin                                             *
Date                                        Sun, 21 Sep 2025 14:02:25 GMT
/Users/jirlong/opt/anaconda3/lib/python3.9/site-packages/pandas/core/computation/expressions.py:21: UserWarning: Pandas requires version '2.8.4' or newer of 'numexpr' (version '2.8.1' currently installed).
  from pandas.core.computation.check import NUMEXPR_INSTALLED
/Users/jirlong/opt/anaconda3/lib/python3.9/site-packages/pandas/core/arrays/masked.py:60: UserWarning: Pandas requires version '1.3.6' or newer of 'bottleneck' (version '1.3.4' currently installed).
  from pandas.core import (

Step02. Add Referer to get 104 data#

現在我們來加入一些對方伺服器可能會要求我們發出request的時候提供的東西,最常見的有以下的資訊。但,實際上我們得一個一個測試看看,才會知道對方要求什麼。通常會從User-agent測起,再來Referer、再來Cookie。但有經驗的人多半一看就猜得到。

  • User-Agent: 你用什麼瀏覽器或系統

  • Referer: 你從哪個頁面點選、跳轉過來

  • Cookies: 經過與伺服器建立連結後,他給了你什麼資訊好讓你持續可以待在這個頁面。

下方程式碼在送出GET()要求時也一併送出了Referer的資訊'https://www.104.com.tw/',意義相當於偽裝成先打開104.com的首頁後,從首頁進入這個查詢連結。理論上如果沒進入首頁,就直接進入查詢連結,不是非常可疑嗎?所以,有些伺服器會偵測,這個要求是從哪一個頁面網址點選後轉過來的,

url_104 = 'https://www.104.com.tw/jobs/search/api/jobs?jobsource=index_s&keyword=%E8%B3%87%E6%96%99%E7%A7%91%E5%AD%B8&mode=s&order=15&page=1&pagesize=20'
headers = {
    'referer': 'https://www.104.com.tw/',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.34'
}

raw = requests.get(url_104, headers=headers).json()
type(raw)
dict

Step03. Traverse data to get the data block#

觀察一下資料的概況,並把他轉為pandas來觀察它。

print(raw.keys())
print(type(raw['data']))
print(type(raw['data'][0]))
df = pd.DataFrame(raw['data'])
df
# print(raw['data'].keys())
# print(type(raw['data']['list']))
# print(type(raw['data']['list'][0]))
# df = pd.DataFrame(raw['data']['list'])
# df
dict_keys(['data', 'metadata'])
<class 'list'>
<class 'dict'>
appearDate applyCnt coIndustry coIndustryDesc custName custNo description descSnippet mrtDist jobAddress ... labels languageRequirements acceptRole employeeCount pcSkills isSave interactionRecord isApplied applyDate userApplyCount
0 20250919 7 1005001007 大專校院教育事業 國立政治大學_創新國際學院 130000000114372 創新國際學院於109年開啟大學部招生作業,致力於培養能綜觀分析並有專業技能的國際公共事務人才... 創新國際學院於109年開啟大學部招生作業,致力於培養能綜觀分析並有專業技能的國際公共事務人才... 0.00 指南路二段64號 ... [foreigners@full_fc_em_jbs, c@wf1, c@wf29, for... [{'language': 1, 'ability': {'listening': 8, '... [2, 32768, 65536] 16 [{'code': '12001008016', 'description': 'Word'... None {'lastProcessedResumeAtTime': 1758365933, 'las... None None None
1 20250915 11 1001001002 電腦軟體服務業 新加坡商鈦坦科技股份有限公司台灣分公司 130000000030920 1. Maintain high levels of service continuity ... 1. Maintain high levels of service continuity ... 0.44 園區街3之1號11樓之1(南港軟體園區二期) ... [c@wf31, c@wf28, c@wf13, c@wf10, c@wf2, c@wf14... [{'language': 1, 'ability': {'listening': 8, '... [] 300 [{'code': '12001007015', 'description': 'Cisco... None {'lastProcessedResumeAtTime': 1758178566, 'las... None None None
2 20250918 5 1001001003 網際網路相關業 鈊象電子股份有限公司 23519738000 1.理解研發或商務單位提出之需求,使用數據或AI方法進行分析、提出並驗證解決方法,並展示工作... 1.理解研發或商務單位提出之需求,使用數據或AI方法進行分析、提出並驗證解決方法,並展示工作... 0.00 五工路130號 ... [c@wf1, c@wf4, c@wf3, c@wf30, c@wf28, c@wf26, ... [] [] 1100 [] None {'lastProcessedResumeAtTime': 1758267366, 'las... None None None
3 20250919 4 1001005003 其他電子零組件相關業 艾新科環保材料有限公司 130000000087975 1. 教育及工經驗\n(1) 碩士以上:相關工作經驗一年以上。\n(2) 學士:相關工作經驗... 1. 教育及工經驗\n(1) 碩士以上:相關工作經驗一年以上。\n(2) 學士:相關工作經驗... 0.13 基隆路一段163號17樓之3 ... [c@wf3, senior@senior_job_H, foreigners@full_f... [] [32, 64, 2048, 32768] 0 [{'code': '12001003045', 'description': 'Pytho... None {'lastProcessedResumeAtTime': 1758437778, 'las... None None None
4 20250115 8 1004001001 銀行業 台北富邦商業銀行股份有限公司 3750168000 習模型、數據特徵庫、產品推薦系統、大型語言模型(LLM)、自主數據分析平台等專案小組(視職能... 習模型、數據特徵庫、產品推薦系統、大型語言模型(LLM)、自主數據分析平台等專案小組(視職能... 0.00 ... [c@wf30, c@wf3, c@wf7, c@wf9, c@wf25, c@wf28, ... [{'language': 1, 'ability': {'listening': 2, '... [] 9457 [] None {'lastProcessedResumeAtTime': 1758093168, 'las... None None None
5 20250910 6 1001001002 電腦軟體服務業 詠鋐智能股份有限公司 130000000186926 作為 產品導向的資料科學家,您將參與 Tukey AutoML 的核心模型模組設計與研發,負... 作為 產品導向的[[[資料科學]]]家,您將參與 Tukey AutoML 的核心模型模組設... 0.04 羅斯福路二段100號25樓 ... [c@wf31, c@wf2, c@wf8, c@wf12, c@wf7, c@wf1] [] [] 20 [{'code': '12001003045', 'description': 'Pytho... None {'lastProcessedResumeAtTime': 1758367010, 'las... None None None
6 20250909 8 1001001002 電腦軟體服務業 維曙智能科技有限公司 130000000229061 會是您大展身手的地方。歡迎加入我們。\n\n作為資料科學家,需要對新技術保有高度熱誠,能夠歸... 會是您大展身手的地方。歡迎加入我們。\n\n作為[[[資料科學]]]家,需要對新技術保有高度... 0.18 忠孝東路二段116號5樓 ... [c@wf7, c@wf26, c@wf8, c@wf12, c@wf9] [] [2, 4, 8, 1024] 0 [{'code': '12001003045', 'description': 'Pytho... None {'lastProcessedResumeAtTime': 1757893487, 'las... None None None
7 20250915 5 1004001007 金融控股業 國泰金控_國泰金融控股股份有限公司 70827406000 隸屬於國泰金控下的資料科學實驗室 Cathay Data Lab Team,實驗室的使命是研... 隸屬於國泰金控下的[[[資料科學]]]實驗室 Cathay Data Lab Team,實驗... 0.00 ... [c@wf13, c@wf10, c@wf35, c@wf1, c@wf28, c@wf4,... [] [] 800 [{'code': '12001005022', 'description': 'hadoo... None {'lastProcessedResumeAtTime': 1758173964, 'las... None None None
8 20250915 8 1003002014 量販流通相關業 全聯福利中心_全聯實業股份有限公司 16740494000 創造真正的影響,歡迎加入我們!\n\n我們需要這樣的人:\n1. 熱愛數據技術 - 對數據工... 創造真正的影響,歡迎加入我們!\n\n我們需要這樣的人:\n1. 熱愛數據技術 - 對數據工... 0.49 敬業四路33號 ... [c@wf10, foreigners@pt_fc_em_jbs, c@wf28, c@wf... [{'language': 1, 'ability': {'listening': 8, '... [] 23000 [] None {'lastProcessedResumeAtTime': 1758158768, 'las... None None None
9 20250918 7 1001001002 電腦軟體服務業 展市華科技有限公司 130000000155726 LLM\n c. 生理訊號 \n d. 語音\n4. 將感測器訊號處理... LLM\n c. 生理訊號 \n d. 語音\n4. 將感測器訊號處理... 0.00 ... [c@wf4, c@wf1, c@wf7, c@wf2] [] [2, 4] 0 [{'code': '12001003010', 'description': 'C++'}... None {'lastProcessedResumeAtTime': 1758448504, 'las... None None None
10 20250916 11 1001001002 電腦軟體服務業 群越廣告科技有限公司 130000000253969 我們正在尋找一位具備深厚數據分析能力與機器學習經驗的資料科學家,加入我們的產品研發團隊。你將... 我們正在尋找一位具備深厚數據分析能力與機器學習經驗的[[[資料科學]]]家,加入我們的產品研... 0.10 南京東路3段287號10樓 ... [c@wf1, c@wf4, c@wf7, c@wf3, c@wf9, c@wf8, c@w... [{'language': 1, 'ability': {'listening': 2, '... [] 11 [{'code': '12001003045', 'description': 'Pytho... None {'lastProcessedResumeAtTime': 1758178671, 'las... None None None
11 20250828 5 1001001003 網際網路相關業 55688集團_台灣智慧生活網股份有限公司 130000000053672 1. 設計、開發、部署及優化機器學習模型,解決實際業務問題。\n2. 使用Python、SQ... 1. 設計、開發、部署及優化機器學習模型,解決實際業務問題。\n2. 使用Python、SQ... 0.32 重新路五段609巷2號7樓之1 ... [senior@senior_job_G, c@wf2, c@wf9, c@wf4, c@w... [{'language': 1, 'ability': {'listening': 4, '... [8, 64, 2048, 32768] 165 [{'code': '12001003045', 'description': 'Pytho... None {'lastProcessedResumeAtTime': 1758178428, 'las... None None None
12 20250915 7 1002015001 精密儀器相關製造業 鴻海集團_英屬開曼群島商鴻騰精密科技股份有限公司台灣分公司 130000000109701 DaVinci應用程序。 \n\n所需條件:\n(學歷)\n 擁有計算機科學、數學、物理學、... DaVinci應用程序。 \n\n所需條件:\n(學歷)\n 擁有計算機[[[科學]]]、數... 0.50 中山路66號 ... [c@wf35, c@wf34, c@wf9, c@wf2, c@wf19, c@wf10,... [{'language': 1, 'ability': {'listening': 2, '... [] 1000 [{'code': '12001003045', 'description': 'Pytho... None {'lastProcessedResumeAtTime': 1758153424, 'las... None None None
13 20250909 6 1001001002 電腦軟體服務業 維曙智能科技有限公司 130000000229061 會是您大展身手的地方。歡迎加入我們。 \n\n我們正在尋找一位對 AI 藥物研發(AI in... 會是您大展身手的地方。歡迎加入我們。 \n\n我們正在尋找一位對 AI 藥物研發(AI in... 0.18 忠孝東路二段116號5樓 ... [c@wf8, c@wf7, c@wf9, c@wf26, c@wf12] [] [] 0 [{'code': '12001002018', 'description': 'Git'}... None {'lastProcessedResumeAtTime': 1758346362, 'las... None None None
14 20250916 5 1012001001 醫院 中國醫藥大學附設醫院 52600770000 領域研究計畫,支援生醫研究人員進行臨床資料、基因體資料與實驗資料之整合分析。\n6.\t資料... 領域研究計畫,支援生醫研究人員進行臨床[[[資料]]]、基因體[[[資料]]]與實驗[[[資... 0.00 育德路2號 ... [c@wf2, c@wf29, foreigners@full_fc_em_jbs, c@w... [{'language': 1, 'ability': {'listening': 2, '... [2, 64] 4000 [] None {'lastProcessedResumeAtTime': 1757934583, 'las... None None None
15 20250910 7 1001001002 電腦軟體服務業 詠鋐智能股份有限公司 130000000186926 作為 交付導向的資料科學家,您將在 Tukey AutoML 專案導入中扮演技術主導角色,從... 作為 交付導向的[[[資料科學]]]家,您將在 Tukey AutoML 專案導入中扮演技術... 0.06 羅斯福路二段100號25樓 ... [c@wf2, c@wf8, c@wf31, c@wf7, c@wf1, c@wf12] [{'language': 1, 'ability': {'listening': 8, '... [] 20 [{'code': '12001002016', 'description': 'Githu... None {'lastProcessedResumeAtTime': None, 'lastCustR... None None None
16 20250908 2 1005001007 大專校院教育事業 慈濟學校財團法人慈濟大學 8152423000 醫務管理、資訊等相關背景。\n2. 若具有基礎統計應用軟體(SAS 或 STATA 或 R ... 醫務管理、資訊等相關背景。\n2. 若具有基礎統計應用軟體(SAS 或 STATA 或 R ... 0.22 忠孝東路六段488號 ... [foreigners@pt_fc_em_jbs, c@wf7, foreigners@fu... [] [] 0 [{'code': '12003005009', 'description': 'SAS'}... None {'lastProcessedResumeAtTime': 1758182687, 'las... None None None
17 20250915 2 1001001002 電腦軟體服務業 緯謙科技股份有限公司 130000000175101 透過數據蒐集、資料分析與可視化架構,解決商業痛點推動業務增長並提升運營效率,與各部門緊密協作... 透過數據蒐集、[[[資料]]]分析與可視化架構,解決商業痛點推動業務增長並提升運營效率,與各... 0.00 新台五路一段88號 ... [c@wf10, c@wf9, c@wf1, c@wf11, c@wf3, c@wf7, c... [{'language': 1, 'ability': {'listening': 8, '... [] 0 [{'code': '12001011012', 'description': 'Power... None {'lastProcessedResumeAtTime': 1757893434, 'las... None None None
18 20250918 14 1008003001 工商顧問服務業 永悅健康股份有限公司 130000000117109 1. 探索與蒐集多源資料,進行資料清洗、特徵工程與資料分析\n2. 構建與調校機器學習/統計... 1. 探索與蒐集多源[[[資料]]],進行[[[資料]]]清洗、特徵工程與[[[資料]]]分... 0.34 北新路三段213號15樓 ... [c@wf30, c@wf2, c@wf17, c@wf9, c@wf25, c@wf7, ... [{'language': 1, 'ability': {'listening': 8, '... [] 200 [{'code': '12001003092', 'description': 'MLOPs... None {'lastProcessedResumeAtTime': 1758266272, 'las... None None None
19 20250908 14 1002003002 紡織成衣業 台南企業股份有限公司 68919702000 1. 設計、開發、部署及優化機器學習模型,以解決製造廠域實際問題。\n2. 使用Python... 1. 設計、開發、部署及優化機器學習模型,以解決製造廠域實際問題。\n2. 使用Python... 0.00 中山路三段320號 ... [c@wf26, c@wf9, c@wf10, c@wf3, c@wf2, c@wf7, c... [{'language': 1, 'ability': {'listening': 4, '... [] 12000 [{'code': '12001003045', 'description': 'Pytho... None {'lastProcessedResumeAtTime': 1758274411, 'las... None None None
20 20250912 6 1001006001 IC設計相關業 神雋股份有限公司 130000000214799 1.根據問題定義資料集蒐集條件與規則\n2.從公開資源取得與過濾資料\n3.根據規則與定義,... 1.根據問題定義[[[資料]]]集蒐集條件與規則\n2.從公開資源取得與過濾[[[資料]]]... 0.18 三重路66號12樓之2 ... [c@wf1, c@wf29, 45plus@45invited, c@wf10, c@wf... [{'language': 1, 'ability': {'listening': 8, '... [] 40 [{'code': '12001001007', 'description': 'Linux... None {'lastProcessedResumeAtTime': 1758250245, 'las... None None None
21 20250916 10 1001004001 光電產業 陽光伏特家_綠點能創股份有限公司 130000000141128 應速度。\n2. 建立與維護分析架構:開發並維護多用戶、多場域的模擬與分析邏輯,支援精準決策... 應速度。\n2. 建立與維護分析架構:開發並維護多用戶、多場域的模擬與分析邏輯,支援精準決策... 0.00 重陽路267號10樓(南港車站步行8分鐘) ... [c@wf4, c@wf29, c@wf13, c@wf1, c@wf9, c@wf31, ... [] [] 70 [{'code': '12001003045', 'description': 'Pytho... None {'lastProcessedResumeAtTime': 1758194832, 'las... None None None

22 rows × 45 columns

Step04. Get next page: get the 2nd, 1st, 3rd, …, page urls#

接下來要從Chrome Development Tools來觀察,下二頁、三頁、四頁的網址為何(例如以下網址)。然後要去觀察這些網址的變化,應該不難觀察在page=1, page=2, page=3的數字上有所變化。通常這種網址的變化都是有規律性的。

https://www.104.com.tw/jobs/search/api/jobs?jobsource=index_s&keyword=%E8%B3%87%E6%96%99%E7%A7%91%E5%AD%B8&mode=s&order=15&page=2&pagesize=20


https://www.104.com.tw/jobs/search/api/jobs?jobsource=index_s&keyword=%E8%B3%87%E6%96%99%E7%A7%91%E5%AD%B8&mode=s&order=15&page=3&pagesize=20


https://www.104.com.tw/jobs/search/api/jobs?jobsource=index_s&keyword=%E8%B3%87%E6%96%99%E7%A7%91%E5%AD%B8&mode=s&order=15&page=40&pagesize=20

因為知道有這樣的規律性,所以就拆解要發出的網址,把網址的頁碼的獨立出來,然後用for-loop來走過每個頁面。

for page in range(1, 6):
    url = 'https://www.104.com.tw/jobs/search/api/jobs?jobsource=index_s&keyword=%E8%B3%87%E6%96%99%E7%A7%91%E5%AD%B8&mode=s&order=15&page=' + str(page) + '&pagesize=20'
    # url = 'https://www.104.com.tw/jobs/search/list?ro=0&kwop=7&keyword=data%20scientist&expansionType=area%2Cspec%2Ccom%2Cjob%2Cwf%2Cwktm&order=14&asc=0&page=' + str(page) + '&mode=s&jobsource=2018indexpoc'
    raw = requests.get(url, headers=headers).json()
    print(len(raw['data']))
22
22
22
22
22

除了列印出來以外,用all_data這個變項儲存資料,並在for-loop中把每一頁的資料用extend()附加到all_data中。

以下程式碼要注意的是,因為頁面沒有第0頁,但range()預設是從0開始,所以此時要特別寫定range()要從1開始。

all_data = []
for page in range(1, 3):
    url = 'https://www.104.com.tw/jobs/search/api/jobs?jobsource=index_s&keyword=%E8%B3%87%E6%96%99%E7%A7%91%E5%AD%B8&mode=s&order=15&page=' + str(page) + '&pagesize=20'
    raw = requests.get(url, headers=headers).json()
    all_data.extend(raw['data'])
    print(len(all_data))
22
44

最後我們把整筆資料轉為pandas比較好觀察。

df = pd.DataFrame(all_data)
print(df.shape)
print(len(set(df.jobNo)))
(44, 45)
44

Step05. Detect ending condition#

前面的步驟中我們知道要如何一步一步抓取每一頁的資料,最後還有一個問題就是,抓到什麼時候才要停?通常程式設計師也得留一個線索,才知道要如何在網頁上自動化呈現最後一頁(如同你看網頁時所看到的最後一頁的頁碼)。所以我們得去揣測程式設計師的邏輯,看他是怎麼設計最後一頁的停止機制的。

通常最主要有兩種:

  1. 直接顯示最後一頁是多少:那就寫一個爬蟲,直接去偵測這個最後一頁是多少,然後把他當成ending condition。如104.com的例子是有總資料筆數的,除以頁數就可以知道總頁數。

  2. 不直接顯示最後一頁是多少(e.g. PCHOME),就設一個夠大的迴圈,讓爬蟲抓抓抓抓到當掉,或者抓到資料沒再新增了,我們就偵測如果抓到的資料是零筆,就讓他跳出迴圈。

print(raw.keys())
print(type(raw['data']))
print(raw['metadata'].keys())
print(raw['metadata']['pagination'])
print(raw['metadata']['pagination']['lastPage'])

# print(raw['data']['pageNo'])
# print("Total Page:", raw['data']['totalPage'])
# print(raw['data']['count'])
# print(raw['data']['totalCount'])
dict_keys(['data', 'metadata'])
<class 'list'>
dict_keys(['pagination', 'isPreciseHotJob', 'filterQuery', 'personalBoost'])
{'count': 22, 'currentPage': 2, 'lastPage': 102, 'total': 2031}
102

Trick. pprint (pretty-print)#

https://docs.python.org/3/library/pprint.html. … The pprint module provides a capability to “pretty-print” arbitrary Python data structures in a form which can be used as input to the interpreter …

Example

class pprint.PrettyPrinter(indent=1, width=80, depth=None, stream=None, *, compact=False, sort_dicts=True, underscore_numbers=False)¶
import pprint
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(raw['data'][:2])
[   {   'acceptRole': [2, 64],
        'appearDate': '20250915',
        'applyCnt': 15,
        'applyDate': None,
        'coIndustry': 1001001002,
        'coIndustryDesc': '電腦軟體服務業',
        'custName': '新加坡商鈦坦科技股份有限公司台灣分公司',
        'custNo': '130000000030920',
        'd3': '',
        'descSnippet': '這是一個充滿奇想與刺激的工作,你我將會併肩前行,分享彼此所擁有的專業及知識,共同成長,在樂趣中尋求創意、在創意中尋求夢想。\n'
                       '\n'
                       'Technical Support '
                       'Engineer的工作是排除第一線技術問題以維護產品的正常運作,並且擔任公司與客戶之間以及公司內部跨部門之間的橋樑。如果你嚮往這樣的工作文化與環境,歡迎來與我們一同學習成長。\n'
                       '\n'
                       '【工作內容】\n'
                       '1. 負責第一線即時技術支援服務及問題排除\n'
                       '2. 處理客戶回報之緊急狀況\n'
                       '3. 使用 Grafana、ELK 等相關工具進行系統監控與事件記錄\n'
                       '4. 撰寫技術文件及各類工作報告\n'
                       '5. 使用 Jira 追蹤問題、任務及專案進度\n'
                       '6. 協助執行系統維護及測試與驗證工作\n'
                       '7. 參與跨國團隊協作與溝通\n'
                       '8. 配合團隊輪班及 On Call 機制\n'
                       '9. 主管交辦任務',
        'description': '這是一個充滿奇想與刺激的工作,你我將會併肩前行,分享彼此所擁有的專業及知識,共同成長,在樂趣中尋求創意、在創意中尋求夢想。\n'
                       '\n'
                       'Technical Support '
                       'Engineer的工作是排除第一線技術問題以維護產品的正常運作,並且擔任公司與客戶之間以及公司內部跨部門之間的橋樑。如果你嚮往這樣的工作文化與環境,歡迎來與我們一同學習成長。\n'
                       '\n'
                       '【工作內容】\n'
                       '1. 負責第一線即時技術支援服務及問題排除\n'
                       '2. 處理客戶回報之緊急狀況\n'
                       '3. 使用 Grafana、ELK 等相關工具進行系統監控與事件記錄\n'
                       '4. 撰寫技術文件及各類工作報告\n'
                       '5. 使用 Jira 追蹤問題、任務及專案進度\n'
                       '6. 協助執行系統維護及測試與驗證工作\n'
                       '7. 參與跨國團隊協作與溝通\n'
                       '8. 配合團隊輪班及 On Call 機制\n'
                       '9. 主管交辦任務',
        'employeeCount': 300,
        'hrBehaviorPR': 0.9573003226624102,
        'interactionRecord': {   'lastCustReplyTimestamp': 1758170175,
                                 'lastProcessedResumeAtTime': 1758435265,
                                 'nowTimestamp': 1758463352},
        'isApplied': None,
        'isSave': None,
        'jobAddrNo': 6001001011,
        'jobAddrNoDesc': '台北市南港區',
        'jobAddress': '區園區街3之1號11樓之1(南港軟體園區G棟)',
        'jobCat': [2010002017, 2007001010, 2007001009],
        'jobName': 'Technical Support Engineer 技術支援工程師(台北)',
        'jobNameSnippet': 'Technical Support Engineer 技術支援工程師(台北)',
        'jobNo': '11915494',
        'jobRo': 1,
        'jobType': 1,
        'labels': [   'c@wf9',
                      'c@wf28',
                      'foreigners@chineseDiasporas',
                      'c@wf35',
                      'college@student_invited',
                      'c@wf12',
                      'c@wf29',
                      'c@wf2',
                      'c@wf30',
                      'c@wf10',
                      'c@wf14',
                      'c@wf31',
                      'c@wf7',
                      'c@wf13',
                      'c@wf26'],
        'languageRequirements': [   {   'ability': {   'listening': 8,
                                                       'reading': 8,
                                                       'speaking': 8,
                                                       'writing': 8},
                                        'language': 1}],
        'lat': 25.0574363,
        'link': {   'applyAnalyze': 'https://www.104.com.tw/jobs/apply/analysis/73e1y?channel=104rpt',
                    'cust': 'https://www.104.com.tw/company/1a2x6bin60',
                    'job': 'https://www.104.com.tw/job/73e1y'},
        'lon': 121.6123229,
        'major': [],
        'mrt': '99001005023',
        'mrtDesc': '捷運南港展覽館站',
        'mrtDist': 0.4,
        'optionEdu': [1, 2, 3, 4, 5, 6],
        'pcSkills': [],
        'period': 0,
        'remoteWorkType': 0,
        's10': 50,
        's5': 256,
        's9': [1],
        'salaryHigh': 60000,
        'salaryLow': 45000,
        'tags': {   'landmark': {'desc': '距捷運南港展覽館站約400公尺'},
                    'wf10': {'desc': '', 'param': 'wf10'},
                    'wf12': {'desc': '', 'param': 'wf12'},
                    'wf13': {'desc': '', 'param': 'wf13'},
                    'wf14': {'desc': '', 'param': 'wf14'},
                    'wf2': {'desc': '', 'param': 'wf2'},
                    'wf26': {'desc': '', 'param': 'wf26'},
                    'wf28': {'desc': '', 'param': 'wf28'},
                    'wf29': {'desc': '', 'param': 'wf29'},
                    'wf30': {'desc': '', 'param': 'wf30'},
                    'wf31': {'desc': '', 'param': 'wf31'},
                    'wf35': {'desc': '', 'param': 'wf35'},
                    'wf7': {'desc': '', 'param': 'wf7'},
                    'wf9': {'desc': '', 'param': 'wf9'},
                    'zoneForeign': {'desc': '外商公司', 'param': 5}},
        'userApplyCount': None},
    {   'acceptRole': [2, 32],
        'appearDate': '20250915',
        'applyCnt': 5,
        'applyDate': None,
        'coIndustry': 1001001002,
        'coIndustryDesc': '電腦軟體服務業',
        'custName': '新加坡商鈦坦科技股份有限公司台灣分公司',
        'custNo': '130000000030920',
        'd3': '',
        'descSnippet': '本DevOps團隊編制於IT運維部門,負責CI/CD相關平台層日常維護與故障排除。其次協助同部門的infra團隊持續研究與改進Kubernetes相關運維技術與工具,並為產品開發部門處理運維相關問題與故障排除,以及推行IT規範政策。\n'
                       '\n'
                       '1. 使用 Go 開發高效能、可擴充和可靠的後端系統。\n'
                       '2. 負責設計與開發 IT 維運相關工具與平台,提升 Infra 團隊的工作效率與自動化能力。\n'
                       '3. 具備跨部門溝通協調能力,推動並落實 IT 規範與政策,確保系統運行的穩定性與合規性。\n'
                       '4. 支援產品開發部門處理運維相關問題,進行故障排查與根因分析。\n'
                       '5. 協助 Infra 團隊持續研究、改進運維技術與工具,推動最佳實踐落地。\n'
                       '\n'
                       '【職位需求】\n'
                       '• 具備 3 年以上 Go, Bash scripting, SQL '
                       '等後端技術開發經驗具備容器化技術使用經驗。\n'
                       '• 具備 CI/CD 相關平台經驗 (e.g., GitLab Runner)。\n'
                       '• 具備 Kubernetes 平台、容器技術使用/除錯經驗。\n'
                       '• 具備獨立規劃專案與執行能力,能良好的進行跨團隊溝通及協調。\n'
                       '• 對於新技術、知識或工具,有自我學習的能力。\n'
                       '\n'
                       '【所需技能】\n'
                       '• Containerization: Docker, Kubernetes, Container\n'
                       '• CI/CD: GitLab CI/CD, Jenkins\n'
                       '• Programming: Go, Bash scripting, SQL\n'
                       '• Version Control: Git',
        'description': '本DevOps團隊編制於IT運維部門,負責CI/CD相關平台層日常維護與故障排除。其次協助同部門的infra團隊持續研究與改進Kubernetes相關運維技術與工具,並為產品開發部門處理運維相關問題與故障排除,以及推行IT規範政策。\n'
                       '\n'
                       '1. 使用 Go 開發高效能、可擴充和可靠的後端系統。\n'
                       '2. 負責設計與開發 IT 維運相關工具與平台,提升 Infra 團隊的工作效率與自動化能力。\n'
                       '3. 具備跨部門溝通協調能力,推動並落實 IT 規範與政策,確保系統運行的穩定性與合規性。\n'
                       '4. 支援產品開發部門處理運維相關問題,進行故障排查與根因分析。\n'
                       '5. 協助 Infra 團隊持續研究、改進運維技術與工具,推動最佳實踐落地。\n'
                       '\n'
                       '【職位需求】\n'
                       '• 具備 3 年以上 Go, Bash scripting, SQL '
                       '等後端技術開發經驗具備容器化技術使用經驗。\n'
                       '• 具備 CI/CD 相關平台經驗 (e.g., GitLab Runner)。\n'
                       '• 具備 Kubernetes 平台、容器技術使用/除錯經驗。\n'
                       '• 具備獨立規劃專案與執行能力,能良好的進行跨團隊溝通及協調。\n'
                       '• 對於新技術、知識或工具,有自我學習的能力。\n'
                       '\n'
                       '【所需技能】\n'
                       '• Containerization: Docker, Kubernetes, Container\n'
                       '• CI/CD: GitLab CI/CD, Jenkins\n'
                       '• Programming: Go, Bash scripting, SQL\n'
                       '• Version Control: Git',
        'employeeCount': 300,
        'hrBehaviorPR': 0.7954484733478109,
        'interactionRecord': {   'lastCustReplyTimestamp': None,
                                 'lastProcessedResumeAtTime': 1758449111,
                                 'nowTimestamp': 1758463352},
        'isApplied': None,
        'isSave': None,
        'jobAddrNo': 6001001011,
        'jobAddrNoDesc': '台北市南港區',
        'jobAddress': '園區街3之1號11樓之1 (南港軟體園區G棟)',
        'jobCat': [2007002006],
        'jobName': 'DevOps Engineer(台北)',
        'jobNameSnippet': 'DevOps Engineer(台北)',
        'jobNo': '9393474',
        'jobRo': 1,
        'jobType': 1,
        'labels': [   'c@wf29',
                      'c@wf14',
                      'c@wf35',
                      'c@wf28',
                      'c@wf12',
                      'c@wf9',
                      'c@wf10',
                      'c@wf30',
                      'c@wf13',
                      'c@wf26',
                      'c@wf2',
                      'c@wf7',
                      'foreigners@foreigners_tick',
                      'c@wf31'],
        'languageRequirements': [   {   'ability': {   'listening': 8,
                                                       'reading': 8,
                                                       'speaking': 8,
                                                       'writing': 8},
                                        'language': 1}],
        'lat': 25.0581204,
        'link': {   'applyAnalyze': 'https://www.104.com.tw/jobs/apply/analysis/5lc1u?channel=104rpt',
                    'cust': 'https://www.104.com.tw/company/1a2x6bin60',
                    'job': 'https://www.104.com.tw/job/5lc1u'},
        'lon': 121.6118603,
        'major': [],
        'mrt': '99001001023',
        'mrtDesc': '捷運南港軟體園區站',
        'mrtDist': 0.46,
        'optionEdu': [1, 2, 3, 4, 5, 6],
        'pcSkills': [   {'code': '12001003080', 'description': 'Go'},
                        {'code': '12001006017', 'description': 'JavaScript'},
                        {'code': '12001004031', 'description': 'MS SQL'}],
        'period': 3,
        'remoteWorkType': 0,
        's10': 50,
        's5': 0,
        's9': [1],
        'salaryHigh': 100000,
        'salaryLow': 65000,
        'tags': {   'landmark': {'desc': '距捷運南港軟體園區站約460公尺'},
                    'wf10': {'desc': '', 'param': 'wf10'},
                    'wf12': {'desc': '', 'param': 'wf12'},
                    'wf13': {'desc': '', 'param': 'wf13'},
                    'wf14': {'desc': '', 'param': 'wf14'},
                    'wf2': {'desc': '', 'param': 'wf2'},
                    'wf26': {'desc': '', 'param': 'wf26'},
                    'wf28': {'desc': '', 'param': 'wf28'},
                    'wf29': {'desc': '', 'param': 'wf29'},
                    'wf30': {'desc': '', 'param': 'wf30'},
                    'wf31': {'desc': '', 'param': 'wf31'},
                    'wf35': {'desc': '', 'param': 'wf35'},
                    'wf7': {'desc': '', 'param': 'wf7'},
                    'wf9': {'desc': '', 'param': 'wf9'},
                    'zoneForeign': {'desc': '外商公司', 'param': 5}},
        'userApplyCount': None}]
totalPage = raw['metadata']['pagination']['lastPage']


all_data = []

# Uncomment the next line code to scrape from 1 to totalage
totalPage = 2
for page in range(1, totalPage+1):
    url = 'https://www.104.com.tw/jobs/search/api/jobs?jobsource=index_s&keyword=%E8%B3%87%E6%96%99%E7%A7%91%E5%AD%B8&mode=s&order=15&page=' + str(page) + '&pagesize=20'
    raw = requests.get(url, headers=headers).json()
    all_data.extend(raw['data'])
    print(len(all_data))
22
44

6. convert to dataframe#

df = pd.DataFrame(all_data)
print(df.shape)
df
(44, 45)
appearDate applyCnt coIndustry coIndustryDesc custName custNo description descSnippet mrtDist jobAddress ... labels languageRequirements acceptRole employeeCount pcSkills isSave interactionRecord isApplied applyDate userApplyCount
0 20250919 7 1005001007 大專校院教育事業 國立政治大學_創新國際學院 130000000114372 創新國際學院於109年開啟大學部招生作業,致力於培養能綜觀分析並有專業技能的國際公共事務人才... 創新國際學院於109年開啟大學部招生作業,致力於培養能綜觀分析並有專業技能的國際公共事務人才... 0.00 指南路二段64號 ... [foreigners@full_fc_em_jbs, c@wf1, c@wf29, for... [{'language': 1, 'ability': {'listening': 8, '... [2, 32768, 65536] 16 [{'code': '12001008016', 'description': 'Word'... None {'lastProcessedResumeAtTime': 1758365933, 'las... None None None
1 20250915 11 1001001002 電腦軟體服務業 新加坡商鈦坦科技股份有限公司台灣分公司 130000000030920 1. Maintain high levels of service continuity ... 1. Maintain high levels of service continuity ... 0.44 園區街3之1號11樓之1(南港軟體園區二期) ... [c@wf31, c@wf28, c@wf13, c@wf10, c@wf2, c@wf14... [{'language': 1, 'ability': {'listening': 8, '... [] 300 [{'code': '12001007015', 'description': 'Cisco... None {'lastProcessedResumeAtTime': 1758178566, 'las... None None None
2 20250918 5 1001001003 網際網路相關業 鈊象電子股份有限公司 23519738000 1.理解研發或商務單位提出之需求,使用數據或AI方法進行分析、提出並驗證解決方法,並展示工作... 1.理解研發或商務單位提出之需求,使用數據或AI方法進行分析、提出並驗證解決方法,並展示工作... 0.00 五工路130號 ... [c@wf1, c@wf4, c@wf3, c@wf30, c@wf28, c@wf26, ... [] [] 1100 [] None {'lastProcessedResumeAtTime': 1758267366, 'las... None None None
3 20250919 4 1001005003 其他電子零組件相關業 艾新科環保材料有限公司 130000000087975 1. 教育及工經驗\n(1) 碩士以上:相關工作經驗一年以上。\n(2) 學士:相關工作經驗... 1. 教育及工經驗\n(1) 碩士以上:相關工作經驗一年以上。\n(2) 學士:相關工作經驗... 0.13 基隆路一段163號17樓之3 ... [c@wf3, senior@senior_job_H, foreigners@full_f... [] [32, 64, 2048, 32768] 0 [{'code': '12001003045', 'description': 'Pytho... None {'lastProcessedResumeAtTime': 1758437778, 'las... None None None
4 20250115 8 1004001001 銀行業 台北富邦商業銀行股份有限公司 3750168000 習模型、數據特徵庫、產品推薦系統、大型語言模型(LLM)、自主數據分析平台等專案小組(視職能... 習模型、數據特徵庫、產品推薦系統、大型語言模型(LLM)、自主數據分析平台等專案小組(視職能... 0.00 ... [c@wf30, c@wf3, c@wf7, c@wf9, c@wf25, c@wf28, ... [{'language': 1, 'ability': {'listening': 2, '... [] 9457 [] None {'lastProcessedResumeAtTime': 1758093168, 'las... None None None
5 20250910 6 1001001002 電腦軟體服務業 詠鋐智能股份有限公司 130000000186926 作為 產品導向的資料科學家,您將參與 Tukey AutoML 的核心模型模組設計與研發,負... 作為 產品導向的[[[資料科學]]]家,您將參與 Tukey AutoML 的核心模型模組設... 0.04 羅斯福路二段100號25樓 ... [c@wf31, c@wf2, c@wf8, c@wf12, c@wf7, c@wf1] [] [] 20 [{'code': '12001003045', 'description': 'Pytho... None {'lastProcessedResumeAtTime': 1758367010, 'las... None None None
6 20250909 8 1001001002 電腦軟體服務業 維曙智能科技有限公司 130000000229061 會是您大展身手的地方。歡迎加入我們。\n\n作為資料科學家,需要對新技術保有高度熱誠,能夠歸... 會是您大展身手的地方。歡迎加入我們。\n\n作為[[[資料科學]]]家,需要對新技術保有高度... 0.18 忠孝東路二段116號5樓 ... [c@wf7, c@wf26, c@wf8, c@wf12, c@wf9] [] [2, 4, 8, 1024] 0 [{'code': '12001003045', 'description': 'Pytho... None {'lastProcessedResumeAtTime': 1757893487, 'las... None None None
7 20250915 5 1004001007 金融控股業 國泰金控_國泰金融控股股份有限公司 70827406000 隸屬於國泰金控下的資料科學實驗室 Cathay Data Lab Team,實驗室的使命是研... 隸屬於國泰金控下的[[[資料科學]]]實驗室 Cathay Data Lab Team,實驗... 0.00 ... [c@wf13, c@wf10, c@wf35, c@wf1, c@wf28, c@wf4,... [] [] 800 [{'code': '12001005022', 'description': 'hadoo... None {'lastProcessedResumeAtTime': 1758173964, 'las... None None None
8 20250915 8 1003002014 量販流通相關業 全聯福利中心_全聯實業股份有限公司 16740494000 創造真正的影響,歡迎加入我們!\n\n我們需要這樣的人:\n1. 熱愛數據技術 - 對數據工... 創造真正的影響,歡迎加入我們!\n\n我們需要這樣的人:\n1. 熱愛數據技術 - 對數據工... 0.49 敬業四路33號 ... [c@wf10, foreigners@pt_fc_em_jbs, c@wf28, c@wf... [{'language': 1, 'ability': {'listening': 8, '... [] 23000 [] None {'lastProcessedResumeAtTime': 1758158768, 'las... None None None
9 20250918 7 1001001002 電腦軟體服務業 展市華科技有限公司 130000000155726 LLM\n c. 生理訊號 \n d. 語音\n4. 將感測器訊號處理... LLM\n c. 生理訊號 \n d. 語音\n4. 將感測器訊號處理... 0.00 ... [c@wf4, c@wf1, c@wf7, c@wf2] [] [2, 4] 0 [{'code': '12001003010', 'description': 'C++'}... None {'lastProcessedResumeAtTime': 1758448504, 'las... None None None
10 20250916 11 1001001002 電腦軟體服務業 群越廣告科技有限公司 130000000253969 我們正在尋找一位具備深厚數據分析能力與機器學習經驗的資料科學家,加入我們的產品研發團隊。你將... 我們正在尋找一位具備深厚數據分析能力與機器學習經驗的[[[資料科學]]]家,加入我們的產品研... 0.10 南京東路3段287號10樓 ... [c@wf1, c@wf4, c@wf7, c@wf3, c@wf9, c@wf8, c@w... [{'language': 1, 'ability': {'listening': 2, '... [] 11 [{'code': '12001003045', 'description': 'Pytho... None {'lastProcessedResumeAtTime': 1758178671, 'las... None None None
11 20250828 5 1001001003 網際網路相關業 55688集團_台灣智慧生活網股份有限公司 130000000053672 1. 設計、開發、部署及優化機器學習模型,解決實際業務問題。\n2. 使用Python、SQ... 1. 設計、開發、部署及優化機器學習模型,解決實際業務問題。\n2. 使用Python、SQ... 0.32 重新路五段609巷2號7樓之1 ... [senior@senior_job_G, c@wf2, c@wf9, c@wf4, c@w... [{'language': 1, 'ability': {'listening': 4, '... [8, 64, 2048, 32768] 165 [{'code': '12001003045', 'description': 'Pytho... None {'lastProcessedResumeAtTime': 1758178428, 'las... None None None
12 20250915 7 1002015001 精密儀器相關製造業 鴻海集團_英屬開曼群島商鴻騰精密科技股份有限公司台灣分公司 130000000109701 DaVinci應用程序。 \n\n所需條件:\n(學歷)\n 擁有計算機科學、數學、物理學、... DaVinci應用程序。 \n\n所需條件:\n(學歷)\n 擁有計算機[[[科學]]]、數... 0.50 中山路66號 ... [c@wf35, c@wf34, c@wf9, c@wf2, c@wf19, c@wf10,... [{'language': 1, 'ability': {'listening': 2, '... [] 1000 [{'code': '12001003045', 'description': 'Pytho... None {'lastProcessedResumeAtTime': 1758153424, 'las... None None None
13 20250909 6 1001001002 電腦軟體服務業 維曙智能科技有限公司 130000000229061 會是您大展身手的地方。歡迎加入我們。 \n\n我們正在尋找一位對 AI 藥物研發(AI in... 會是您大展身手的地方。歡迎加入我們。 \n\n我們正在尋找一位對 AI 藥物研發(AI in... 0.18 忠孝東路二段116號5樓 ... [c@wf8, c@wf7, c@wf9, c@wf26, c@wf12] [] [] 0 [{'code': '12001002018', 'description': 'Git'}... None {'lastProcessedResumeAtTime': 1758346362, 'las... None None None
14 20250916 5 1012001001 醫院 中國醫藥大學附設醫院 52600770000 領域研究計畫,支援生醫研究人員進行臨床資料、基因體資料與實驗資料之整合分析。\n6.\t資料... 領域研究計畫,支援生醫研究人員進行臨床[[[資料]]]、基因體[[[資料]]]與實驗[[[資... 0.00 育德路2號 ... [c@wf2, c@wf29, foreigners@full_fc_em_jbs, c@w... [{'language': 1, 'ability': {'listening': 2, '... [2, 64] 4000 [] None {'lastProcessedResumeAtTime': 1757934583, 'las... None None None
15 20250910 7 1001001002 電腦軟體服務業 詠鋐智能股份有限公司 130000000186926 作為 交付導向的資料科學家,您將在 Tukey AutoML 專案導入中扮演技術主導角色,從... 作為 交付導向的[[[資料科學]]]家,您將在 Tukey AutoML 專案導入中扮演技術... 0.06 羅斯福路二段100號25樓 ... [c@wf2, c@wf8, c@wf31, c@wf7, c@wf1, c@wf12] [{'language': 1, 'ability': {'listening': 8, '... [] 20 [{'code': '12001002016', 'description': 'Githu... None {'lastProcessedResumeAtTime': None, 'lastCustR... None None None
16 20250908 2 1005001007 大專校院教育事業 慈濟學校財團法人慈濟大學 8152423000 醫務管理、資訊等相關背景。\n2. 若具有基礎統計應用軟體(SAS 或 STATA 或 R ... 醫務管理、資訊等相關背景。\n2. 若具有基礎統計應用軟體(SAS 或 STATA 或 R ... 0.22 忠孝東路六段488號 ... [foreigners@pt_fc_em_jbs, c@wf7, foreigners@fu... [] [] 0 [{'code': '12003005009', 'description': 'SAS'}... None {'lastProcessedResumeAtTime': 1758182687, 'las... None None None
17 20250915 2 1001001002 電腦軟體服務業 緯謙科技股份有限公司 130000000175101 透過數據蒐集、資料分析與可視化架構,解決商業痛點推動業務增長並提升運營效率,與各部門緊密協作... 透過數據蒐集、[[[資料]]]分析與可視化架構,解決商業痛點推動業務增長並提升運營效率,與各... 0.00 新台五路一段88號 ... [c@wf10, c@wf9, c@wf1, c@wf11, c@wf3, c@wf7, c... [{'language': 1, 'ability': {'listening': 8, '... [] 0 [{'code': '12001011012', 'description': 'Power... None {'lastProcessedResumeAtTime': 1757893434, 'las... None None None
18 20250918 14 1008003001 工商顧問服務業 永悅健康股份有限公司 130000000117109 1. 探索與蒐集多源資料,進行資料清洗、特徵工程與資料分析\n2. 構建與調校機器學習/統計... 1. 探索與蒐集多源[[[資料]]],進行[[[資料]]]清洗、特徵工程與[[[資料]]]分... 0.34 北新路三段213號15樓 ... [c@wf30, c@wf2, c@wf17, c@wf9, c@wf25, c@wf7, ... [{'language': 1, 'ability': {'listening': 8, '... [] 200 [{'code': '12001003092', 'description': 'MLOPs... None {'lastProcessedResumeAtTime': 1758266272, 'las... None None None
19 20250908 14 1002003002 紡織成衣業 台南企業股份有限公司 68919702000 1. 設計、開發、部署及優化機器學習模型,以解決製造廠域實際問題。\n2. 使用Python... 1. 設計、開發、部署及優化機器學習模型,以解決製造廠域實際問題。\n2. 使用Python... 0.00 中山路三段320號 ... [c@wf26, c@wf9, c@wf10, c@wf3, c@wf2, c@wf7, c... [{'language': 1, 'ability': {'listening': 4, '... [] 12000 [{'code': '12001003045', 'description': 'Pytho... None {'lastProcessedResumeAtTime': 1758274411, 'las... None None None
20 20250912 6 1001006001 IC設計相關業 神雋股份有限公司 130000000214799 1.根據問題定義資料集蒐集條件與規則\n2.從公開資源取得與過濾資料\n3.根據規則與定義,... 1.根據問題定義[[[資料]]]集蒐集條件與規則\n2.從公開資源取得與過濾[[[資料]]]... 0.18 三重路66號12樓之2 ... [c@wf1, c@wf29, 45plus@45invited, c@wf10, c@wf... [{'language': 1, 'ability': {'listening': 8, '... [] 40 [{'code': '12001001007', 'description': 'Linux... None {'lastProcessedResumeAtTime': 1758250245, 'las... None None None
21 20250916 10 1001004001 光電產業 陽光伏特家_綠點能創股份有限公司 130000000141128 應速度。\n2. 建立與維護分析架構:開發並維護多用戶、多場域的模擬與分析邏輯,支援精準決策... 應速度。\n2. 建立與維護分析架構:開發並維護多用戶、多場域的模擬與分析邏輯,支援精準決策... 0.00 重陽路267號10樓(南港車站步行8分鐘) ... [c@wf4, c@wf29, c@wf13, c@wf1, c@wf9, c@wf31, ... [] [] 70 [{'code': '12001003045', 'description': 'Pytho... None {'lastProcessedResumeAtTime': 1758194832, 'las... None None None
22 20250915 15 1001001002 電腦軟體服務業 新加坡商鈦坦科技股份有限公司台灣分公司 130000000030920 這是一個充滿奇想與刺激的工作,你我將會併肩前行,分享彼此所擁有的專業及知識,共同成長,在樂趣... 這是一個充滿奇想與刺激的工作,你我將會併肩前行,分享彼此所擁有的專業及知識,共同成長,在樂趣... 0.40 區園區街3之1號11樓之1(南港軟體園區G棟) ... [c@wf9, c@wf28, foreigners@chineseDiasporas, c... [{'language': 1, 'ability': {'listening': 8, '... [2, 64] 300 [] None {'lastProcessedResumeAtTime': 1758435265, 'las... None None None
23 20250915 5 1001001002 電腦軟體服務業 新加坡商鈦坦科技股份有限公司台灣分公司 130000000030920 本DevOps團隊編制於IT運維部門,負責CI/CD相關平台層日常維護與故障排除。其次協助同... 本DevOps團隊編制於IT運維部門,負責CI/CD相關平台層日常維護與故障排除。其次協助同... 0.46 園區街3之1號11樓之1 (南港軟體園區G棟) ... [c@wf29, c@wf14, c@wf35, c@wf28, c@wf12, c@wf9... [{'language': 1, 'ability': {'listening': 8, '... [2, 32] 300 [{'code': '12001003080', 'description': 'Go'},... None {'lastProcessedResumeAtTime': 1758449111, 'las... None None None
24 20250917 9 1005001007 大專校院教育事業 國立臺北科技大學 92021164025 城市科學實驗室由城市規劃專家、數據科學家、AI工程師與開發者組成,致力於將數據與科技轉化為城... 城市[[[科學]]]實驗室由城市規劃專家、數據[[[科學]]]家、AI工程師與開發者組成,致... 0.21 忠孝東路三段46號1樓 ... [foreigners@full_fc_em_jbs, foreigners@pt_fc_e... [{'language': 1, 'ability': {'listening': 8, '... [2] 0 [{'code': '12001003097', 'description': 'LLM'}... None {'lastProcessedResumeAtTime': 1758099086, 'las... None None None
25 20250915 6 1001001002 電腦軟體服務業 QNAP_威聯通科技股份有限公司 80682695000 [工作內容]\n1. 透過 NLP 相關技術優化 Chatbot,以提升客戶體驗。\n2. ... [工作內容]\n1. 透過 NLP 相關技術優化 Chatbot,以提升客戶體驗。\n2. ... 0.00 中興路22號 ... [c@wf30, c@wf15, c@wf14, c@wf26, c@wf2, c@wf29... [{'language': 1, 'ability': {'listening': 8, '... [] 1300 [{'code': '12001001007', 'description': 'Linux... None {'lastProcessedResumeAtTime': 1757985780, 'las... None None None
26 20250918 0 1012001004 其他醫療保健服務業 邑方醫療器材企業社 130000000222904 軟實力。 \n\n- 使用資料科學技術剖析數據,協助產品成效優化及發展方向\n- 負責資料收... 軟實力。 \n\n- 使用[[[資料科學]]]技術剖析數據,協助產品成效優化及發展方向\n-... 0.00 六順路109號 ... [c@wf11, c@wf35, c@wf15, c@wf25, c@wf7, c@wf30... [] [] 0 [] None {'lastProcessedResumeAtTime': None, 'lastCustR... None None None
27 20250918 3 1003001015 綜合商品批發代理業 華翰物產實業股份有限公司 80378420000 我們正在尋找數名資料科學家,此職位將\n1. 與領域專家結合資料面將商業問題轉化為可分析的條... 我們正在尋找數名[[[資料科學]]]家,此職位將\n1. 與領域專家結合[[[資料]]]面將... 0.30 樂群三路126號14樓 ... [c@wf26, c@wf10, c@wf31, foreigners@foreigners... [{'language': 1, 'ability': {'listening': 2, '... [32, 64] 150 [{'code': '12001002018', 'description': 'Git'}... None {'lastProcessedResumeAtTime': 1758095659, 'las... None None None
28 20250919 6 1003001015 綜合商品批發代理業 華翰物產實業股份有限公司 80378420000 我們正在尋找數名資料科學家,此職位將\n1. 與領域專家結合資料面將商業問題轉化為可分析的條... 我們正在尋找數名[[[資料科學]]]家,此職位將\n1. 與領域專家結合[[[資料]]]面將... 0.00 青年一路156號 ... [c@wf31, c@wf29, c@wf26, foreigners@foreigners... [{'language': 1, 'ability': {'listening': 2, '... [32, 64] 150 [{'code': '12001002018', 'description': 'Git'}... None {'lastProcessedResumeAtTime': 1758095647, 'las... None None None
29 20250917 4 1003001011 機械器具批發業 基士德環科股份有限公司 130000000173422 開發和維護智慧水務系統程式\n2. 水資源數據分析\n3. 建立智慧水務系統核心AI模型\... 開發和維護智慧水務系統程式\n2. 水資源數據分析\n3. 建立智慧水務系統核心AI模型\... 0.00 民利街19號 ... [c@wf10, c@wf19, c@wf1, c@wf2, c@wf7, c@wf4, f... [{'language': 1, 'ability': {'listening': 8, '... [64, 2048] 50 [{'code': '12001003034', 'description': 'Matla... None {'lastProcessedResumeAtTime': 1758420395, 'las... None None None
30 20250915 10 1006002002 電視業 緯來電視網股份有限公司 20913187000 1. 進行數據清洗、資料貼標以及特徵工程等資料前處理工作。 \n2. 選用資料科學或人工智慧... 1. 進行數據清洗、[[[資料]]]貼標以及特徵工程等[[[資料]]]前處理工作。 \n2.... 0.43 瑞光路480號3樓 ... [c@wf1, c@wf9, c@wf2, c@wf10, c@wf7, c@wf23] [] [] 300 [] None {'lastProcessedResumeAtTime': 1758002326, 'las... None None None
31 20250915 6 1001003001 電腦及其週邊設備製造業 仁寶電腦工業股份有限公司 21222725000 1. 協助專案用戶將業務需求轉化為可落地的 AI 解決方案。\n2. 提供準確可靠的數據預測... 1. 協助專案用戶將業務需求轉化為可落地的 AI 解決方案。\n2. 提供準確可靠的數據預測... 0.27 瑞光路581號(114) ... [foreigners@pt_fc_em_jbs, c@wf4, c@wf7, c@wf2,... [{'language': 1, 'ability': {'listening': 8, '... [] 9000 [] None {'lastProcessedResumeAtTime': 1758167427, 'las... None None None
32 20250918 1 1004003002 產物保險業 新安東京海上產物保險股份有限公司 16834703000 1. 資料科學與人工智慧相關新技術研究開發及概念性驗證\n2. 應用創意結合機器/深度學習模... 1. [[[資料科學]]]與人工智慧相關新技術研究開發及概念性驗證\n2. 應用創意結合機器... 0.45 南京東路三段103號5樓 ... [c@wf14, c@wf7, c@wf8] [{'language': 1, 'ability': {'listening': 4, '... [] 1500 [{'code': '12001001007', 'description': 'Linux... None {'lastProcessedResumeAtTime': 1757928485, 'las... None None None
33 20250917 5 1004001001 銀行業 國泰世華商業銀行股份有限公司 4231910004 \n4. 專案會議召集與議程規劃,並定期向上呈報專案進度\n5. 專案經驗傳承、專案文件管理... \n4. 專案會議召集與議程規劃,並定期向上呈報專案進度\n5. 專案經驗傳承、專案文件管理... 0.00 ... [foreigners@full_fc_em_jbs, c@wf2, c@wf3, fore... [{'language': 1, 'ability': {'listening': 8, '... [] 10000 [] None {'lastProcessedResumeAtTime': 1758260382, 'las... None None None
34 20250728 6 1001006001 IC設計相關業 華邦電子股份有限公司 22099218000 850堂資料科學、人工智慧、數據思維與程式技術等多元主題,支援彈性自主學習\n.建立跨部門的... 850堂[[[資料科學]]]、人工智慧、數據思維與程式技術等多元主題,支援彈性自主學習\n.... 0.00 ... [c@wf2, c@wf28, foreigners@full_fc_em_jbs, c@w... [{'language': 1, 'ability': {'listening': 2, '... [] 2800 [{'code': '12001008003', 'description': 'Excel... None {'lastProcessedResumeAtTime': None, 'lastCustR... None None None
35 20250919 5 1008003006 其他專業/科學及技術業 工研院 _財團法人工業技術研究院 2750963000 1. 資料分析軟體模組開發、系統整合與測試。 \n2. 針對資料科學應用主題瞭解領域知識,並... 1. [[[資料]]]分析軟體模組開發、系統整合與測試。 \n2. 針對[[[資料科學]]]... 0.00 工業二路31號 ... [c@wf30, c@wf33, c@wf35, foreigners@full_fc_em... [{'language': 1, 'ability': {'listening': 8, '... [2] 6000 [] None {'lastProcessedResumeAtTime': 1758157411, 'las... None None None
36 20250919 7 1001001001 電腦系統整合服務業 超越數位股份有限公司 130000000255793 工作內容\n1.負責資料收集、資料清理、模型建置、數據視覺化報表產出\t\t\t\t\t\n... 工作內容\n1.負責[[[資料]]]收集、[[[資料]]]清理、模型建置、數據視覺化報表產出... 0.00 自強南路8號11樓之2 ... [c@wf7, c@wf22, c@wf26, c@wf9, c@wf32, c@wf4, ... [{'language': 1, 'ability': {'listening': 4, '... [] 10 [{'code': '12001003045', 'description': 'Pytho... None {'lastProcessedResumeAtTime': 1758268464, 'las... None None None
37 20250822 5 1001001001 電腦系統整合服務業 精藤股份有限公司 96972657000 資料科學家(AI工程師)之職務內容如下:\n1. AI模型研發、測試、開發、應用導入評估\n... [[[資料科學]]]家(AI工程師)之職務內容如下:\n1. AI模型研發、測試、開發、應用... 0.31 中山北路二段61號11樓 ... [c@wf10, c@wf23, college@student_invited, c@wf... [] [] 170 [{'code': '12001003045', 'description': 'Pytho... None {'lastProcessedResumeAtTime': 1758260959, 'las... None None None
38 20250917 12 1004001007 金融控股業 國泰金控_國泰金融控股股份有限公司 70827406000 [工作內容]\n職務包含但不限於以下內容\n- 基於 Python 語言之產品開發,推廣及後... [工作內容]\n職務包含但不限於以下內容\n- 基於 Python 語言之產品開發,推廣及後... 0.00 ... [c@wf26, c@wf1, c@wf31, c@wf29, c@wf33, foreig... [] [] 800 [] None {'lastProcessedResumeAtTime': 1758173984, 'las... None None None
39 20250915 4 1002014006 航空器及其零件製造修配業 豐達科技股份有限公司 16095404000 1.生產/製程大數據資料採集及數據倉庫建置\n2.依各大數據分析專案所需\n3.數據治理與D... 1.生產/製程大數據[[[資料]]]採集及數據倉庫建置\n2.依各大數據分析專案所需\n3.... 0.00 太平東路1號 ... [c@wf34, c@wf18, c@wf10, c@wf25, foreigners@fo... [{'language': 1, 'ability': {'listening': 8, '... [32, 64, 65536] 530 [{'code': '12001001007', 'description': 'Linux... None {'lastProcessedResumeAtTime': 1757926623, 'las... None None None
40 20250918 15 1001001003 網際網路相關業 易可思科技股份有限公司 130000000215354 \n2. 機器學習與深度學習演算法開發及優化。\n3. 進行資料統計分析與視覺化。\n4. ... \n2. 機器學習與深度學習演算法開發及優化。\n3. 進行[[[資料]]]統計分析與視覺化... 0.32 吉林路24號8樓之2 ... [c@wf1, c@wf26, c@wf7, c@wf29, c@wf9, c@wf2, c... [] [2, 64, 2048] 50 [{'code': '12001003045', 'description': 'Pytho... None {'lastProcessedResumeAtTime': 1758276293, 'las... None None None
41 20250915 2 1004003002 產物保險業 國泰世紀產物保險股份有限公司 84445772000 【關於我們】\n我們是國泰產險的資料科學(DS)團隊,使命在於持續進化數據應用,創造並釋放數... 【關於我們】\n我們是國泰產險的[[[資料科學]]](DS)團隊,使命在於持續進化數據應用,... 0.41 敦化南路二段39號 ... [foreigners@pt_fc_em_jbs, c@wf3, c@wf7, c@wf9,... [] [] 2300 [] None {'lastProcessedResumeAtTime': 1758450005, 'las... None None None
42 20250917 11 1004001001 銀行業 國泰世華商業銀行股份有限公司 4231910004 性的環境下,實現個人專業成長、累積市場能見度,一起跟上東南亞數位金融市場的快速成長!\n\n... 性的環境下,實現個人專業成長、累積市場能見度,一起跟上東南亞數位金融市場的快速成長!\n\n... 0.00 ... [c@wf7, c@wf10, c@wf9, c@wf3, foreigners@full_... [] [] 10000 [] None {'lastProcessedResumeAtTime': 1757990480, 'las... None None None
43 20250908 15 1001001002 電腦軟體服務業 瑋恆科技有限公司 130000000227823 方案,並能夠應用於重點客戶\n 日常顧問服務作業。\n3. 及時提供商務推動市場所需資... 方案,並能夠應用於重點客戶\n 日常顧問服務作業。\n3. 及時提供商務推動市場所需[... 0.00 ... [c@wf10, c@wf12, c@wf3, c@wf2, c@wf29, c@wf26,... [{'language': 1, 'ability': {'listening': 8, '... [] 0 [{'code': '12001011002', 'description': 'Googl... None {'lastProcessedResumeAtTime': 1758250908, 'las... None None None

44 rows × 45 columns

Dump files for backup#

  • 因為抓取資料很久很辛苦,所以通常會把它寫到後端的檔案、資料庫,或者雲端的資料庫中。在此,我們選擇把他寫到pandas或者.json()比較好讀的json檔。通常不會寫到CSV,因為CSV是以逗點分隔為辨識基礎,但文本中可能也會有逗點,會比較容易出錯。

  • 建議若設計了寫入,就立刻讀出來看看,省得不小心寫入錯誤,屆時程式關閉了,資料就取不回來了。

  • 還有另外一種檔案是python的pickle檔。pickle是一種暫存檔,也就是我們現在如果有一個變數是pandas dataframe,寫到pickle再讀出來,他還會是一個pandas dataframe,而且資料型態都不會變。這點其實非常好用,因為如果你把一個dataframe轉為json,你要特別注意那些datetime欄位或multiindex的東西被轉成什麼,又是否能夠讀得回來。也就是如果時間物件要寫入到json檔時,理應要先轉成string,然後讀取回來要做分析時,也要再轉回來datetime。但如果你轉為pickle檔,存進去是什麼樣子,拿出來就是什麼樣子。那pickle檔有缺點嗎?有!就和其他的程式例如R或網頁程式無法通用,也無法直接寫到雲端資料庫。

M1. Dump one variable to json by json library#

import json

# Uncomment the following code
# with open('104_list.json', 'w') as outfile:
#     json.dump(all_data, outfile)

M2. Dump and load json by pandas library#

# Uncomment the following code

# with open('104_df.json', 'w') as f:
#     f.write(df.to_json())
# Uncomment the following code
# Read-back

# pd.read_json("104_df.json")

M3. Dump multiple variables to pickle#

import pickle
with open('104.pkl', 'wb') as fout:  # Python 3: open(..., 'wb')
    pickle.dump([all_data, df], fout)
# Uncomment the following code

import pickle
# with open('104.pkl', 'wb') as fout:  # Python 3: open(..., 'wb')
#     pickle.dump([all_data, df], fout)

Load multiple variables back to objects#

with open('104.pkl', "rb") as fin:  # Python 3: open(..., 'rb')
    test = pickle.load(fin)
    print(type(test[0]))
    print(type(test[1]))
# Uncomment the following code

# with open('104.pkl', "rb") as fin:  # Python 3: open(..., 'rb')
#     test = pickle.load(fin)
#     print(type(test[0]))
#     print(type(test[1]))
# Uncommment the following code

# test[0][0].keys()

Using timestamp as file name#

因為我們抓取資料的for-loop如果有幾千或幾萬個iterations,勢必很怕抓到一半斷掉或當機,卻又得重抓。所以最好的方式就是,每抓個幾百筆或幾千筆,就留一份檔案。但要如何區分這些檔案的先後順序?通常會用撈取的時間加上資料筆數的先後來作為檔名的一部分,這樣之後就可以觀看這些檔名來知道,究竟資料有沒有抓完,或者當在哪裡。

下面的程式碼將取得的現在時間加到檔名中

with open('104_%s.pkl'%(now), 'wb') as fout:  # Python 3: open(..., 'wb')
    pickle.dump([all_data, df], fout)
from datetime import datetime

now = datetime.now().strftime("%Y%m%d%H%M%S")
print("Current Time =", now)

# with open('104_%s.pkl'%(now), 'wb') as fout:  # Python 3: open(..., 'wb')
#     pickle.dump([all_data, df], fout)
Current Time = 20250921220233