close

今天練習的是抓取NBA 新聞標題與網頁連結。

0_webtitle.png

在網頁下方有新聞標題。

0_NBA_news_pages.png

 

將滑鼠移到新聞標題,按下右鍵,再按下檢查

1_1_titleCheck.png

 

在網頁內容中可以看到這個網頁的 HTML 標籤與內容。
1_2_id_class.png

 

仔細觀察一下網頁內容和原始碼的標籤(tag)的對應關係,它們似乎是 以 <dt> </dt> 標籤(tag)作為網頁文字內容。這裡有10個<dt> </dt> 標籤

1_3_dt.png

而網頁標題的數量也剛好有10個

1_4_news_lots_matches.png

程式寫作與驗證

1. 先利用 requests 裡的 get() 讀取 網頁位址
resp = requests.get(url)

取得 BeautifulSoup 物件
sp=BeautifulSoup(resp.text, 'lxml')

先抓取 id="news_list_body"

結果正常,抓到標籤與內容文字
2_1_find_id_fine.png

再看一下HTML 標籤內容:先遇到 <dl>,接下來才是<td>。下一組的指令是先抓<dl>
out=sp.find(id="news_list_body").find("dl")

結果也正確:

2_2_find_dl_fine.png

下一步才是抓取 <dt> </dt> 標籤
out=sp.find(id="news_list_body").find("dl").find_all("dt")
結果也正確:

2_3_find_dt_fine.png
 

接下來就是抓取每一筆<dt> </dt> 標籤的內容

想要抓取 新聞裡的子連結(sub-link),應該這樣寫:
sublink=dt.find("a").get("href")

 

2_5_1_sublink.png

但看一下這些內容只有相對路徑的網址。如果我們由網際網路去連,可能連不上。
所以這個網址應該要加上原來的網站網址:https://nba.udn.com/nba/news

 

2_5_fulllink.png

 

抓取標題
headtext=dt.find("h3").text

2_6_1_getText_more2.png


利用串列(list)來存放資料
<dt> </dt> 標籤 有很多項目,我們可以用 for 迴路來讀取每一筆資料。
首先,在 for 迴路以外先建立一個 nba_news串列(list)

nba_news=[]

加入陣列用 append() 函數
nba_news.append([headtext, reallink])

2_7_1_getdata.png

為了儲存檔案,可以用 Pandas DataFrame
DataFrame(nba_news,columns=['標題','網址']).to_csv('nba_news.csv',encoding='utf-8-sig',index=0)

 

2_8_1_CSV.png

arrow
arrow
    文章標籤
    Python Web Crawl BeautifulSoup
    全站熱搜
    創作者介紹
    創作者 小木屋 的頭像
    小木屋

    小木屋

    小木屋 發表在 痞客邦 留言(0) 人氣()