# 爬蟲、MySQL串接及使用、整理數據
## PTT Brain 爬蟲
經過爬蟲後找到
"https://pttbrain.herokuapp.com/api/ptt/user/icolee/dailyActivitiesDetails?at=2021-07-10"
這個檔案為json檔,Json檔為javascript用來儲存資料的格式,可以利用JSON Formater來將檔案結構重新整理。
爬這個網站的邏輯是先將該網站的html讀下來
使用的套件是requests
```
import requests
url="https://pttbrain.herokuapp.com/api/ptt/user/"+self.users+"/dailyActivitiesDetails?at="+i
response = requests.get(url)
response.encoding="utf-8"
list_of_dicts = response.json()
```
使用url將網址儲存後
requests.get(url)可取得網址內的html內容
若需要進一步的分析則需使用beautiful soup,但這裡的網址只有簡單的文字,使用requests即可
### 決定是用get還是post是由該網站的網頁讀取方式決定。
打開chrome的檢查->Network->ctrl-R->點該網站的html檔->找到header內容->看Request Method
![](https://i.imgur.com/2V2jdZX.png)
response.encoding="utf-8" 代表網站用utf-8進行解碼
可讀取網頁中的中文字,使用錯誤的編碼進行讀取的話會產生亂碼
用requests中的json()方法讀取html中的json內文,該function會將json以list方式儲存
### List
一個list內可以儲存不同type的資料,利用list[i]即可進行查找list內的資料
```
list1 = ['physics', 'chemistry', 1997, 2000]
list2 = [1, 2, 3, 4, 5 ]
list3 = ["a", "b", "c", "d"]
print(list1[0]) //phisics
print(list2[4]) //4
```
### 資料儲存至MySQL
```
result.append(push[k]["user_id"])
...
```
建立一個list,將想要儲存進行分析的資料存在list中,之後可依序放入MySQL
#### 空list宣告
```
list1=list()
```
#### 增加list內元素
```
list.append('apple')
```
#### 特殊用法stripe()
stripe是一種可以針對sting進行切割的function,在這裡用在取得list內資料後,將時間進行切割
原本的時間為2021-07-10T11:12:00.000Z
```
result.append(push[k]["datetime"].strip()[:10])
```
代表針對datetime這項只取0~9的字元,也就是2021-07-10
[:10]代表從0到9
```
result.append(push[k]["datetime"].strip()[11:19])
```
代表針對datetime取11至18字元,也就是取得11:12:00
#### 資料庫連結
首先先利用MySQL WorkBench建立一個pttcraw 資料庫
![](https://i.imgur.com/EEDi1ri.png)
輸入資料庫名稱,其餘都設定為Default
![](https://i.imgur.com/EdqShoh.png)
```
db_setting={
"host":"127.0.0.1",
"port":3306,
"user":"root",
"password":"*****",// 輸入下載時設定密碼
"db":"pttcraw",
"charset":"utf8"}
```
python檔中加入這串文字以連結目標資料庫pttcraw
#### 資料庫操作
```
try:
conn=pymysql.connect(**db_setting)
with conn.cursor() as cursor:
sql="""INSERT INTO pushrecord(
userid,
date,
time,
article_title,
content,
board,
author,
tag,
floor)
VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s)"""
cursor.execute(sql,result)
conn.commit()
except Exception as ex:
print("Exception:",ex)
```
- 在try的部分,利用pymysql 套件連結MySQL,而後使用cursor() 注入想要執行的指令
- 在這裡sql儲存一段SQL指令,其內容是string
- result內儲存依序排好的資料(用list儲存),該list長度必須和column數一致
- 最後將指令commit()
- 另外,若有出現錯誤則會跳Exception
```
sql="""SELECT date,time FROM pushrecord where userid=""" +"\""+user+"\""
```
- SELECT col名稱 FROM Table名稱 WHERE col1名稱=''
- 上述可以搜尋指定userid的列,但是由於WHERE部分,須表示為userid="icolee"這樣的形式,若沒有左右雙引號無法執行,因此在user前後加入"\"",可讓sql的sting 顯示出"
https://leemeng.tw/practical-pandas-tutorial-for-aspiring-data-scientists.html
https://medium.com/ccclub/ccclub-python-for-beginners-tutorial-533b8d8d96f3
https://blog.csdn.net/ztf312/article/details/102474190
https://seaborn.pydata.org/generated/seaborn.heatmap.html