---
# System prepended metadata

title: 基本爬蟲
tags: [Python]

---

# 基本爬蟲
阿巴阿巴，挺有趣的學一下
[TOC]
## 安裝必要套件（如果尚未安裝）：
1. 打開 VS Code。
2. 開啟終端機：
* Windows/Linux：Ctrl + (也就是 Ctrl + 反引號)，或使用選單 [檢視] → [終端機]。
* macOS：Cmd + 。

3. 在終端機中輸入以下指令（可複製貼上）：
```
pip install requests beautifulsoup4
```
----
### 如果出現：'pip' 不是內部或外部命令、可執行的程式或批次檔。
那就是在安裝時沒有 **勾選 "Add Python to PATH"！**
![image](https://hackmd.io/_uploads/SJSJS22xxx.png)
刪掉python重新安裝。。。。

## 載入方法
```python=
import requests
from bs4 import BeautifulSoup
```
## 基本爬蟲程式範例
```python=
import requests
from bs4 import BeautifulSoup

# 1. 發送請求（GET）
url = 'https://example.com'
response = requests.get(url)

# 2. 檢查請求成功
if response.status_code == 200:
    html = response.text  # 取得 HTML 原始碼

    # 3. 解析 HTML
    soup = BeautifulSoup(html, 'html.parser')

    # 4. 找出特定標籤
    title = soup.find('h1')  # 找第一個 h1 標籤
    print("標題：", title.text)

    # 找所有超連結
    links = soup.find_all('a')
    for link in links:
        print("連結文字：", link.text)
        print("連結網址：", link['href'])

else:
    print("請求失敗，狀態碼：", response.status_code)
```
## 各類語法
| 名稱                | 用法說明                  |
| ----------------- | --------------------- |
| `requests.get()`  | 發送 GET 請求             |
| `response.text`   | 回傳網頁原始碼（文字）           |
| `BeautifulSoup()` | 用來解析 HTML 的工具         |
| `soup.find()`     | 找第一個符合條件的標籤           |
| `soup.find_all()` | 找所有符合條件的標籤，會回傳 list   |
| `tag.text`        | 標籤中的純文字               |
| `tag['href']`     | 取得 `<a>` 標籤中的連結屬性（網址） |

## 注意事項
有些網站會反爬蟲，可能要加上 headers 模仿正常使用者：
```python=
headers = {'User-Agent': 'Mozilla/5.0'}
response = requests.get(url, headers=headers)
```
有些資料不是 HTML 裡，而是 JavaScript 動態載入，要用 Selenium 或 API 擷取。
## 常用解析方法（BeautifulSoup）
### 1. 使用 .find() 和 .find_all()
```python=
soup.find('div')                    # 找第一個 <div>
soup.find_all('div')               # 找所有 <div>
soup.find_all('a', class_='link')  # 找所有 class 為 link 的 <a>
```
### 2. 使用 .select() 搭配 CSS 選擇器（功能強大）
```python=
soup.select('div.content > h2')   # 選擇所有位於 .content 裡的 h2
soup.select('.title')             # class 為 title
soup.select('#main')              # id 為 main
```
| 方法 / 屬性                | 說明          |
| ---------------------- | ----------- |
| `.text`                | 取得純文字       |
| `.get('href')`         | 取得某屬性值，如超連結 |
| `.attrs`               | 取得所有屬性為字典   |
| `.parent`              | 取得父節點       |
| `.children`            | 回傳子節點生成器    |
| `.find_next_sibling()` | 下一個兄弟節點     |

## 加入 headers、參數、cookie
### 模擬正常瀏覽器
```python=
headers = {
    'User-Agent': 'Mozilla/5.0',
    'Referer': 'https://example.com'
}
response = requests.get(url, headers=headers)
```
### 傳送參數
```python=
params = {'q': 'python'}
requests.get('https://www.google.com/search', params=params)
```
### 模擬登入、維持 cookie
```python=
session = requests.Session()
response = session.get(url)  # 後續請求可自動攜帶 cookie
```
## 加上等待與延遲（避免被封）
```python=
import time
import random

time.sleep(random.uniform(1, 3))  # 隨機延遲 1~3 秒
```
## 常見錯誤處理
```python=
try:
    response = requests.get(url, timeout=5)
    response.raise_for_status()  # 自動丟出 HTTPError
except requests.exceptions.RequestException as e:
    print("錯誤發生：", e)
```
## 補充工具
| 工具名          | 功能                     |
| ------------ | ---------------------- |
| `lxml`       | 更快速的 HTML/XML 解析器      |
| `re`         | 正規表達式，搭配 `.text` 做文字分析 |
| `pandas`     | 做表格化儲存與分析爬下來的資料        |
| `csv`、`json` | 儲存資料到檔案                |

## 存成 CSV 檔範例
```python=
import csv

with open('data.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.writer(f)
    writer.writerow(['標題', '連結'])  # 標題列
    writer.writerow(['Python教學', 'https://example.com'])
```
