- 觀察網頁標籤,分別擷取一篇新聞的分類、標題、時間、內文
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)
post_time = soup.select('.date')[0].text
print(post_time)
content = soup.select('#Content1')[0].text
print(content)
將「時間字串」轉為「時間型態」
- 第三方時間處理套件 - arrow
- 套件安裝 - pip install arrow
import arrow
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')
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表格呈現
- 開始可能需要翻解答,成功後重寫幾次,直到一次完成,就有一定的基本功了!