# 爬蟲、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