學習動機

換句話說

想實現遊戲自動化

自學✅

生活化

?

為何是網路爬蟲

什麼是網路爬蟲

學習成果 :

每天都重複?

好無聊 !

AUTO

讓電腦自動完成日常瑣事

定義

用程式模擬人類在網路上的行為

是怎麼做的?

就像你上網找歌單

網路爬蟲

你啟動它

輸出

進入kkbox

找到資料

記下來

進入kkbox

找到資料

記下來

抓取資料GET範例

傳送資料POST範例

就像你填春遊報名表

進入表單

填寫資料

送出

網路爬蟲

你啟動它

輸出ok

進入表單

準備資料

送到伺服器

用途:

  • 機器學習、監控資料、數據分析

 

  • 從網路上擷取資料

 

  • 向伺服器發送指令

網路爬蟲學習成果

學習成果 :

# PRESENTING CODE

requests怎麼寫

發出第一個指令:基本語法

url = "https://ckcsc.net/"
data = {"key": "example"}

response = requests.get(url)

response = requests.post(url, json=data)

requests.GET

# PRESENTING CODE
import requests

a = requests.get("https://ckcsc.net")





print(a)

賦值

使用模組

使用GET

要取得的網址

requests.GET

# PRESENTING CODE
import requests

a = requests.get("https://ckcsc.net")

print(a.text)

讓它輸出網站的整個內容

輸出【文字屬性】

輸出結果

看的出來成電社網大部分都是JavaScript動態生成

requests.POST應用

範例:遊戲外掛

自動開PaGamO的【假期模式】

requests.POST應用

事實上,只是POST到API兩個小數字而已

# PRESENTING CODE
import requests

info_url = 'https://www.pagamo.org/users/personal_information.json'
s = requests.Session()

def open_hoilday():
    #登入
    login_url = 'https://www.pagamo.org/api/sign_in'
    login_data = {'account': "wallace999999", 'encrypted': True, 'password': "SQ3GcclkDIlmMulkfdpnUxSO1FssO0RBLPfrmFT5x2DuteYMSRr2luPaYJywYXRpLclcOckosmHWURjTYdIHMYFPTtZ3VT6WHNz+9p4hpf94NAAtKIic6tQn0uuI2B2PBGCMg88ZJ77CB8yqGumt/T5+ZbaueHHn42OWzCE1h6Xo8fSsRZnrQMXRkUwLbRojZ6FTa2yTcGMwblOia7ohULM/sDvOYXTXX8oMCSChvbUcXcpszmgegdnKj7KRmkOLuEYX3LcZjY1c34B70R8HYhBsWZnLjdxHC7f70OfcKplnWOPHpOPIy8+SMATJoBF4Eq1/jvPduaf8W4PfucXKzA=="}

    print('正在登入...')
    login_resp = s.post(login_url, data=login_data).json()
    gc_id = login_resp['data']['gtm_info']['gc_id']
    print(gc_id)

    headers = { "Origin": "https://www.pagamo.org", "Referer": f"https://www.pagamo.org/map?course_code=TMGQOQS7" } # 將數據以JSON格式傳遞 
            # 發送POST請求
    response = s.post("https://www.pagamo.org/gamecharacters/holiday_mode", json={'gc_check': gc_id, 'key': gc_id}, headers=headers)
    print(response.text)

open_hoilday()

requests.POST應用

範例程式碼:

登入

POST到holiday(假期模式)

requests.POST應用

事實上,只是POST到API兩個小數字而已

✔️相同效果

生活應用✔️

遇到的困難

學習歷程 :

  • 自學資源
  • 錯誤解決
  • 時間壓力

學習資源

學習歷程 :

GPT

加入相關社團

錯誤解決

學習歷程 :

官方文獻

時間分配

學習歷程 :

上學期時間分配

下學期時間分配

週數 計畫
第1~2周 專案實作收尾
第3周 準備考幹作業
第4~5周 上台發表簡報製作

在生活中的應用

學習成果 :

  • 學習後上台教學
  • 遊戲外掛結合TG聊天機器人

考幹作業 :

 

 

學習後上台教學

簡報示例

網路爬蟲介紹

常見網路爬蟲語法

語法 優點 套件
Python 易學,初學者首選 requests
BeautifulSoup
Selenium
JavaScript 模擬網頁行為,能抓取動態資料 axios,
cheerio
Java 穩定,適合大量處理 Jsoup,
Selenium
C# 整合Windows系統 HtmlAgilityPack

網路爬蟲三件套

直接發送請求

requests

整理接收結果

Beautifulsoup

模擬真實使用者

Selenium

爬蟲類型比較

類型 用途 特色
requests + BeautifulSoup 靜態網頁 直接抓下整個網頁
Selenium 動態網頁 模擬人類操作,可取得包含動態數值
API爬蟲 伺服器端口 官方資料接口、回傳指定資料

後面會再解釋原理

requests寫法

pip install requests
# PRESENTING CODE

requests安裝

  • Python外部函式庫

在終端機輸入 :

# PRESENTING CODE

requests第一步

引入函式庫:

import requests
# PRESENTING CODE

requests怎麼寫

發出第一個指令:基本語法

url = "https://ckcsc.net/"
data = {"key": "example"}

response = requests.get(url)

response = requests.post(url, json=data)

有兩種?

GET?   POST?

# PRESENTING CODE

requests

屬性 用途 範例
requests.get 向伺服器【請求】資料 瀏覽網頁
request.post 向伺服器【發送】資料 提交表單

