iT邦幫忙

2022 iThome 鐵人賽

DAY 6
0
Software Development

讓python 解決麻煩事系列 第 6

使用BeautifulSoup抓取旅遊景點

  • 分享至 

  • xImage
  •  

首先install beautifulsoup

beautifulsoup可以快速解析HTML,讓使用者只需要輸入少許指令就能夠分析網頁資料。
請打開command,輸入以下指令

pip install beautifulsoup4

install requests

requests用來下載網頁上的資料。
請打開command,輸入以下指令

pip install requests

接下來我們找到了一個可以抓取景點的網頁(以台灣光觀局的網站為例):https://www.taiwan.net.tw/
這個網站一開始會找到地區->縣市->景點->詳細介紹頁,四層架構。今天範例先講到三層,明天再來講第四層跟其他應用。
在程式一開始需要import requests和BeautifulSoup來幫我們獲得及解析網頁

import requests
from bs4 import BeautifulSoup

requests.get用來取得url的html
BeautifulSoup用Html來剖析成object

response = requests.get("https://www.taiwan.net.tw/")
soup = BeautifulSoup(response.text, "html.parser")
print(soup.prettify())

我們使用prettify列印出來,此時可以看到抓取下來的HTML

    <li class="auto-width hasNextFloor"><a href="m1.aspx?sNo=0001016" title="觀光景點" target="_self">觀光景點</a>
        <ul class="submenu-level-2">
           <li><a href="m1.aspx?sNo=0000501" title="北部地區" target="_self" class="megamenu-btn cut-north">北部地區</a></li>
           <li><a href="m1.aspx?sNo=0000502" title="中部地區" target="_self" class="megamenu-btn cut-center">中部地區</a></li>
           <li><a href="m1.aspx?sNo=0000503" title="南部地區" target="_self" class="megamenu-btn cut-south">南部地區</a></li>
           <li><a href="m1.aspx?sNo=0000504" title="東部地區" target="_self" class="megamenu-btn cut-east">東部地區</a></li>
           <li><a href="m1.aspx?sNo=0000505" title="離島地區" target="_self" class="megamenu-btn cut-island">離島地區</a></li>
         </ul>
      </li>

因為我們需要的景點資訊在以上的href裡面,此時我們可以使用find_all來抓取以上的url,為了確保式抓到上面幾個,可以加上class來確保,那相同的class是megamenu-btn。

viewpoints = soup.find_all("a", class_="megamenu-btn")
for viewpoint in viewpoints:
    url = viewpoint.get("href")

此時的url是抓到北\中\南\東\離島地區的url,那接下來我們需要透過requests.get來抓取細部網頁

    url_response = requests.get("https://www.taiwan.net.tw/"+url)
    url_soup = BeautifulSoup(url_response.text, "html.parser")

地區網頁裡面又有分成各個縣市,所以我們需要再抓取一次連結。並抓取連結內的內容。

    de_viewpoints=url_soup.find_all("a",class_="circularbtn")
    for de_viewpoint in de_viewpoints:

那我們先把地區-縣市先print出來,在抓取各個縣市的景點

        print(viewpoint.getText()+" - "+de_viewpoint.find("span",class_="circularbtn-title").getText())
        de_url=de_viewpoint.get("href")
        de_url_response = requests.get("https://www.taiwan.net.tw/"+de_url)
        de_url_soup = BeautifulSoup(de_url_response.text, "html.parser")
        titles = de_url_soup.find_all("div", class_="card-info")
        for title in titles:
 

這邊就是縣市的各個景點,只需要將景點print出來使用.getText()來輸出tag的文字

            print("    "+title.select_one("div", class_="card-title").getText())
            
            hashtags = de_url_soup.find_all("div", class_="hashtag",limit=10)

因為一個景點有很多標籤,所以用for來把所有標籤列印

            for hashtag in hashtags:
                
                print("      -"+hashtag.select_one("a").getText())

以下是最後執行結果輸出(擷取部分)

離島地區 - 連江縣(馬祖)
    芹壁村
      -#網美必拍
      -#無障礙
      -#古蹟巡禮
      -#無障礙
      -#無障礙
      -#無障礙
      -#戰地文化
      -#生態體驗
      -#博物館
      -#無障礙
    八八坑道
      -#網美必拍
      -#無障礙
      -#古蹟巡禮
      -#無障礙
      -#無障礙
      -#無障礙
      -#戰地文化
      -#生態體驗
      -#博物館
      -#無障礙

是不是覺得爬蟲很簡單,只需要一杯咖啡的時間就會了。


上一篇
Multi-processing pool 基本介紹
下一篇
MySQL install
系列文
讓python 解決麻煩事20
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言