實作Python爬蟲PTT八卦版(Cookie操作&連續頁抓取)【Python練習Day10】

延續上一篇用Python爬蟲抓取PTT電影版,這篇進階練習的是Python爬蟲PTT八卦版,跟電影版不同,八卦版有一個識別用戶年齡的Cookie代碼,另外也在這邊加入連續抓取的技巧。

By.

min read

abstract business code coder

pexels-photo-270348

延續上一篇用Python爬蟲抓取PTT電影版,這篇進階練習的是Python爬蟲PTT八卦版,跟電影版不同,八卦版有一個識別用戶年齡的Cookie代碼,另外也在這邊加入連續抓取的技巧。

Python Cookie操作-Python爬蟲ptt
Python Cookie操作-Python爬蟲ptt

Python爬蟲PTT 八卦版流程

和上一篇爬PTT電影版相同,這次利用Python爬取八卦版的流程大致相同,依然是先連線到特定網址、下載全部頁面資料,接著解析資料,抓取實際需要的部分。

  1. 觀察要抓的網頁
  2. 使用urllib對網站發出請求
  3. 抓取頁面資料(HTML)
  4. 載入beautifulsoup模組解析HTML
  5. 擷取需要資料(此處抓取文章標題)

唯一不同之處,就是八卦版由於內容較為多元,因此必須滿18歲以上才可以閱讀,在進入前會跳出一個分級管理頁面,我們必須針對這個頁面做Cookie操作。

Python Cookie操作-Python爬蟲ptt

Python Cookie操作

跟著彭彭老師影片,會發現在瀏覽八卦版時,瀏覽器會幫我們存放一個Cookie資訊,用來記錄這個瀏覽器使用者是否已滿18,我們要將這個資訊寫進程式中。

對應爬蟲關鍵心法:盡可能讓程式模仿一個普通使用者的樣子。

Python Cookie操作-Python爬蟲ptt

連續頁面抓取

第二個加入的練習是針對「連續抓取」,上一篇只練習一次抓取一個頁面的資料,在這篇中利用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
請輸入關鍵字:板橋

執行結果:

螢幕擷取畫面 2020 12 27 230521

什麼是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電影版

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *