---
# System prepended metadata

title: 'Selenium 慢慢爬(2):簡易指令與操作網頁'

---

# Selenium 慢慢爬(2):簡易指令與操作網頁
第一部:https://hackmd.io/@gdw7l5sPTOyNv76kZ_twjA/H1X9Suinq


安裝完成之後來體驗一下 selenium 的基礎搜尋函數最後再來進行動態操作網頁以及簡單的爬取文章
## 基礎函數
### find_element
>* find_element：抓取符合條件的第一個項目。
>* find_elements：抓取所有符合條件的項目回傳成list。

可以直接使用函數指定選擇器
或是使用BY 指定選擇器
```=
from selenium import webdriver
from selenium.webdriver.common.by import By
# 抓取第一個
driver.find_element_by_id ("example") 
driver.find_element(By.ID, "example") 

# 抓取所有
driver.find_elements_by_id ("example") 
driver.find_elements(By.ID, "example")
```
### 選擇器
根據原始碼上的元素來指定選擇器
1. ID = id
1. CLASS_NAME = class_name
1. NAME = name
1. LINK_TEXT = link_text
href(帶有連結的屬性)對應的文字內容才行
![](https://i.imgur.com/NwIRU6H.png)

3. PARTIAL_LINK_TEXT = partial_link_text
類似於LINK_TEXT方法，但只需要部份文字即可
5. TAG_NAME = tag_name
使用HTML標籤名稱(即TAG)，來抓取網頁元素

![](https://i.imgur.com/SQB95P2.png)
但是使用TAG選擇器特別要注意的是，HTML標籤時常重複，因此TAG選擇器通常適用於抓取大框架的網頁元素再做細部搜尋。

7. XPATH = xpath
容易失敗，不建議使用


## 自動搜尋網頁關鍵字並爬取標題
以dcard為例
### 1.創建py檔並獲取webdriver的位置
```bash=
from selenium import webdriver

PATH="windows中 webdriver的位置"#若與py檔放在同一個資料夾中就可以不用

driver = webdriver.Chrome()
```
### 2.獲取網頁網址
get可以讓瀏覽器連接上該網址的網頁
```bash=
#連接上dcard
driver.get("https://www.dcard.tw/f")
```
### 3.在搜尋欄打上關鍵字
檢視網頁的原始碼
於搜尋欄的位置按下右鍵並點擊檢查就會跳出原始碼
![](https://i.imgur.com/Ojj2qaK.png)

會顯示許多tag 這裡使用class name 作為尋找的元素
![](https://i.imgur.com/DEak4ZR.png)

>* find_element(tag,名稱):尋找元素
>* send_keys(): 打上關鍵字
```bash=
element = driver.find_element('name','query')
element.send_keys('板橋美食')
```
### 4.操作鍵盤指令送出關鍵字
需要使用鍵盤指令要 import keys
常用的指令:
send_keys(Keys.BACK_SPACE) #刪除鍵（BackSpace）
send_keys(Keys.SPACE) #空格鍵(Space)
send_keys(Keys.TAB) #製表鍵(Tab)
send_keys(Keys.ESCAPE) #回退鍵（Esc）
send_keys(Keys.ENTER) #回車鍵 Enter）
send_keys(Keys.CONTROL,'a') #全選（Ctrl+A）
send_keys(Keys.CONTROL,'c') #複製（Ctrl+C）
send_keys(Keys.CONTROL,'x') #剪切（Ctrl+X）
send_keys(Keys.CONTROL,'v') #粘貼（Ctrl+V）
send_keys(Keys.F1)  #鍵盤 F1
send_keys(Keys.F12)  #鍵盤 F12

```bash=
from selenium.webdriver.common.keys import Keys

element.send_keys(Keys.RETURN)#按下enter鍵的意思
```
### 5.爬取文章標題
先觀察標題的原始碼是否有相同之處
這裡的標籤class name 都是相同的，可作為共同元素
>* 尋找多相同標籤的元素:.find_elements_by_class_name('class name')
>* 顯示內文:.text
![](https://i.imgur.com/oMv068a.png)

```bash=
titles=driver.find_elements_by_class_name('sc-8fe4d6a1-3')

for title in titles:
    print(title.text)
#停留10秒    
time.sleep(10)
#關掉視窗
driver.quit()
```
### 6.修正跳轉問題(1)
網頁從首頁跳到搜尋頁面需要跳轉時間
會造成爬搜尋頁面的標題時出錯
可以再跳轉後 爬蟲前稍作停留等待跳轉結束再開始爬蟲
```bash=
element.send_keys(Keys.RETURN)#頁面跳轉需要時間
time.sleep(3)#停留3秒再繼續
for title in titles:
    print(title.text)
time.sleep(10)
driver.quit()
```

### 7.修正跳轉問題(2)
設定停留時間是可行的方法，但是每次的跳轉時間不同，此種方法比較浪費時間
使用wait until 讓跳轉後的特定資訊出現時就接續後面的流程，減少不必要的等待時間
```bash=
#wait until所需的module
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

element.send_keys(Keys.RETURN)#頁面跳轉需要時間
##等待瀏覽器一定的時間直到某元素出現
WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CLASS_NAME, "sc-f860e6e9-1"))
    )
titles=driver.find_elements_by_class_name('sc-8fe4d6a1-3')

```
### 完整code

```bash=
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
PATH="C:/Users/tkbuser/Desktop/workplace/selenium/chromedriver.exe"
driver = webdriver.Chrome()
driver.get("https://www.dcard.tw/f")
element = driver.find_element('name','query')
element.send_keys('板橋美食')
element.send_keys(Keys.RETURN)#頁面跳轉需要時間

##等待瀏覽器一定的時間直到某元素出現
WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CLASS_NAME, "sc-f860e6e9-1"))
    )
titles=driver.find_elements_by_class_name('sc-8fe4d6a1-3')
# titles=driver.find_elements_by_class_name('sc-8fe4d6a1-3')
for title in titles:
    print(title.text)
time.sleep(10)
driver.quit()
```
