Python-爬蟲13-實作-2爬取PPT網站

 目標: https://www.ptt.cc/bbs/Gossiping/index.html

  • 到上一頁繼續尋找是否有今日文章
  • 計算今天有幾篇文章
  • 找出推文數大於3的文章,為熱門文章,並印出熱門文章的標題
  • 把抓回來的資料 存成新檔.json

到上一頁繼續尋找是否有今日文章

if __name__ == '__main__':
    ppt_page = get_ppt_page(domain_url + '/bbs/Gossiping/index.html')
    if ppt_page:
        #print(domain_url + '/bbs/Gossiping/index.html')
        
        today = time.strftime("%m/%d").lstrip('0')  # 今天日期, 去掉開頭的 '0' 以符合 PTT 網站格式
        pptdata,prev_href = get_pageinfo(ppt_page,today)
        print(domain_url+prev_href)
        print(pptdata)

        articles = []  # 全部的今日文章
        #回到上一頁繼續尋找是否有今日文章
        while pptdata:  # 若目前頁面有今日文章則加入 articles,並回到上一頁繼續尋找是否有今日文章
            articles += pptdata
            pptdata = get_ppt_page(domain_url + prev_href) #請求網頁內容
            pptdata, prev_href = get_pageinfo(pptdata, today)#抓取今日文章

計算今天有幾篇文章
       

print('今天有', len(pptdata), '篇文章')

 


找出推文數大於3的文章,為熱門文章

印出熱門文章的標題

hot = 3 #預設推文數要大於這個值,才算熱門文章
        
print('熱門文章(> %d 推):' % (hot)) #提示文字
for a in pptdata:  
if int(a['push_num']) > hot: #如果推文數大於 hot 
   print(a['title']) #印出標題

 


把抓回來的資料 存成新檔.json

import json

with open('ppt1.json', 'w', encoding='utf-8') as f:
     json.dump(pptdata, f, indent=10, sort_keys=True, ensure_ascii=False)
                           #縮排, 是否排序Key ,編碼

 


完整程式:

import requests
import time
import json
from bs4 import BeautifulSoup

domain_url = 'https://www.ptt.cc'

def get_ppt_page(url):
    resp = requests.get(
        url=url,
        cookies={'over18': '1'}  # 紀錄cookies 是否年滿18歲
    )
    if resp.status_code != 200:
        print('Invalid url:', resp.url)
        return None
    else:
        return resp.text
    
def get_pageinfo(resdata,today):
    soup = BeautifulSoup(resdata, 'html5lib')
    #取得上一頁href
    paging_div = soup.find('div', 'btn-group btn-group-paging')
    #print(paging_div)
    prev_url = paging_div.find_all('a')[1]['href']
    #print(prev_url)
    
    pptdata = []  # 儲存取得的文章資料
    date_divs = soup.find_all('div', 'r-ent')
    #print(date_divs) #先抓取<div class="r-ent"></div>
    for d in date_divs:
        today_data = d.find('div', 'date').text.strip() == today
        #print(today_data)
        if today_data : #判斷文章是否是今天發佈
           # 取得推文數
           push_count = d.find('div', 'nrec').text
           print(push_count)
           push_num = 0
           if push_count:
                try:
                    push_num = int(push_count)  # 轉換字串為數字
                except ValueError:
                    # 若轉換失敗,可能是'爆'或 'X1', 'X2', ...
                    # 若不是, 不做任何事,push_num 保持為 0
                    if push_count == '爆':
                        push_num = 00
                    elif push_count.startswith('X'):
                        push_num = 99
           print("推文數",push_num)
           # 取得文章連結
           if d.find('a'):  # 有超連結,代表文章存在
                href = d.find('a')['href']
                print("標題連結",href)
                title = d.find('a').text
                print("標題",title)
                author = d.find('div', 'author').text if d.find('div', 'author') else '' #作者有可能是空的
                print("作者",author)
              
                pptdata.append({
                    'title': title,
                    'href': href,
                    'push_num': push_num,
                    'author': author
                })
           
    return pptdata,prev_url

if __name__ == '__main__':
    ppt_page = get_ppt_page(domain_url + '/bbs/Gossiping/index.html')
    if ppt_page:
        #print(domain_url + '/bbs/Gossiping/index.html')
        today = time.strftime("%m/%d").lstrip('0')  # 今天日期, 去掉開頭的 '0' 以符合 PTT 網站格式
        pptdata,prev_href = get_pageinfo(ppt_page,today)
        print(domain_url+prev_href)
        print(pptdata)
        
        articles=[]
        #回到上一頁繼續尋找是否有今日文章
        while pptdata:  # 若目前頁面有今日文章則加入 articles,並回到上一頁繼續尋找是否有今日文章
            articles += pptdata
            pptdata = get_ppt_page(domain_url + prev_href)
            pptdata, prev_href= get_pageinfo(pptdata, today)
       
        # 計算今天有幾篇文章
        print('今天有', len(pptdata), '篇文章')
        hot = 3 #預設推文數要大於這個值,才算熱門文章
        
        print('熱門文章(> %d 推):' % (hot)) #提示文字
        for a in pptdata:  
            if int(a['push_num']) > hot: #如果推文數大於 hot 
                print(a['title']) #印出標題
        with open('ppt1.json', 'w', encoding='utf-8') as f:
            json.dump(pptdata, f, indent=10, sort_keys=True, ensure_ascii=False)
                                  #縮排, 是否排序Key ,編碼

 

Yiru@Studio - 關於我 - 意如