API

  • 允許不同軟體之間互相溝通和交換資料

 

  • 讓你不需要知道內部實際結構,即可獲取資料

 

  • 爬蟲可以透過 API 來獲取結構化資料,不用直接解析 HTML 

定義

郵差

( API )

寄信者

( 使用者 )

面試官

( 伺服器 )

寄信

傳送

傳送

送回

✅填地址和郵遞區號

✅填面試官要的個資

❌知道怎麼送信

❌知道面試官怎麼審核

投面試履歷

乖乖在家就會送回來 不用懂

你只需要知道✅

  • 可用的功能或服務: 另一個軟體可以請求或使用的特定操作
  • 發出請求: 請求的格式、需要的資料和參數
  • 接收回應: 回應的格式和包含的資料

特點

你不需要知❌

  • 底層系統細節: 哪種程式語言、資料庫結構、演算法等。

  • 系統基礎架構: 部署在哪裡、使用了哪些伺服器、網路拓撲結構等

  • 版本細節:只要 API 的介面保持向後兼容,我們通常不需要深入了解目標系統的具體版本號和內部更新細節。

輕鬆易懂

範例

抓取空氣品質指標

有無API差異

不使用API

使用API

使用他「專門提供做這件事的連結」 ,取得整理好的資料

https://data.moenv.gov.tw/api/v2/aqx_p_432?api_key=9b651a1b-0732-418e-b4e9-e784417cadef&limit=1000&sort=ImportDate%20desc&format=JSON"

範例

# PRESENTING CODE
import requests

url = "https://data.moenv.gov.tw/api/v2/aqx_p_432?api_key=9b651a1b-0732-418e-b4e9-e784417cadef&limit=1000&sort=ImportDate%20desc&format=JSON"
Useragent = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
response = requests.get(url, headers=Useragent)
print(response.text)

輸出:

# PRESENTING CODE

如何解析?

我是樹林人

.json

  • API回傳的通常是JSON格式
  • 是種常見的輕量級資料交換格式

❓Python看不懂

✔️轉換成Python字典格式

❗使用.JSON解碼

.json

  • JSON {物件} 會被轉換成 Python 字典 (dictionary)。
  • JSON [陣列] 會被轉換成 Python 列表 (list)。

語法:

response = (requests.get(url, headers=Useragent)).json()

在回傳後的資料加上.json()

注意事項:只有格式為json時才會運作,否則會報錯

# PRESENTING CODE

.JSON範例

import requests

url = "https://data.moenv.gov.tw/api/v2/aqx_p_432?api_key=9b651a1b-0732-418e-b4e9-e784417cadef&limit=1000&sort=ImportDate%20desc&format=JSON"
Useragent = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
response = (requests.get(url, headers=Useragent)).json()
print(response)

輸出:

✅輸出Python字典格式

.JSON後取得數值

❓轉換成字典之後,如何取得其中的數值?

✔️直接取得字典內的數值

❗使用KEY處理巢狀結構

ex.取得pm10=多少?

# PRESENTING CODE

獲取KEY

data = {
    'status': 'success',
    'result': {
        'user': {
            'id': 123,
            'profile': {
                'name': 'Alice',
                'age': 30,
                'address': {
                    'city': 'Taipei',
                    'zipcode': '100'
                }
            },
            'hobbies': ['reading', 'coding']
        }
    }
}

user_id = data['result']['user']['id']
print(user_id)

基本語法

依序取得鍵中的鑑中的值

data['result'] -> {'user': ...}
data['result']['user'] -> {'id': 123, 'profile': ...}
data['result']['user']['id'] -> 123
# PRESENTING CODE

獲取pm10作法詳解

import requests
import json

url = "https://data.moenv.gov.tw/api/v2/aqx_p_432?api_key=9b651a1b-0732-418e-b4e9-e784417cadef&limit=1000&sort=ImportDate%20desc&format=JSON"
Useragent = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}

response = requests.get(url, headers=Useragent)
data = response.json()

for record in data['records']:
    if record['sitename'] == '屏東':
        print(record['pm10'])
  • 因為資料有很多組 所以遍歷所有record
  • 找到【屏東】就停下
  • 尋找屏東的pm10
30

自己尋找API

  • 不是所有東西都有提供公開的API

❓想取得那種資料怎麼辦

✔️自己找&直接get讓他回傳

ex.網頁遊戲的個人資料頁面

  • 他不可能給你API讓你抓取別人個資

 

  • 但你可以自己找API取得這些數值

自己尋找API

1.

2.

檢查

network

自己尋找API

3.點擊會取得資料的物件

ex.按下頭像會跳出資料

4.你會看到一個.json,點進去

自己尋找API

API在此

這是使用post,會在下個章節說明

5.

自己尋找API

回傳的內容

此時就可以透過解析巢狀結構來獲取想要的資料

練習題:

抓取產銷履歷Tracecode為00991927504943的產品名稱(ProductName)

# PRESENTING CODE

答案:

(貼標) 福山萵苣油麥菜-大陸妹

用for迴圈遍歷,如果Tracecode為00991927504943,就印出ProductName【(貼標) 福山萵苣油麥菜-大陸妹】

專案實作 :

 

遊戲外掛結合

TG聊天機器人

用途:

 

 

 

透過對聊天室輸入帳密並輸入需求,後台會接收並進行遊戲

接收帳密

處理輸入內容

進行遊戲(網路爬蟲post)

資料庫

後台介面

心得與反思

學習歷程 :

一句話總結

Made with Slides.com