Python爬蟲練習日記 01 – 簡易PTT爬蟲(Requests + BeautifulSoup)

ptt joke板
ptt joke板

最近參加了一個機器學習的線上課程,一腳踩下去才發現事情不是憨人想得這麼簡單,那個號稱新手也可以輕鬆入門的課程,根本就預設所有人都是Python和統計老手。於是乎高中數學被當的慘不忍睹 + Python超級初心者如我,在被荼毒了幾個禮拜之後,終於發現應該要來打基礎了,順便逼自己寫文章。

雖然標題打了01,但也不知道會不會有02,ㄏㄏ

我覺得要厚顏無恥的從最基本開始練習,因為一直以來都沒有好好的去了解自己到底在寫三小,每次都各種在Github和Stackoverflow複製貼上,所以這邊也當作自己的學習筆記唄。這次就以爬取PTT joke板作為範例。

首先,抓東西前要知道自己到底要抓啥,剛剛提到要來抓PTT Joke板的資訊,所以先去找到PTT joke板的網頁版url如下:https://www.ptt.cc/bbs/joke/index.html

現在可以看到,現場有三個比較明顯的東西可以抓:標題、作者、日期,因為等下抓的時候要知道他在頁面上的位置,所以我們用Chrome開發者工具看一下要怎麼抓他們。

可以看到標題所使用的class是title,以此類推,作者是author,日期是date,然後他們都被包在r-ent裡面。以上就是這次所需要的所有資料,接下來就可以來寫爬蟲了。

總之先抓個Requests模組壓壓驚,使用requests.get來抓取目標頁面,這樣就抓完了。

import requests
 res = requests.get('https://www.ptt.cc/bbs/joke/index.html')

不過因為我們想要知道裡面的資料,所以抓完之後還要解析他,不然他只會把整個頁面的html都印出來給你,這個時候我們需要的是BeautifulSoup。我以前一直以為BeautifulSoup是爬蟲本人,後來才發現原來它的功能其實是用來解析爬下來的東西。

現在我們把爬下來的html,用BeautifulSoup解析出來,然後存在soup變數中。

import requests
 from bs4 import BeautifulSoup
 res = requests.get('https://www.ptt.cc/bbs/joke/index.html', verify=False)
 soup = BeautifulSoup(res.text)

現在從網頁抓到資料了,接下來就是把想要的資料挑出來,回到最一開始,已知我們要的資料
標題:title
作者:author
日期:date
都被包在r-ent裡面

這時候使用soup.select來抓取這些資訊,它的用法有點類似Javascript裡的querySelector,搭配上For迴圈來抓出頁面上所有的指定元素。另外,因為抓出來的型態會是List,而List不能抓text出來,所以要用[0]去抓第一個值出來(這範例各class也只有一個),然後再用.text來抓出字串。

最後寫出來就是這樣:

import requests
 from bs4 import BeautifulSoup
 res = requests.get('https://www.ptt.cc/bbs/joke/index.html', verify=False)
 soup = BeautifulSoup(res.text)
 for entry in soup.select('.r-ent'):
 print(entry.select('.title')[0].text,entry.select('.date')[0].text,entry.select('.author')[0].text)

大概就是這樣,之後會想辦法來解決換頁的問題,以及試著爬進文章。