# 來點自己的小工具吧(我大爬蟲篇)
> Request/Selenium
> Fan Kang Ting
---
### 還記得Axios?
[自家講義](https://hackmd.io/@fan9704/rkIdAlbFY)
```javascript=
let url="..."
let config={
user:"Little fish周咏陞"
spydog:true
}
this.axios.post(url,config)
.then((res)=>console.log(res.data))
.catch((error)=>console.log(error))
```
----
### 當然Axios適用於JavaScript上黑
那同樣今天要用的請求工具適用在Python上(Request/Selenium)
----
補充:事實上在使用JSON格式的資料時要先解析/字串化=>
- 解析 JSON.parser(JSON本人)
- 字串化 JSON.stringfy(JSON本人)
你是不是想說之前在實作的時候明明都不需要用到他阿 我看都沒看過
不!!!
----
那是因為AXIOS這個Module 的資料會自動轉換
方便多了
---
### 建立觀念
[參考資料 關於httprequest](https://yakimhsu.com/project/project_w4_Network_http.html)

簡單來說你從瀏覽器看到網頁是需要使用GET Request才能看到的
----
##### 認識一下常見的Http Method
比如我們常在建立資料Router時常見的CRUD
分別代表POST,GET,PUT,DELETE

[各種http method](https://developer.mozilla.org/zh-TW/docs/Web/HTTP/Methods)
其中POST(新增)跟PUT(修改)是可以夾帶參數的 通常我們會把參數寫成JSON config
----
###### 備註UPDATE
CRUD的U(update)
可以是PUT或是PATCH
通常意義上
PUT是指大範圍的UPDATE(比如整組資料修改)
PATCH指小範圍的UPDATE(比如修改某個欄位修改)
---
### 你可能會覺得? 為甚麼不都用POST就好
因為在Web Service後端設計上,通常我們要操作Model(資料模型)的使用方法會寫在同一個Class(類別)上
----
##### 假如都使用POST去來進行UPDATE會發生甚麼事情呢?
1. 你必須建立另一個Class
2. 建立額外的路由(Controller/Router)
3. 程式碼不簡潔(忌諱)
4. API代理問題
5. 還有很多問題 這裡就不多說
---
### Http status code
>蝦 沒聽過?!
>不可能 至少你有看過
----
##### 範例
Google掛掉的時候 你就會看到了

黑對 404(No Found)就是其中之一
----
##### Staus Code概欄

----
##### 常見 statuscode

---
### 額外介紹 Postman
後端測試的好捧由
[Link](https://www.postman.com/)
----
### 了解了嗎? 正題開始
---
### 安裝Requests 與Selenium
這裡順便提一下pipenv
```bash=
pip3 install pipenv #安裝pipenv
mkdir request_train #建立專案資料夾
cd requset_train
pipenv install #pipenv初始化專案資料夾
pipenv install requests #用pipenv install 即可安裝至Local
pipenv install selenium
pipenv install webdriver-manager
```
----
### 建立main. py
順便提一下我們主程式的進入點
讓你的main.py長這樣
```python=
import requests
from selenium import webdriver
def main():
pass
#程式進入點
if __name__ =="__main__":
main()
```
----
### 使用基本功能
```python=
import requests
from selenium import webdriver
from bs4 import BeautifulSoup#注意這個 pipenv install bs4
def main():
url="https://www.ptt.cc/bbs/MobileComm/index.html"#需要操作的網址
r = requests.get(url) #將網頁資料GET下來
soup = BeautifulSoup(r.text,"html.parser") #將網頁資料以html.parser 這裡有使用BeautifulSoup 套件大家也可以安裝看看 雖然我平常不用
sel = soup.select("div.title a") #取HTML標中的 <div class="title"></div> 中的<a>標籤存入sel
for s in sel:
print(s["href"], s.text)
#程式進入點
if __name__ =="__main__":
main()
```
----
### 算了還是請大家裝一下 bs4好了
```bash=
pipenv install bs4
```
----
### 當然前面的範例只是GET 當然其他方法也適用
假設我使用 需要夾帶參數的POST
```python=
payload={ #須送之參數
'from':'/bbs/Gossiping/index.html',
'yes':'yes'
}
requests.post("https://www.ptt.cc/ask/over18",data=payload) #將參數寫至data
```
----
### 阿這有甚麼厲害的嗎
----
### 答案 沒有
不過好玩的來了
---
### Selenium
----
### 啥東西?
他可以模擬你瀏覽器的一切操作 也就是人家說的爬蟲腳本機器人的重要製作工具之一
----
### 使用他前 需要把電腦上的瀏覽器更新到最新(建議)
並且下載Web driver (模擬瀏覽器的引擎)
[Chrome Driver引擎載點](https://chromedriver.chromium.org/downloads)
找到你適合得版本
----
### 將你的Python File跟Chrome Dirver放在同一目錄下(或者設定路徑)
操作範例
```python=
# !/usr/bin/python
# coding:utf-8
from selenium import webdriver
from selenium.webdriver.support.ui import Select,WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import requests
from bs4 import BeautifulSoup
import io
import time
drivePath="C:\\Users\cxz12\Downloads\chromedriver.exe"#chromedriver path
browser=webdriver.Chrome()#open browser
for i in range(0,1000):
if(i<100):
if(i<10):
i=("00"+str(i))
else:
i=("0"+str(i))
url="http://140.125.95.10/term1102/network/homework/doc/p6.docx"+str(i)+".doc"
# url="http://140.125.95.10/term1101/phpdb/practice/doc/p14"+str(i)+".doc"
browser.get(url)
```
----
### 就這樣而已? 你錯了還可以搞很多東西
就交給各位探索拉
{"metaMigratedAt":"2023-06-16T17:23:43.619Z","metaMigratedFrom":"YAML","title":"來點自己的小工具吧(我大爬蟲篇)","breaks":true,"contributors":"[{\"id\":\"4c8f8799-9dcd-430b-b7bc-8a5156d39d0b\",\"add\":4128,\"del\":72}]"}