圖7
圖7
實習期間完成之進度
焦榮安:
老師開學後兩周開始叫我們練習自己選一個PTT版然後爬該版的所有東西,抓到以後再轉成JSON檔,於是我選了家庭版,我把這次爬蟲作業分四部分。
1.主頁:就是所謂標題的部分,以及隱藏在標題裡的網址,因為假如要知道該標題的內容是要用滑鼠點該標題的,所以在標題裡還藏了一個網址,因為title網址的標籤是” a”,所以在程式後面加”a["href"]”就可以找出來啦。
圖17
圖18
2.該標題文章內容:總共要爬的有作者名字、發文時間、內文、留言推數和噓數、留言的內文、留言的人以及時間這幾個要抓到。作者名字、發文時間都是屬於比較簡單的部分,因為他們的格式和數量都是固定,內文的抓取就會有點難度因為要去除上面的標題部分跟留言部分。
圖19
圖20
至於留言的推與噓數量,就是要判斷這些留言。所以我設了for迴圈去判斷整個留言然後再計算出來,算出來的結果就可以回傳回去了,下圖21為程式碼。
圖21
圖22
留言的部分應該是最難的,因為一開始要知道到底有幾則留言,才能去設for迴圈抓取想要的部分,要不然會一直出現”out of index”。我抓完每一筆都存入list並轉成json回傳回去,上圖22為抓留言程式碼。
3. 多頁爬取:
當可以爬完首頁的所有標題跟內文的時候,就可以開始爬很多頁數了。所以我需要把用到”上頁”的網址,這樣就可以抓下來囉。
圖23
圖24
4.把全部資料轉成JSON檔:按照老師的要求,把資料變成JSON檔,並且存到名叫”abc”的檔案中。圖26就是這次的結果,這樣第一份工作就大功告成。
圖25
圖26
黃榆程:
1.寒假期間:
一開始老師先叫我們找我們專題要做什麼樣的主題,在想的過程中老師請我們先練習網路爬蟲,並以PTT為範本進行爬蟲,以PTT為範本是因為PTT的網頁結構是簡單的,所以很適合用來讓我們摸索網路爬蟲這個領域。
圖27為ptt論壇的babymother版。
圖27
圖28為標題是”長牙牙齒大小”此篇文章的網頁原始碼,不只有標題,可以看調關於此篇文章的更多資訊,如:作者、日期、推文人數等。
圖28
圖29
再來進到內頁,可以看到有更多資訊,如:文章內容、留言者的ID、留言內容,
如圖29左方,圖29右方為文章內頁中的網頁原始碼
圖30為抓取標題、作者、發文日期資訊的程式碼,以標題(title)為例,尋找網頁中標籤為”div.article-metaline”中的”span.article-meta-value”抓取到資料之後再把資料中的文字(text)存入title的陣列當中。
圖30
圖31
圖31為抓取留言者ID、留言時間、留言內容的程式碼,以留言者ID為例,利用find_all可以找出此網頁中所有標籤為”span”中的”class”為” f3 hl push-userid”的資料,下面的for迴圈則是把抓取到的資料中的文字(common_userid.string)存到allcommon_userid的陣列當中
圖32為抓取文章內容的程式碼,利用find可以找出此網頁中標籤為”id”的”main-content”的資料,再下面的程式碼則是過濾掉網站中自行加入的” ※ 發信站: 批踢踢實業坊(ptt.cc), ”的文字。
圖32
圖33
圖33為抓取文章的推、噓並計算有幾個的程式碼,利用select可以找出此網頁中標籤為”div.push”中的”span.push-tag”的資料,下面的程式碼則是判斷抓取的到資料為推、噓或是 → 並計算各有多少個
圖34為將抓取到的資料存成一個字典(dictionary)的型態並輸出成JSON格式
圖35為輸出後的JSON格式
圖34
圖35
2. 1082學期開學至今:
開學後,我們開始朝我們訂定的目標邁進,為了統整育兒相關網站的資料,開始尋找育兒相關的網頁,並爬取網頁中的資料以建立我們網站所需的資料庫。老師要求我們每個人各自尋找幼兒相關網站,並各自爬取網站的資料,等資料收集完畢後,開始討論我們要如何分析抓取到的資料。
圖36為我負責的網站”babyhome”,我之所以會選擇這個網站是因為,它有明確的分類文章的類別,而且使用者多,個類別的文章也都有持續更新,官方的發文也會提供一些和育兒有關的相關法規,因此我覺得這是很好的資料來源。
圖37為babyhome的討論版第一篇文章的網頁原始碼。
圖36
圖37
圖38為將上述網頁的資料爬取後輸出成json格式的檔案,大部分的程式碼大多都和之前爬取ptt的差不多,找出想要爬取的資料,找出資料所在的標籤,再把資料中的文字轉到json格式的檔案,不同的是”babyhome”的網頁架構比起ptt較複雜一些,需要利用迴圈等方式讓程式自動換頁或抓其他分類的文章等
圖38
鄭云瑄:
1.寒假期間:
在放寒假前,楊老師有請我們在放假期間練習Python爬蟲,因此我在寒假期間以PTT的美妝版當作我的練習網頁,用Python語言中「Requests」套件, 將美妝版上看板中可見的所有資訊(如:文章的標題、作者、內容、留言、網址)擷取下來,再透過Python將所抓下的資料暫存Dictionary字典,匯入List串列中,並且匯出成Json格式的暫存檔案。而我在這之外,也在程式中建立一個引擎連接MySQL,將抓取下來的結果同時匯出到資料庫中儲存。
圖39、40為部分程式碼。
圖39
圖40
2.1082學期開學至今:
開學後,我們便將寒假所作的PTT練習更加延伸,在例外處理部分作更多的除錯和優化,以及儲存檔案格式的多層作修改。在PTT的練習告一段落之後,我們與楊老師決定了專題的大方向-嬰幼兒相關資訊的彙整網站,於是就在網路上各自找了一個有關於嬰幼兒資訊的網站,將網站中相關的文章內容(如:文章的標題、作者、內容、留言、網址)都抓下來,並且一樣透過Python將所抓下的資料暫存Dictionary字典,匯入List串列中,並且匯出成Json格式的暫存檔案。
圖41為程式部分檔案。
圖41
蒙宗凌:
從一開始從未接觸Python到現在可以用selenium寫出自動操縱的網站,看似簡單其實也沒想像中簡單。最一開始要學習基礎Python外,爬蟲是一個你需要了解你要抓取的網站是如何運作的。雖然我們每天一定都會上網,點開網站,看看影片、文章、玩遊戲,但其實後面他是如何運作或是他可能運用了JavaScript去操控或是單純的Html都是有可能的,所以要爬一個網站不僅要學會如何寫程式碼,你還要會去看他的原始碼是如何運作的,然後從中去抓取你要的資料的標籤或是其他可以當作指標性的東西讓程式可以精準抓到你所需要的資料。
圖42為網站內容,爬蟲之前都需要打開網站的原始碼來了解一下
圖42
爬蟲程式是自動化抓取網頁內容的程式,在學習的過程中,總是會有需要從網頁複製貼上的動作,有時候十筆,但…如果是幾萬筆呢,就要透過爬蟲程式,去加快速度。
圖43
但有時候我在抓資料上都會出現一些問題就是。例如:可能大量抓取可能會被網站擋住,這是後就需要利用time.sleep去讓程式在for迴圈內去計算跑多久要休息,不然一次抓取大量資料對對方的伺服器造成負擔會被鎖IP之後就無法抓取他們的資料,因為伺服器可能會認定你為DDos阻斷式攻擊,所以我們就需要上述提到的sleep去休息一下。圖44是我們如果運用爬蟲,實際上網路的概念是如何
圖44
再來還可能會面臨,明明是同一個網站或是正確的路徑,抓下來的東西去完全不一樣或是無法非常精準去抓取我們真正需要的部分,這時候可能就需要用特別的方法去解決,而方法會根據網站內容有所不同,這也是目前爬蟲下來,最大的問題所在。
像這次我抓的網頁,如果不模仿使用者去開啟網頁的話,就抓取不到他網頁的資料,所以不能用一般的requests去請求網站,而是要用selenium 中的chrome driver去模仿我們人點開網站的方式去抓取網頁的資訊。
圖45為我爬蟲中需要用到較為特別的方式去抓取的部分-selenium
圖45
圖46為正常使用request就可以抓到資料的部分
圖46
當初在合併request跟selenium的時候遇到非常多的問題,例如 : chrome driver無法讀取到request傳過來的網址或是 chrome driver 讀取過久所以會強制把網頁關掉當作沒這筆資料存在,但都被我一一上網找方法解決。
接下來,因為大家第一個網站的爬蟲資料都抓得差不多,所以我也慢慢地開始去學習HTML+CSS+Javascript,畢竟接下來是要分別要將資料存進資料庫,然後架設我們的網站來呼叫資料庫。