前言
上次下載了Python環境,用Jupyter notebook當我們的編譯程式,使用了Python套件(requests、BeautifulSoup)來將網頁資料爬下來,並成功將PTT資訊熱門版的標題爬下來,上次只有一頁,那我如果想要爬多頁呢?那如果遇到了按鈕(是否已滿18歲)該如何模擬點選,又該如何進入到頁面呢?
多頁情況
- 進入網站後,開啟瀏覽器開發者模式(F12),觀察下一頁按鈕的HTML標籤內容
- 發現上一頁按鈕的a標籤中有上一頁的網址為「/bbs/MobileComm/index6520.html」
- 那我們就可以藉由擷取上一頁a標籤裡的網址來GET上一頁的網頁下來了!!
r = requests.get("https://www.ptt.cc/bbs/joke/index.html")
soup = BeautifulSoup(r.text,"html.parser")
u = soup.select("div.btn-group.btn-group-paging a")#上一頁按鈕的a標籤
url = "https://www.ptt.cc"+ u[1]["href"] #組合出上一頁的網址
- 因為我們需要擷取多頁(ex:3頁),所以需要重新撰寫程式碼,藉由迴圈來重複GET網頁
import requests
from bs4 import BeautifulSoup
url = "https://www.ptt.cc/bbs/joke/index.html"
for i in range(3): #往上爬3頁
r = requests.get(url)
soup = BeautifulSoup(r.text,"html.parser")
sel = soup.select("div.title a") #標題
u = soup.select("div.btn-group.btn-group-paging a") #a標籤
print ("本頁的URL為"+url)
url = "https://www.ptt.cc"+ u[1]["href"] #上一頁的網址
for s in sel: #印出網址跟標題
print(s["href"],s.text)
遇到按鈕
- 進入網站後會看到讓使用者點選「是否已滿18歲」按鈕
- 此時可先開啟瀏覽器開發者模式(F12),並點選至network(網路),觀察點選「已滿18歲」後,會送給伺服器之封包內容。
- 發現封包以POST發送,並且封包內容有cookie和參數
- 那就表示說我們的程式碼需要以POST的方式,並且要有送出cookie和特定的參數
- 如何儲存自身的cookie?答案是可以藉由requests的一個參數來儲存
- Session會將你送出的requests所收到的cookies全部儲存起來並且在發送下一次請求時送出對應的參數。
requests.Session()
- 而封包內的參數,則可以加在POST後面,由前述可得知參數為from和yes,並得知參數內容。
payload={ #須送之參數
'from':'/bbs/Gossiping/index.html',
'yes':'yes'
}
requests.post("https://www.ptt.cc/ask/over18",data=payload) #將參數寫至data
- 加上上一次寫的程式碼,成功爬到八卦版的網頁
import requests
r = requests.Session()
payload ={
"from":"/bbs/Gossiping/index.html",
"yes":"yes"
}
r1 = r.post("https://www.ptt.cc/ask/over18?from=%2Fbbs%2FGossiping%2Findex.html",payload)
r2 = r.get("https://www.ptt.cc/bbs/Gossiping/index.html")
print(r2.text)
下篇預告
- 下一次將教大家實作Dcard圖文爬蟲,可以自動下載Dcard喜歡的圖片與文章。
(此文章為教育使用,個人實作皆屬個人行為,本作者不負任何法律責任)