---
# System prepended metadata

title: 2024.5.26 上課講義
tags: [雄資, 資研]

---

# 2024.5.26 上課講義

## Matplotlib

[**官方資料**](https://matplotlib.org/stable/index.html)

掛接雲端硬碟

```python=
from google.colab import drive
drive.mount('/content/drive')
```

引入所需套件

```python=
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager as plt_font
twfont1 = plt_font.FontProperties(fname = '字型路徑')
```

### 關係圖 Plotting

#### 設定x、y軸的點

```python=
x_point = np.array([1, 5])
y_point = np.array([4, 10])
```

#### 設定繪圖

```python=
plt.plot(x_point, y_point)
plt.show()
```

:::spoiler 全部程式碼
```python=
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager as plt_font
twfont1 = plt_font.FontProperties(fname = '/content/drive/MyDrive/資研/資料/msjh.ttc')

x_point = np.array([1, 5])
y_point = np.array([4, 10])

plt.plot(x_point, y_point)
plt.show()
```
:::

![image](https://hackmd.io/_uploads/rJKVdEbfR.png)

#### 加上一些設定、標題、標籤

```python=
# 設定繪圖區大小
plt.figure(figsize = (12, 6))
# 繪圖區的標題
plt.title("標題說明文字", fontproperties = twfont1, fontsize = 20)
# 設定橫軸和縱軸的標題
plt.xlabel("x軸標題文字", fontproperties = twfont1, fontsize = 20)
plt.ylabel("y軸標題文字", fontproperties = twfont1, fontsize = 20)
# 函數標籤
plt.plot(x_point, y_point, label = "標籤")
# 顯示標籤
plt.legend(prop = twfont1)
```

>fontproperties 是用來設定字型， twfont1 是前面所設定的字型名稱（可改）
>fontsize 是用來設定字體的大小
>`plt.legend()` 可以取代 `plt.show()`

:::spoiler 全部程式碼
```python=
# 加入說明
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager as plt_font
twfont1 = plt_font.FontProperties(fname = '/content/drive/MyDrive/資研/資料/msjh.ttc')

plt.figure(figsize = (5, 5))
plt.title("標題說明文字", fontproperties = twfont1, fontsize = 20)
plt.xlabel("x軸標題文字", fontproperties = twfont1, fontsize = 20)
plt.ylabel("y軸標題文字", fontproperties = twfont1, fontsize = 20)

x_point = np.array([1, 5])
y_point = np.array([4, 10])

plt.plot(x_point, y_point, label = "標籤")
plt.legend(prop = twfont1)
```
:::

![image](https://hackmd.io/_uploads/By8HyrWG0.png)


#### 描點、無線

```python=
# 無線
plt.plot(x_point, y_point, 'o', label = "標籤")
```

:::spoiler 全部程式碼
```python=
# 無線
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager as plt_font
twfont1 = plt_font.FontProperties(fname = '/content/drive/MyDrive/資研/資料/msjh.ttc')

plt.figure(figsize = (5, 5))
plt.title("標題說明文字", fontproperties = twfont1, fontsize = 20)
plt.xlabel("x軸標題文字", fontproperties = twfont1, fontsize = 20)
plt.ylabel("y軸標題文字", fontproperties = twfont1, fontsize = 20)

x_point = np.array([1, 5])
y_point = np.array([4, 10])

plt.plot(x_point, y_point, 'o', label = "標籤")
plt.legend(prop = twfont1)
```
:::

![image](https://hackmd.io/_uploads/r1JaJrZzC.png)

```python=
# 描點
plt.plot(x_point, y_point, marker='o', label = "標籤")
```

:::spoiler 全部程式碼
```python=
# 描點
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager as plt_font
twfont1 = plt_font.FontProperties(fname = '/content/drive/MyDrive/資研/資料/msjh.ttc')

plt.figure(figsize = (5, 5))
plt.title("標題說明文字", fontproperties = twfont1, fontsize = 20)
plt.xlabel("x軸標題文字", fontproperties = twfont1, fontsize = 20)
plt.ylabel("y軸標題文字", fontproperties = twfont1, fontsize = 20)

x_point = np.array([1, 5])
y_point = np.array([4, 10])

plt.plot(x_point, y_point, marker='o', label = "標籤")
plt.legend(prop = twfont1)
```
:::

![image](https://hackmd.io/_uploads/rkK01Bbf0.png)

:::info
**練習**

請利用剛剛教的內容，畫出一個 $y = sinx$ 的圖形

```python=
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager as plt_font
twfont1 = plt_font.FontProperties(fname = '字型路徑')

plt.figure(figsize = (5, 5))
plt.title("標題說明文字", fontproperties = twfont1, fontsize = 20)
plt.xlabel("x軸標題文字", fontproperties = twfont1, fontsize = 20)
plt.ylabel("y軸標題文字", fontproperties = twfont1, fontsize = 20)

# 把 x, y 的點改成 sin 圖形
______

plt.plot(x_point, y_point, label = "標籤")
plt.legend(prop = twfont1)
```

```python=
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager as plt_font
twfont1 = plt_font.FontProperties(fname = '/content/drive/MyDrive/資研/資料/msjh.ttc')

plt.figure(figsize = (8, 5))
plt.title("y = sinx", fontproperties = twfont1, fontsize = 20)
plt.xlabel("x", fontproperties = twfont1, fontsize = 20)
plt.ylabel("y", fontproperties = twfont1, fontsize = 20)

# 把 x, y 的點改成 sin 圖形
x_point = np.linspace(-2*np.pi, 2*np.pi, 100)
y_point = np.sin(x_point)

plt.plot(x_point, y_point, label = "sin")
plt.legend(prop = twfont1)
```

![image](https://hackmd.io/_uploads/By3XgfxE0.png)

:::

#### 改變顏色、線條、符號

順序是顏色、線條、符號，不用間隔直接加在資料後面

```python=
plt.plot(x_point, y_point, "r--+", marker='o', label = "標籤")
```

:::spoiler 全部程式碼
```python=
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager as plt_font
twfont1 = plt_font.FontProperties(fname = '/content/drive/MyDrive/資研/資料/msjh.ttc')

plt.figure(figsize = (5, 5))
plt.title("標題說明文字", fontproperties = twfont1, fontsize = 20)
plt.xlabel("x軸標題文字", fontproperties = twfont1, fontsize = 20)
plt.ylabel("y軸標題文字", fontproperties = twfont1, fontsize = 20)

x_point = np.array([1, 5])
y_point = np.array([4, 10])

plt.plot(x_point, y_point, "r--+", marker='o', label = "標籤")
plt.legend(prop = twfont1)
```
:::

![image](https://hackmd.io/_uploads/BkmrWHbzA.png)

[**其他顏色、線條、符號**](https://www.w3schools.com/python/matplotlib_markers.asp)
[**更多跟線有關的參數**](https://www.w3schools.com/python/matplotlib_line.asp)

:::info
**練習**

請大家畫一個 $f1: y = (x-\frac{1}{5})^2 + 2$ 和一個 $f2: y = -x^3 + 2$ 的圖形，條件如下：
1. 圖的大小是 $8 * 8$
2. 標題是 **二次函數** 字體大小為 15
4. x是在-2~2之間平均取20個點（上次有教）
5. 要畫線+描點
6. f1的顏色為 #005AB5 ；f2的顏色為 #3D7878
7. 要有圖例標示
8. 其餘的自訂

```python=
# 載入套件、模組
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager as plt_font
twfont1 = plt_font.FontProperties(fname = '字型路徑')

# 定義出指定函式
def f1(x):
  return __f1__

def f2(x):
  return __f2__

# 設定座標點
x_point = _____
y_point1 = __f1_y__
y_point2 = __f2_y__

# 定義圖片大小、標題
plt.figure(figsize = (___, ___))
plt.title("___", fontproperties = twfont1, fontsize = ___)
plt.xlabel("x軸", fontproperties = twfont1, fontsize = ___)
plt.ylabel("y軸", fontproperties = twfont1, fontsize = ___)

# 畫出來
plt.plot(___f1___)
plt.plot(___f2___)
plt.legend(prop = twfont1)
```

```python=
# 載入套件、模組
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager as plt_font
twfont1 = plt_font.FontProperties(fname = '/content/drive/MyDrive/資研/資料/msjh.ttc')

# 定義出指定函式
def f1(x):
  return (x-0.2)**2+2

def f2(x):
  return -x**3+2

# 設定座標點
x_point = np.linspace(-2, 2, 20)
y_point1 = f1(x_point)
y_point2 = f2(x_point)

# 定義圖片大小、標題
plt.figure(figsize = (8, 8))
plt.title("二次函數", fontproperties = twfont1, fontsize = 15)
plt.xlabel("x軸", fontproperties = twfont1, fontsize = 8)
plt.ylabel("y軸", fontproperties = twfont1, fontsize = 8)

# 畫出來
plt.plot(x_point, y_point1, c = "#005AB5", linewidth = 2, marker='o', ms = 5, label = "f1")
plt.plot(x_point, y_point2, linestyle = "dotted", c = "#3D7878", linewidth = 2, marker='s', ms = 5, label = "f2")
plt.legend(prop = twfont1)
```

![image](https://hackmd.io/_uploads/ryqGUzxNR.png)
:::

### 散佈圖 Scatter

```python=
import numpy as np
import random as rd
import matplotlib.pyplot as plt
import matplotlib.font_manager as plt_font
twfont1 = plt_font.FontProperties(fname = '/content/drive/MyDrive/資研/資料/msjh.ttc')

plt.figure(figsize = (5, 5))
plt.title("散佈圖", fontproperties = twfont1, fontsize = 20)

x_point = np.array([5,7,8,7,2,17,2,9,4,11,12,9,6])
y_point = np.array([99,86,87,88,111,86,103,87,94,78,77,85,86])

# 散佈圖用scatter
plt.scatter(x_point, y_point, c = "#7373B9")
# 沒有圖例，用plt.show()
plt.show()
```

![image](https://hackmd.io/_uploads/r1POz8-GC.png)

:::warning
**顏色可以用漸層的**
[cmps](https://matplotlib.org/stable/users/explain/colors/colormaps.html)

```python=
import numpy as np
import random as rd
import matplotlib.pyplot as plt
import matplotlib.font_manager as plt_font
twfont1 = plt_font.FontProperties(fname = '/content/drive/MyDrive/資研/資料/msjh.ttc')

plt.figure(figsize = (5, 5))
plt.title("散佈圖", fontproperties = twfont1, fontsize = 20)

x_point = np.array([5,7,8,7,2,17,2,9,4,11,12,9,6])
y_point = np.array([99,86,87,88,111,86,103,87,94,78,77,85,86])
colors = np.linspace(0, 100, 13)

plt.scatter(x_point, y_point, c = colors, cmap = "Blues")
# 顯示colorbar
plt.colorbar()
plt.show()
```

![image](https://hackmd.io/_uploads/Sy9hGIZfC.png)
:::

:::warning
**補充**

匯入檔案
>[**2-22 grade連結**](https://drive.google.com/file/d/1FlvETq3yinKiEv0UF4fmCias1NySX5RW/view?usp=drive_link)（也有放在資料夾裡）
>第一行是座號；第二行是成績

```python=
data = np.loadtxt("/content/drive/MyDrive/資研/雄資/教學/20240526/2-22 grade.csv",delimiter=",")
print(data.shape)
```

調整檔案

```python=
data_T = data.T
```

畫出散佈圖

```python=
import numpy as np
import random as rd
import matplotlib.pyplot as plt
import matplotlib.font_manager as plt_font
twfont1 = plt_font.FontProperties(fname = '/content/drive/MyDrive/資研/資料/msjh.ttc')

plt.figure(figsize = (8, 5))
plt.title("二年二十二班成績散佈圖", fontproperties = twfont1, fontsize = 20)
plt.xlabel("座號", fontproperties = twfont1, fontsize = 12)
plt.ylabel("成績", fontproperties = twfont1, fontsize = 12)

x_point = data_T[0]
y_point = data_T[1]

plt.scatter(x_point, y_point)
plt.show()
```
![image](https://hackmd.io/_uploads/r1aWanB7A.png)

加上班平均的標準線

```python=
import numpy as np
import random as rd
import matplotlib.pyplot as plt
import matplotlib.font_manager as plt_font
twfont1 = plt_font.FontProperties(fname = '/content/drive/MyDrive/資研/資料/msjh.ttc')

plt.figure(figsize = (8, 5))
plt.title("二年二十二班成績散佈圖", fontproperties = twfont1, fontsize = 20)
plt.xlabel("座號", fontproperties = twfont1, fontsize = 12)
plt.ylabel("成績", fontproperties = twfont1, fontsize = 12)

# 計算班平均
s = 0
for i in data_T[1]:
  s += i
standard = s//40

x_point = data_T[0]
y_point = data_T[1]
# 設定點
x_point1 = [0, 40]
y_point1 = [standard]*2

plt.scatter(x_point, y_point)
# 畫出班平均的線
plt.plot(x_point1, y_point1, 'r', label = "班平均")
plt.legend(prop = twfont1)
```

![image](https://hackmd.io/_uploads/BJYlpnHQC.png)

:::

### 長條圖 Bars

```python=
import numpy as np
import random as rd
import matplotlib.pyplot as plt
import matplotlib.font_manager as plt_font
twfont1 = plt_font.FontProperties(fname = '/content/drive/MyDrive/資研/資料/msjh.ttc')

plt.figure(figsize = (10, 5))
plt.title("長條圖", fontproperties = twfont1, fontsize = 20)
plt.xlabel("座號", fontproperties = twfont1, fontsize = 10)
plt.ylabel("作業完成度", fontproperties = twfont1, fontsize = 10)

# 取得 array = 1~38
x_point = np.arange(1, 39)
# 取得 array = 1~100
Y = list(np.arange(0, 100))
# 隨機取 38個1~100之間 的數字做為 1~38號的完成狀況
y_point = rd.sample(Y, 38)
# 長條圖用bar
plt.bar(x_point, y_point)
plt.show()
```

![image](https://hackmd.io/_uploads/rJosHIZfC.png)

:::warning
**補充**

使用 `plt.barh()` 可以繪製橫向的長條圖

```python=
import numpy as np
import random as rd
import matplotlib.pyplot as plt
import matplotlib.font_manager as plt_font
twfont1 = plt_font.FontProperties(fname = '/content/drive/MyDrive/資研/資料/msjh.ttc')

plt.figure(figsize = (5, 10))
plt.title("長條圖", fontproperties = twfont1, fontsize = 20)
plt.xlabel("座號", fontproperties = twfont1, fontsize = 10)
plt.ylabel("作業完成度", fontproperties = twfont1, fontsize = 10)

# 取得 array = 1~38
x_point = np.arange(1, 39)
# 取得 array = 1~100
Y = list(np.arange(1, 101))
# 隨機取 38個1~100之間 的數字做為 1~38號的完成狀況
y_point = rd.sample(Y, 38)
# 長條圖用bar
plt.barh(x_point, y_point)
plt.show()
```

![image](https://hackmd.io/_uploads/H1eLpGgVC.png)
:::

:::info
**練習**

請利用以下檔案，先將作業完成度轉換成完成百分比，並畫出長條圖
>[**2-22 homework連結**](https://drive.google.com/file/d/1zi9dw0euNINONgm0t-Fqlt17DyCMcWlU/view?usp=drive_link)（也有放在資料夾裡）
>第一行是座號；第二行是完成作業數（共17項作業）

匯入檔案

```python=
data = np.loadtxt("/content/drive/MyDrive/資研/雄資/教學/20240526/2-22 homework.csv",delimiter=",")
data_T = data.T
```

把完成件數轉成百分比

```python=
finish = data_T[1]
percentage = finish/17*100
```

引入套件 + 設定圖片

```python=
import numpy as np
import random as rd
import matplotlib.pyplot as plt
import matplotlib.font_manager as plt_font
twfont1 = plt_font.FontProperties(fname = '/content/drive/MyDrive/資研/資料/msjh.ttc')

plt.figure(figsize = (10, 5))
plt.title("長條圖", fontproperties = twfont1, fontsize = 20)
plt.xlabel("座號", fontproperties = twfont1, fontsize = 10)
plt.ylabel("作業完成度", fontproperties = twfont1, fontsize = 10)
```

繪圖

```python=
x_point = data_T[0]
y_point = percentage

plt.bar(x_point, y_point)
plt.show()
```
:::

### 直方圖 Histograms

```python=
import numpy as np
import random as rd
import matplotlib.pyplot as plt
import matplotlib.font_manager as plt_font
twfont1 = plt_font.FontProperties(fname = '/content/drive/MyDrive/資研/資料/msjh.ttc')

plt.figure(figsize = (10, 5))
plt.title("長方圖", fontproperties = twfont1, fontsize = 20)

D = list(np.arange(0, 100))
data = rd.sample(D, 20)

# 直方圖用plt.hist()，bins = "auto"會自動決定組距
plt.hist(data, bins = 'auto')
plt.show()
```

![image](https://hackmd.io/_uploads/r1aawIWz0.png)

### 圓餅圖 Pie Charts

```python=
import numpy as np
import random as rd
import matplotlib.pyplot as plt
import matplotlib.font_manager as plt_font
twfont1 = plt_font.FontProperties(fname = '/content/drive/MyDrive/資研/資料/msjh.ttc')

plt.figure(figsize = (10, 5))
plt.title("圓餅圖", fontproperties = twfont1, fontsize = 20)

data = np.array([35, 25, 25, 15])
# 設定各項數據名稱
L = ["freshman", "sophomore", "junior", "senior"]
# 設定圓餅突出的距離
E = [0, 0.2, 0, 0]
# 設定顏色
C = ["#C4E1FF", "#66B3FF", "#2894FF", "#004B97"]

# 圓餅圖用plt.pie()，labels圖例，explode突出，colors顏色，shadow陰影
plt.pie(data, labels = L, explode = E, colors = C, shadow = True)
# title標題，loc圖例位置
plt.legend(prop = twfont1, title = "Students", loc = "upper left")
```

![image](https://hackmd.io/_uploads/SkpV3UWzR.png)

---

## 讀寫檔案

:::danger
注意！以下所有程式碼的檔案路徑都要記得修改成自己的檔案路徑
或是直接複製我的，但是另外加一行
```python=
f = '裡面放要存資料的資料夾路徑'
```
:::

在 Python 檔案中，使用`\n`來辨別文章的分行

```
今天星期日。
今天的日期是5/26。
-2024.5.26
```

在檔案中，格式會是

```
今天星期日。\n今天的日期是5/26。\n-2024.5.26
```

### 開啟檔案

```python=
infile = open('檔案路徑', '代號')
```

| 代號 |         功能          |
|:----:|:---------------------:|
|  r   |       read 讀取       |
|  w   |  write 撰寫（複寫）   |
|  a   | append 添加（在最後） |
|  x   |      create 建立      |

>w、a 在檔案不存在的情況下會直接建立一個新的檔案

### 關閉檔案

開啟檔案後要記得關閉就像瀏覽器要記得登出一樣，是一種好習慣
>沒有關閉會記憶體被佔據

```python=
infile.close()
```

### 讀取檔案

|   名稱    |          功能          |
|:---------:|:----------------------:|
|   read    |   一次讀進全部的檔案   |
| readline  |       讀取第一行       |
| readlines | 一行一行讀取全部的檔案 |

1. read

    ```python=
    infile = open(f+'text01.txt','r')
    content = infile.read()
    infile.close()
    ```

    加上指定大小（讀取指定字元數）

    ```python=
    infile = open(f+'text01.txt','r')
    content = infile.read(7)
    infile.close()
    ```

2. readline

    ```python=
    infile = open(f+'text01.txt','r')
    content = infile.readline()
    infile.close()
    ```

    加上指定大小（讀取第一行的指定字元數）
    >超過字數還是只會讀取第一行

    ```python=
    infile = open(f+'text01.txt','r')
    content = infile.readline(20)
    infile.close()
    ```

3. readlines

    ```python=
    infile = open(f+'text01.txt','r')
    content = infile.readlines()
    infile.close()
    ```

    加上指定大小（讀取包含指定字元數的那幾行）

    ```python=
    infile = open(f+'text01.txt','r')
    content = infile.readlines(20)
    infile.close()
    ```

:::info
**練習**

請讀取下列檔案的內容，並輸出成以下格式

```
寒蟬淒切。
對長亭晚，驟雨初歇。
都門帳飲無緒，留戀處，蘭舟催發。
執手相看淚眼，竟無語凝噎。
念去去、千里煙波，暮靄沈沈楚天闊。

多情自古傷離別。
更那堪、冷落清秋節。
今宵酒醒何處，楊柳岸、曉風殘月。
此去經年，應是良辰好景虛設。
便縱有、千種風情，更與何人說。
```

>[**檔案連結**](https://drive.google.com/file/d/1-kaNLx9_iDO4_CplLsG56xMWHhUDuswx/view?usp=sharing)
>可以先下載下來再傳上雲端

```python=
infile = open(f+'practice1.txt','r')
content = infile.read()
infile.close()

for i in content:
  if i == '。': print('。')
  else: print(i, end='')
```
:::

4. readable

    回傳該檔案是否能進行讀取

    ```python=
    infile1 = open(f+'text00.txt','r')
    infile2 = open(f+'text00.txt','w')
    print(infile1.readable())
    print(infile2.readable())
    infile1.close()
    infile2.close()
    ```

### 撰寫檔案

:::danger
使用 write 會先 **清空原先的所有內容** 再寫入新的
:::

1. write

    ```python=
    infile = open(f+'text02.txt','w')
    infile.write('今天星期天。')
    infile.close()
    ```

2. writelines

    會一行一行寫入

    ```python=
    infile = open(f+'text03.txt','w')
    infile.writelines(['今天星期天。\n', 'Hello World\n', 'weee~\n'])
    infile.close()
    ```

3. writable

    回傳該檔案是否能進行撰寫

    ```python=
    infile1 = open(f+'text00.txt','r')
    infile2 = open(f+'text00.txt','w')
    print(infile1.writable())
    print(infile2.writable())
    infile1.close()
    infile2.close()
    ```

### 其他

1. 添加內容（不刪除原先內容）

    ```python=
    infile = open(f+'text04.txt','a')
    infile.write('新增的文字\n')
    infile.close()
    ```

2. 撰寫檔案

    使用 print 的 file 參數

    ```python=
    infile = open(f+'text05.txt','w')
    print('ㄚㄚㄚㄚㄚㄚㄚㄚㄚ', file=infile)
    infile.close()
    ```

3. tell

    回傳指針位置
    
    ```python=
    infile = open(f+'text01.txt','r')
    content = infile.read(10)
    t = infile.tell()
    infile.close()
    ```

4. seek

    - 移動指針位置
    - 函式：seek(a, b)
        >a 為偏移量， b 為起始位置
    
    ```python=
    infile = open(f+'text01.txt','r')
    content1 = infile.read(10)
    infile.seek(0, 0)
    content2 = infile.read(10)
    infile.close()
    ```

5. with
    
    會在執行動作結束後自行關閉檔案
    
    ```python=
    with open(f+'text06.txt', 'w') as infile:
      infile.write('hello')
    ```

:::info
**練習**

請寫程式建立一個檔案，並利用程式碼在檔案內撰寫文字（可以是這堂課的感想、建議或是什麼都行），上傳到資料夾
>[**資料夾連結**](https://drive.google.com/drive/folders/12JXvKVSa6xW3pC9d85UxaMFsP-YlR4VN?usp=sharing)
>可以署名也可以不用
:::

---

## 網路爬蟲 Web Crawler

1. 自動抓取網頁內容並分析、找到特定需要的資料
2. 流程：網頁的 URL -> 打開網址 & 存取內容 -> 分析、取得要的部分
3. 特色：省力、省時間，可以執行重複性高的工作

### 引入套件

```python=
# Request 送出請求；urlopen 用來開啟連結
from urllib.request import Request, urlopen
# 爬蟲的核心
from bs4 import BeautifulSoup
```

### 進入網站

```python=
# 台大電機的教授名單
url = 'https://web.ee.ntu.edu.tw/teacher_index_all.php'
# 傳送 request 給伺服器，相當於在搜尋欄打上網址
req = Request(url)
# urlopen 開啟連結內容 利用 read 讀進變數 decode 是把 bytes 轉成 string
html = urlopen(req).read().decode()
# 利用 BeautifulSoup 去解析成 html 檔案
bsObj = BeautifulSoup(html, "html.parser")
```

:::warning
如果網站有擋爬蟲的機制會出現 Error
可以利用以下程式偽裝成瀏覽器

```python=
req = Request(url, headers={ 'User-Agent': 'Mozilla/5.0 (Macintosh;Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/35.0.1916.47 Safari/537.36' } )
```

>User-Agent 可以按 F12 後找到 Network conditions
>
>按 F12 後找到叉叉旁邊的三個點
>![image](https://hackmd.io/_uploads/r11WWtJNC.png)
>
>點開選 More tools 裡的 Network conditions
>![image](https://hackmd.io/_uploads/HkINWKJ40.png)
>
>取消勾選 User browser default 就可以在 Custom... 裡選喜歡的 User-Agent
>![image](https://hackmd.io/_uploads/rJQrWty40.png)

:::

### 取得特定內容

>按 F12 可以看到網頁原始碼

1. find

會找到該標籤下第一次出現的內容

```python=
bsObj.find('tag')
```

2. get_text

利用 get_text 擷取文字內容

```python=
bsObj.find('tag').get_text()
```

如果是 class 就利用 `{}`

```python=
bsObj.find('tag', {'class':'class name'})
```

3. find_all

會找到所有該標籤下的內容，並包裝成 list

```python=
bsObj.find_all('tag')
```

>可以利用 for-loop 一一取出

:::info
**練習**

請撰寫一個程式列出所有教授的名字、email、職稱、研究專業

```
e.g.
戴邇立 thierryblu@ntu.edu.tw 專任教授 通訊與信號處理
張子璿 tchang9@ntu.edu.tw 副教授 奈米電子
張耀文 ywchang@ntu.edu.tw 特聘教授 計算機,電子設計自動化
陳政維 cwchenee@ntu.edu.tw 副教授 自動控制
陳景然 chenjim@ntu.edu.tw 專任教授 積體電路與系統,電力系統與電力電子組
陳中平 cpchen@ntu.edu.tw 專任教授 電子設計自動化,醫工
.
.
.
葉丙成 pcyeh@ntu.edu.tw 專任教授 計算機,通訊與信號處理,資料科學與智慧網路
顏嗣鈞 hcyen@ntu.edu.tw 特聘教授 計算機
于天立 tianliyu@ntu.edu.tw 副教授 計算機
```

```python=

```
:::