範例二:三立新聞

  • 觀察網頁標籤,分別擷取一篇新聞的分類、標題、時間、內文
url = 'http://www.setn.com/news.aspx?newsid=225139'
r = requests.get(url, headers=request_headers)
soup = bs(r.text, 'lxml')

# 兩個標籤中的空格代表後者可為前者的子標籤或孫標籤
category = soup.select('#toptitle a')[1].text
print(category)

# 兩個標籤中的 > 代表後者必須為前者的子標籤
title = soup.select('div.title > h1')[0].text
print(title)

# 擷取class="date"的標籤,不限標籤名稱
post_time = soup.select('.date')[0].text
print(post_time)

content = soup.select('#Content1')[0].text
print(content)

將「時間字串」轉為「時間型態」

  • 第三方時間處理套件 - arrow
  • 套件安裝 - pip install arrow

import arrow

# 2017/02/15 15:33:00
post_time_dt = arrow.get(post_time, 'YYYY/MM/DD HH:mm:ss').datetime
print(post_time_dt)
print(type(post_time_dt))
  • HTML的head部份中有個<meta name="pubdate" content="2017-02-17T21:22:00">
  • 標準時間格式,arrow中不須自訂parser參數
post_time_str = soup.select('meta[name="pubdate"]')[0]['content']
post_time_dt = arrow.get(post_time_str).replace(tzinfo='local').datetime
print(post_time_dt)
  • 當要爬取多篇文章時,須多看幾篇,找出統一的格式,以免parser出錯,如PTT:
    • Mon Aug 1 21:16:57 2016
    • Wed Jan 27 08:15:35 2016
  • 練習:以arrow.get()將以上任一時間字串轉為時間型態,再試著以同樣的parser參數去處理另一個時間字串

去除字串的頭尾空白 - str.strip()

print(content)
print(len(content))
print(content.strip())
print(len(content.strip()))

新聞列表一次爬三頁資料

for n in range(1, 4):
    url = 'http://www.setn.com/ViewAll.aspx?p={}'.format(n)
    print(url)
  • 用兩層迴圈爬新聞列表前三頁,並以list slicing只取每頁的前三篇新聞
import time

for n in range(1, 4):
    print('[Page {}]'.format(n))
    url = 'http://www.setn.com/ViewAll.aspx?p={}'.format(n)
    r = requests.get(url, headers=request_headers)
    time.sleep(3)
    soup = bs(r.text, 'lxml')

    # 以list slicing只取每頁的前三篇新聞
    for t in soup.select('.box li')[:3]:
        a_tag = t.select('a')[0]
        url_tail = a_tag['href']
        post_url = 'http://www.setn.com{}'.format(url_tail)
        print(post_url)
  • 練習:
    • 續以上,擷取九篇新聞的分類、標題、時間、內文,再加上網址,最後以pandas表格呈現
    • 開始可能需要翻解答,成功後重寫幾次,直到一次完成,就有一定的基本功了!

results matching ""

    No results matching ""