iT邦幫忙

2022 iThome 鐵人賽

DAY 24
0
AI & Data

30天帶你從零基礎到Python爬蟲系列 第 24

[Day24] 爬蟲實戰演練 - 奇摩電影

  • 分享至 

  • xImage
  •  

這一篇和前幾天的美食網站例題差不多,都是去抓網址及文字,今天要示範的網站是奇摩電影的本週新片

今天我想要列印出電影中文名稱、英文名稱、上映時間還有期待度。

確認真正會用到的網址

第一步就是要先找出它真正的網址,其實有一個簡單的測試,上次我是看把畫面轉到第二頁時,上方的網址有沒有變動,如果有,就可以知道上方的網址列就是我要用的網址。今天的這個網頁也是會變動的,不需要另外找隱藏的網址~
https://ithelp.ithome.com.tw/upload/images/20220917/2014099879DJoTHv9v.png

開始程式編寫

現在正式進入程式編寫,一開始先匯入待會會用到的兩個函示庫requests&BeautifulSoup,用get()方法發送請求來取得網頁,將網頁的HTML程式碼取回來後,在response.text中可以取得網頁內容,再建立BeautifulSoup物件,這部分官方建議使用lxml的解析方法,因為速度快、相容性也好,不過我這邊就只用預設的而已,可以看你的需求做選擇,接著我們就能解析網頁的內容並擷取所需的資料。

import requests
from bs4 import BeautifulSoup
 
url = 'https://movies.yahoo.com.tw/movie_thisweek.html'
response = requests.get(url)
html = BeautifulSoup(response.text, "html.parser")

透過html.find_all找出在網頁中所有class為release_info的div標籤,這裡面包的就是每一部電影的資料,它會回傳一個list,再透過for迴圈並使用find方法取出每一部電影中以下四個資訊,至於為什麼用find是因為一部電影內只有一組我需要的資料,用find就可以了~

info_items = html.find_all("div", {"class":"release_info"})

for item in info_items:
    name = item.find("div", {"class":"release_movie_name"}).a.text.strip()
    en = item.find("div", {"class":"en"}).a.text.strip()
    release_time = item.find("div", {"class":"release_movie_time"}).text.split(':')[-1].strip()
    level = item.find("div", {"class":"leveltext"}).span.text

中英文的片名 (name、en)是release_movie_name和en這兩個class裡的div標籤裡面的a標籤,講起來好繞口,總之你們自己點點看HTML程式碼就會很清楚了,接著再透過text取得字串後在使用strip()方法刪除兩邊多餘的空白,仔細看片名的左邊有很長的空白,右邊不一定有,反正strip()可以一次性的刪除兩邊的空白。至於上映日期 (release_time)則是先使用split()方法將日期根據冒號來分割,它就會回傳一個list像是['上映日期 ', '2022-09-16'],接著再使用[-1]取出最後一個元素,也就是日期的部分。

都取得所需資料後就是要寫進檔案裡了,記得要先創建一個本週新片.txt否則會發生錯誤。最後可以順便把結果列印出來看看。

with open("本週新片.txt", "w", encoding="utf-8") as f:
    for item in info_items:
        name = item.find("div", {"class":"release_movie_name"}).a.text.strip()
        en = item.find("div", {"class":"en"}).a.text.strip()
        release_time = item.find("div", {"class":"release_movie_time"}).text.split(':')[-1].strip()
        level = item.find("div", {"class":"leveltext"}).span.text
         
        f.write("電影名稱: "+name+'\n')
        f.write("英文名稱: "+en+'\n')
        f.write("上映時間: "+release_time+'\n')
        f.write("期待度: "+level+'\n')
        f.write("-"*30+'\n')
        
        print("電影名稱:", name)
        print("英文名稱:", en)
        print("上映時間:", release_time)
        print("期待度:", level)
        print("-"*30)

完整程式碼

import requests
from bs4 import BeautifulSoup
 
url = "https://movies.yahoo.com.tw/movie_thisweek.html"
response = requests.get(url)
html = BeautifulSoup(response.text, "html.parser")
info_items = html.find_all("div", {"class":"release_info"})

with open("本週新片.txt", "w", encoding="utf-8") as f:
    for item in info_items:
        name = item.find("div", {"class":"release_movie_name"}).a.text.strip()
        en = item.find("div", {"class":"en"}).a.text.strip()
        release_time = item.find("div", {"class":"release_movie_time"}).text.split(':')[-1].strip()
        level = item.find("div", {"class":"leveltext"}).span.text
         
        f.write("電影名稱: "+name+'\n')
        f.write("英文名稱: "+en+'\n')
        f.write("上映時間: "+release_time+'\n')
        f.write("期待度: "+level+'\n')
        f.write("-"*30+'\n')
        
        print("電影名稱:", name)
        print("英文名稱:", en)
        print("上映時間:", release_time)
        print("期待度:", level)
        print("-"*30)

上一篇
[Day23] 爬蟲實戰演練 - PTT表特版
下一篇
[Day25] Pandas基本使用
系列文
30天帶你從零基礎到Python爬蟲30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言