iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 2
1

前言

上次下載了Python環境,用Jupyter notebook當我們的編譯程式,使用了Python套件(requests、BeautifulSoup)來將網頁資料爬下來,並成功將PTT資訊熱門版的標題爬下來,上次只有一頁,那我如果想要爬多頁呢?那如果遇到了按鈕(是否已滿18歲)該如何模擬點選,又該如何進入到頁面呢?

多頁情況

  1. 進入網站後,開啟瀏覽器開發者模式(F12),觀察下一頁按鈕的HTML標籤內容
    • 發現上一頁按鈕的a標籤中有上一頁的網址為「/bbs/MobileComm/index6520.html」
  2. 那我們就可以藉由擷取上一頁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"] #組合出上一頁的網址
    
  3. 因為我們需要擷取多頁(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)
    

遇到按鈕

  1. 進入網站後會看到讓使用者點選「是否已滿18歲」按鈕
  2. 此時可先開啟瀏覽器開發者模式(F12),並點選至network(網路),觀察點選「已滿18歲」後,會送給伺服器之封包內容。

  3. 發現封包以POST發送,並且封包內容有cookie和參數

  4. 那就表示說我們的程式碼需要以POST的方式,並且要有送出cookie和特定的參數
  5. 如何儲存自身的cookie?答案是可以藉由requests的一個參數來儲存
    • Session會將你送出的requests所收到的cookies全部儲存起來並且在發送下一次請求時送出對應的參數。
    requests.Session() 
    
  6. 而封包內的參數,則可以加在POST後面,由前述可得知參數為from和yes,並得知參數內容。
    payload={ #須送之參數
        'from':'/bbs/Gossiping/index.html',
        'yes':'yes'
    }
    requests.post("https://www.ptt.cc/ask/over18",data=payload) #將參數寫至data
    
  7. 加上上一次寫的程式碼,成功爬到八卦版的網頁
    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喜歡的圖片與文章。
    (此文章為教育使用,個人實作皆屬個人行為,本作者不負任何法律責任)

上一篇
Day-1 Python爬蟲小人生(1)
下一篇
Day-3 Python爬蟲小人生(3)
系列文
在資訊宅中打滾的通訊系生30

尚未有邦友留言

立即登入留言