# Python 爬蟲 - 自主實作 ## Step 1:選定網站 選定的網站要有以下兩個特性 - 目標資訊量多 - 資料排序有規律 ### 網站推薦與主題 - **大數據網站** - **交通部中央氣象署** 每日雨量 雨水ph值 每日紫外線 最近地震... ![image](https://hackmd.io/_uploads/rkL6rUAQA.png) - **Goodinfo台灣股市資訊網** 公司每日成交價、日期、漲跌幅... ![image](https://hackmd.io/_uploads/B1ZGUIAQA.png) - **University-TW** 113年個人申請 各校不採計國文的科系、各系招收名額... ![image](https://hackmd.io/_uploads/SyDBU8AXR.png) - **購物網站** - **yahoo** - **pchome** - **momo** 比價、同類型產品整理、人氣商品... - **社群媒體** - **PTT** 下載圖片、文章、留言... 依照日期、熱度整理文章 - **Youtube** 下載特定撥放清單中的影片、影片標題、留言、影片資訊... 依照日期、讚數、留言數整理影片 - **巴哈姆特** - **Dcard** - **...想想看還有什麼網站吧** ## Step 2:觀察網頁 ### 1.無痕模式 不管是requests還是selenium 在爬取網頁時 是**沒有使用**你瀏覽器中儲存的帳號、密碼、cookies,甚至是headers。 所以盡量使用**無痕模式**觀察你想要爬取的網頁 以盡量最乾淨的瀏覽器去觀察你的網頁 以免你在觀察網頁時,電腦會自動使用已儲存的cookies或自動登入 造成你撰寫爬蟲時有可能找不到問題 > 點擊瀏覽器右上角的選單,選取 " 新增無痕視窗 " ![image](https://hackmd.io/_uploads/Hkw6b8RX0.png) ### 2.開發人員工具 利用**開發人員工具**來觀察網頁原始碼 檢查網頁編碼是否為 UTF-8 或是其它編碼 根據所學知識判斷能否爬取成功 > 對要觀察的網頁點擊右鍵,選取 " 檢查 " ![image](https://hackmd.io/_uploads/r1HLzIRmR.png) ### 3.靜態 & 動態 網頁 * **靜態網頁** 沒有後台的網站頁面 單純使用HTML、CSS與JavaScript組成 它不必跟後端資料庫請求資料 屬於**不太需要經常修改**的頁面 ![image](https://hackmd.io/_uploads/BJrT-YkNC.png) > 如形象頁面、公司簡介、活動頁面…等等的展示型頁面 * **動態網頁** **有後台**的網站頁面 可以到後台去新增、編輯或修改前台的資料 它可允許使用者根據需求取得網站資料庫的資料內容並與網站進行互動 ![image](https://hackmd.io/_uploads/B1ynLdkN0.png) > 如線上論壇、電商網站、會員功能、購物車、搜尋、檢索… ### 4.Requests - headers:是檢測反爬蟲的第一步,所以一開始就使用自己的headers幾乎是必要的 - cookies:可依據各網頁不同的需求改變 > 可查看**第三天下午**的講義 ### 5.Selenium 從進入網站開始 要記住你的滑鼠與鍵盤的每個動作 直到你找到你的目標資料 這些動作是你的必要操作。 > 如:滾輪、按按鈕、輸入... > 可查看**第二天下午**講義 ## Step 3:取得資料 ### Requests 1. 利用 **HTTP 方法**,取得該網頁的 response 物件 ![carbon (5)](https://hackmd.io/_uploads/BJZEmKkER.png) ### Beautiful Soup 1. 從 response 物件取得該網頁的 HTML 並以 Beautiful Soup 解析 ![carbon (6)](https://hackmd.io/_uploads/BJzFXK1EC.png) 2. 以 **對象種類** 或 **搜索文檔樹** 取得特定資料 ![carbon (7)](https://hackmd.io/_uploads/B17f4YkNR.png) >詳細用法可查看**第二天上午**講義 ### Selenium 1. **開啟driver** ![carbon (8)](https://hackmd.io/_uploads/rJzH4t1NC.png) 2. **取得網頁元素** find_element(搜尋方法, 名稱)、find_elements(搜尋方法, 名稱) ![carbon (2)](https://hackmd.io/_uploads/S1faBmlVA.png) **Bonus.** css selector 用法 可以最精確、最精簡的方式找到 element | 標籤元素 | 前綴符號 | | ------- | --------| | Tag | 無、空格 | | id | # | | class | . | Tag放最前面 後方的 id 或 class 之順序可隨意 >例 >![image](https://hackmd.io/_uploads/S119MQlNA.png) >![carbon (3)](https://hackmd.io/_uploads/Hk7M8Xg40.png) > > >![image](https://hackmd.io/_uploads/HkplBXg40.png) >![carbon (4)](https://hackmd.io/_uploads/SkUpUmg4A.png) 3. **操作網頁元素** ![carbon (11)](https://hackmd.io/_uploads/SkBwfsJVC.png) 4. **取得網頁元素的內容** >例:text = element.text >Selenium詳細用法可查看**第二天下午**講義 ## Step 4:撰寫程式 **記得先創資料夾!!!在vscode裡開啟資料夾後再新增檔案!!!** **所有檔案名字要是英文!!!** **使用Selenium記得下載webdriver!!!** >詳細下載方式可查看**第二天下午**講義 ### 1.引入函式庫 ![carbon](https://hackmd.io/_uploads/r12lxmgE0.png) 詳細用法請查看先前的講義 第二天上午:requests、BeautifulSoup 第二天下午:selenium、By、ActionChains、Select、time 第三天上午:Keys、csv 第三天下午:Workbook 第四天上午:Youtube、BarChart、BarChart3D、Reference ### 2.變數命名 ![carbon](https://hackmd.io/_uploads/BJYPbdyVA.png) ### 3.迴圈 目標網站有一個特性是**資料排序有規律** 在撰寫程式的時候很常會使用 find_all() 或是 find_elements 來回傳一個串列 可以多利用迴圈來有效率的執行程式 ### 4.陣列 可以多利用**二維陣列**或**更高維的陣列**來儲存資料 用來分類爬得的資料 ![image](https://hackmd.io/_uploads/rJDPDLRXR.png) ### 5.函式 * 有重複的複雜操作,可以使用函式來簡化、重複利用程式碼 * 可以分割程式碼,增加程式碼的可讀性 ### 6.debug debug是每個寫程式的人的噩夢 為了避免程式寫完後出現bug 你要在茫茫大海的程式碼中找到錯誤 想想就很頭疼 要解決這個問題,我們可以在寫程式的**過程中**就檢查程式碼有沒有錯誤。 >例1: >response = request.get(url) >在這一步可以就先把response.text 給print出來 >看看是否是該網頁的HTML >例2: >將程式中執行的動作(如:開啟網頁、按下按鈕、取得網頁資料...) >輸出在console中,可有效率的追蹤程式執行的動作 ![image](https://hackmd.io/_uploads/BJOox7eEA.png) ## Step 4:資料呈現 ### 將分類好的數據寫入csv或excel使資料更視覺化 * **csv** ![carbon (3)](https://hackmd.io/_uploads/B1Ui3_JE0.png) >詳細用法可查看**第三天上午**講義 * **excel** ![carbon (4)](https://hackmd.io/_uploads/BJ3Qa_JVR.png) >詳細用法可查看**第三天下午**講義 ### 將圖片或影片下載到資料夾內並整理好路徑 >詳細用法可查看 >**第二天上午**講義中的**下載圖片** >**第二天下午**講義中的**screenshot** >**第四天上午**講義中的**下載發燒影片** ## 回饋表單 https://forms.gle/SzxKvubCXaQe9FVG7 ![image](https://hackmd.io/_uploads/rkUgot1NR.png)