延續上一篇用Python爬蟲抓取PTT電影版,這篇進階練習的是Python爬蟲PTT八卦版,跟電影版不同,八卦版有一個識別用戶年齡的Cookie代碼,另外也在這邊加入連續抓取的技巧。
本篇文章內容
Python爬蟲PTT 八卦版流程
和上一篇爬PTT電影版相同,這次利用Python爬取八卦版的流程大致相同,依然是先連線到特定網址、下載全部頁面資料,接著解析資料,抓取實際需要的部分。
- 觀察要抓的網頁
- 使用urllib對網站發出請求
- 抓取頁面資料(HTML)
- 載入beautifulsoup模組解析HTML
- 擷取需要資料(此處抓取文章標題)
唯一不同之處,就是八卦版由於內容較為多元,因此必須滿18歲以上才可以閱讀,在進入前會跳出一個分級管理頁面,我們必須針對這個頁面做Cookie操作。
Python Cookie操作
跟著彭彭老師影片,會發現在瀏覽八卦版時,瀏覽器會幫我們存放一個Cookie資訊,用來記錄這個瀏覽器使用者是否已滿18,我們要將這個資訊寫進程式中。
對應爬蟲關鍵心法:盡可能讓程式模仿一個普通使用者的樣子。
連續頁面抓取
第二個加入的練習是針對「連續抓取」,上一篇只練習一次抓取一個頁面的資料,在這篇中利用BeautifulSoup內建的功能,找到連結中按鈕文字為””‹ 上頁”的連結,利用迴圈重複抓取資料。
nextlink=root.find("a",string="‹ 上頁")
練習一:Python爬蟲實作(PTT八卦版+連續抓取多頁)
def getdata(url): #把程式包裝成函式 request=req.Request(url,headers={ "cookie":"over18=1", "user-agent":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Mobile Safari/537.36" }) with req.urlopen(request) as response: data=response.read() root=bs4.BeautifulSoup(data,"html.parser") titles=root.find_all("div",class_="title") for title in titles: if title.a !=None: print(title.a.string) nextlink=root.find("a",string="‹ 上頁") return nextlink["href"] url="https://www.ptt.cc/bbs/Gossiping/index.html" pages=int(input("請輸入要抓取的頁數:")) n=0 while n<pages: print("【正在抓取第"+str(n+1)+"頁資料】") url="https://www.ptt.cc"+getdata(url) #回傳的下一頁網址覆蓋"url變數" n+=1
練習二:使用者輸入查詢資料,列出標題(並解決PTT標題特殊符號問題)
由於想要更貼近一個「被使用」的程式,練習把整個程式包裝成函式,並且讓使用者可以輸入更多資訊(看板網址、想要抓取的頁數、關鍵字:比如說美食版中,30頁內有關於板橋的文章)。
這邊遇到一個問題,當PTT的標題中如果有”特殊符號”(例如:@),程式就會出錯,找了好幾個網站找不到解決方法,後來上FB社團求救,只要使用title.a.get_text()就可以指提取文字,順利抓取了!
import bs4 import urllib.request as req from urllib.parse import quote def getdata(): #把程式包裝成函式 url=input("請輸入抓取PTT網址:") pages=int(input("請輸入抓取頁數:")) kw=input("請輸入關鍵字:") n=0 while n<pages: print("------【正在抓取第"+str(n+1)+"頁資料】------") request=req.Request(url,headers={ "cookie":"over18=1", "user-agent":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Mobile Safari/537.36" }) with req.urlopen(request) as response: data=response.read().decode("utf-8") root=bs4.BeautifulSoup(data,"html.parser") #titles=root.find_all("div",class_="title") titles=root.select("div.title") for title in titles: if title.a!=None and kw in title.a.get_text(): #使用title.a.get_text()指抓取文字,就不會有符號問題了!感謝Python社團大大相救 print(title.a.string) print("https://www.ptt.cc"+title.a["href"]) nextlink=root.find("a",string="‹ 上頁") url=str("https://www.ptt.cc"+nextlink["href"]) #print(nextlink) n+=1 getdata()
請輸入抓取PTT網址:https://www.ptt.cc/bbs/Food/index.html
請輸入抓取頁數:30
請輸入關鍵字:板橋
執行結果:
什麼是Cookie?
網站在使用者由覽器中存放的一小段資料,
每一個網站都可以透過程式存放資料,在連線時會傳送給網站。
Python爬蟲特殊符號問題怎麼解決(HTML)
使用title.a.get_text()就可以指提取文字
本次練習檔與影片
練習檔網址:Day10(12/22):Python 網路爬蟲 Web Crawler( Cookie)PTT八卦版
Day10-2(爬蟲綜合練習):使用者輸入查詢資料,自動列出標題
影片列表:
【Python新手練習】相關文章
【Python新手練習】系列文,是一個行銷人學習Python的筆記,希望可以藉由練習程式,訓練更強大的邏輯思考,如果你也對這塊有興趣,這些文章或許可以幫助到你!也歡迎一起交流。
行銷人的Python練習90計畫-為什麼要學Python?
Day0:Google Colab新手Python開發環境推薦
Day1:Python變數與資料型態
Day2:Python判斷式與迴圈(流程控制)
Day3:Python函式 定義、呼叫與回傳
Day4:載入Python模組與使用
Day5:Python檔案讀取和儲存
Day6:Python亂數與統計
Day7:Python API 開放資料串接,抓取台北市政府公開資料!
Day8:Python實體物件建立與使用
Day9:Python爬蟲實戰!抓取PTT電影版
發佈留言