iT邦幫忙

2022 iThome 鐵人賽

DAY 16
0
自我挑戰組

養爬蟲的人學爬蟲系列 第 16

【Day 16】把爬完的資料用JSON儲存吧!(實作PTT 3/3)

  • 分享至 

  • xImage
  •  

閒聊
昨天我們嘗試讓爬蟲會繼續往下一頁前進,那麼今天就是要把我們前兩天的資料儲存起來。

預期
將爬取到的文章內容以JSON檔案格式儲存。

實作
第一步需要先定義一個等下讓我們放所有文章資料的list(串列)。

article_list = []

第二步,我們把每篇文章的資料都存成dict(字典),再把字典所存放的資訊放入串列中。

title = art.fin('div', class = 'title').getText().strip()
if not title.stratswith(('本文已被刪除')) :
    link = 'https://www.ptt.cc' + \
        art.find('div', class_='title').a['href'].strip()
author = art.find('div', class_='author').getText().strip()
artcle = {
    'title':title,
    'link:link',
    'author':author
}

第三步,要將存放所有資料的串列存為JSON檔。
這邊會使用到的JSON是Python內建庫,記得要引入。

import json
with open('ptt-artcle.json','w',encoding = 'utf-8') as f :
    json.dump(artcle_list,f, indent=2, sort_keys=True, ensure_ascii=False)

最後將存為JSON檔的程式碼加入爬蟲中就完成了!

import requests
import json
from bs4 import BeautifulSoup

article_list = []

url = 'https://www.ptt.cc/bbs/Gossiping/index.html'
def get_r(url):
    cookies = {
        'over18':1
    }
    r = requests.get(url, cookies=cookies)
    if r.status_code != 200: #200網頁正常
        return 'error'
    else:
        return r
        
def get_articles(r):
    soup = BeautifulSoup(r.text, 'html5lib')
    arts = soup.find_all('div', class_='r-ent')
    for art in arts:
        title = art.find('div', class_='title').getText().strip()
        if not title.startswith('本文已被刪除') :
            link = 'https://www.ptt.cc' + \
                art.find('div', class_='title').a['href'].strip()
        author = art.find('div', class_='author').getText().strip()
        article = {
            'title': title,
            'link': link,
            'author': author
        }
        article_list.append(article)
    # 利用 Css Selector 定位下一頁網址
    next_url = 'https://www.ptt.cc' + \
        soup.select_one(
            '#action-bar-container > div > div.btn-group.btn-group-paging > a:nth-child(2)')['href']
    return next_url
    
# 當執行此程式時成立
if __name__ == '__main__':
    # 第一個頁面網址
    url = 'https://www.ptt.cc/bbs/Gossiping/index.html'
    # 先讓爬蟲爬 10 頁
    for now_page_number in range(10):
        r = get_r(url)
        if r != 'error':
            url = get_articles(r)
        print(f'======={now_page_number+1}/10=======')
    #把所有文章資訊存為JSON檔
    with open('ptt-article.json','w',encoding = 'utf-8') as f :
        json.dump(article_list,f, indent=2, sort_keys=True, ensure_ascii=False)

結語
今天我們把資料用JSON檔的方式儲存起來,PTT的爬蟲也告一段落。
明天一起來看看這半個月以來學習了什麼!

明天!
【Day 17】半個月以來總結

參考資料
PTT八卦版https://www.ptt.cc/bbs/Gossiping/index.html
Json爬蟲實戰-24小時電商PChome爬蟲|雖然我不是個數學家但這聽起來很不錯吧https://marketingliveincode.com/?p=4555


上一篇
【Day 15】爬完這邊繼續爬!(實戰PTT 2/3)
下一篇
【Day 17】半個月以來的總結
系列文
養爬蟲的人學爬蟲30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言