下載 Yahoo 頭條新聞
Beautiful Soup 本身只是一個 HTML 解析工具,它並不負責下載網頁,所以通常我們在開發爬蟲程式時,會搭配 requests
模組一同使用。
在這個範例中,我們打算開發一個爬蟲程式,可從 Yahoo 的首頁把頭條新聞的標題與網址抓下來,在開發程式之前,我們通常都會先用瀏覽器的開發人員工具,觀察一下目標網頁的 HTML 結構,找出我們有興趣的資料所在位置,並設計好萃取資料的規則。
以 Yahoo 頭條新聞來說,我們可以發現網頁中的頭條新聞超連結都有 story-title
這個 CSS 的 class,所以我們只要找出網頁中所有符合此條件的標籤,就可以把頭條新聞的資訊抓出來了。
以下是使用 requests
模組從 Yahoo 下載首頁的 HTML 資料後,以 Beautiful Soup 翠取出頭條新聞標題的指令稿:
import requests from bs4 import BeautifulSoup # 下載 Yahoo 首頁內容 r = requests.get('https://tw.yahoo.com/') # 確認是否下載成功 if r.status_code == requests.codes.ok: # 以 BeautifulSoup 解析 HTML 程式碼 soup = BeautifulSoup(r.text, 'html.parser') # 以 CSS 的 class 抓出各類頭條新聞 stories = soup.find_all('a', class_='story-title') for s in stories: # 新聞標題 print("標題:" + s.text) # 新聞網址 print("網址:" + s.get('href'))
程式執行之後,就會輸出 Yahoo 首頁頭條新聞的標題與網址:
下載 Google 搜尋結果
這個範例我們要開發一個可以自動送出關鍵字到 Google 進行搜尋,並將搜尋結果抓回來的爬蟲程式,基本的開發概念都相同,只不過 Google 的網頁會因為瀏覽器(User-Agent)不同而產生不同的結果,所以在觀察程式碼的時候,最好是使用 Beautiful Soup 的 prettify
把抓回來的 HTML 原始碼排版後印出來,這樣看會比較準確。
Google 搜尋引擎網址是 https://www.google.com.tw/search
,而關鍵字則是透過 q
這個參數送給它,這個規則只要稍微觀察一下瀏覽器所顯示的網址即可推論出來,有了這個規則之後,就可以用 requests
與 BeautifulSoup
先把 Google 搜尋結果的 HTML 原始碼抓下來看看。
接著再設計一下萃取資料的規則,這裡我使用一個自己設計的 CSS 的選擇器:
div.g > h3.r > a[href^="/url"]
它可以抓出 class 為 g
的 <div>
,底下緊接著 class 為 r
的 <h3>
,底下又接著網址為 /url
開頭的超連結。
設計好資料萃取的規則後,就可以把整個程式來了,以下是完整的 Google 搜尋爬蟲程式:
import requests from bs4 import BeautifulSoup # Google 搜尋 URL google_url = 'https://www.google.com.tw/search' # 查詢參數 my_params = {'q': '寒流'} # 下載 Google 搜尋結果 r = requests.get(google_url, params = my_params) # 確認是否下載成功 if r.status_code == requests.codes.ok: # 以 BeautifulSoup 解析 HTML 原始碼 soup = BeautifulSoup(r.text, 'html.parser') # 觀察 HTML 原始碼 # print(soup.prettify()) # 以 CSS 的選擇器來抓取 Google 的搜尋結果 items = soup.select('div.g > h3.r > a[href^="/url"]') for i in items: # 標題 print("標題:" + i.text) # 網址 print("網址:" + i.get('href'))
執行後,就可以自動透過 Google 搜尋關鍵字,然後馬上把結果抓回來。
參考資料:DigitalOcean、DigitalOcean、opensource.com
Aileen
Thank you for the post. it helps me a lot!
many thanks!!
Martina
很多地方都只是写prettify()可以把代码格式化。。。解释得一点都不通俗,还是不明白。你解释得清楚多了,一目了然!谢谢!
ZHONG
先感謝作者對這部分的用心
內容相當充實,對新手來說也很好上手
在試過google搜尋範例之後我有個問題
如果我想要一次搜尋多一些資料該怎麼做
目前所知是第1頁的’start’會是’0’,第2頁是’10’,以此類推
Wilson
感謝作者那麼用心的整理出這些步驟。
想知道到如何設定Google 的設計抓取資料的量
W.
謝謝站長寫得真好 容易看懂重要的功能 還有很實用的範例
XXL
寫得太棒了!!!
H
範例列出得十分清晰易懂,十分感謝!
FF
怎麼去提取數據從一個jQuery.get() 的網頁應用.
查看網頁源代碼 找不到該網頁所展示的數據資料
Jay
寫的真的很好,棒!
neoyang
高手