Python-爬蟲12-實作-1.爬取Yahoo奇摩電影的本周新片

#目標位置>>Yahoo>>電影>>Yahoo本週新片
#https://tw.movies.yahoo.com/movie_thisweek.html

 
if __name__ == '__main__':
    webpage = check_req_url(yahoo_movie_url)
    #print(webpage)
    
    if webpage:
        movies = get_week_new_movies(webpage)
        #print(movies)

2.抓出所有的電影資訊

目標位址:https://tw.movies.yahoo.com/movie_thisweek.html

1.測試網頁是否請求成功或失敗

import requests

#Yahoo電影
yahoo_movie_url = 'https://tw.movies.yahoo.com/movie_thisweek.html' #目標位置

def check_req_url(url): #測試請求網址是否請求成功
    resp = requests.get(url) #請求網址
    print(resp.status_code) #錯誤時404,成功時200
    if resp.status_code != 200:  #如果請求失敗
        print('Invalid url:', resp.url) #印出請求失敗的網址
        return "fail" #回傳失敗提示訊息
    else:
        return resp.text #回傳請求成功的html文字
 
if __name__ == '__main__':
    webpage = check_req_url(yahoo_movie_url)
    print(webpage)
    

請求失敗回應:

請求成功回應: 整張網頁html轉text抓回來


2.抓出所有的電影名稱

抓取的區域為這一區 

F12尋找每一筆資料固定被什麼標籤包住

 每一筆的資料固定被  <div class="release_info_text"></div>  給包住

所以先縮小範圍,把 <div class="release_info_text"></div>內的文字先抓回來

from bs4 import BeautifulSoup

 

def get_week_new_movies(webpage): #抓取電影資訊
    soup = BeautifulSoup(webpage, 'html.parser') #網頁解析
    movies = [] #域設電影資訊存這裡 
    
    #抓取<div class="release_info_text"></div>內文字
    rows = soup.find_all('div', 'release_info_text')
    
    print(rows)
    
    return movies

 

if __name__ == '__main__':
    webpage = check_req_url(yahoo_movie_url)
    print(webpage)
    
    if webpage:
        movies = get_week_new_movies(webpage)
        print(movies)

我們已經把所有的電影資訊都抓回來了。

每一筆的資訊都存在<div class="release_info_text"></div>

我們必須一筆筆讀出來。使用for 迴圈

接著繼續抓取電影名稱

def get_week_new_movies(webpage): #抓取電影資訊
    soup = BeautifulSoup(webpage, 'html5lib') #網頁解析
    movies = [] #預設電影資訊存這裡 
   
    #抓取<div class="release_info_text"></div>內文字
    rows = soup.find_all('div', 'release_info_text')
    data_movie = dict()
    #print(rows)
    for row in rows:
        data_movie = dict() #存成{"key":"value"}格式
        #電影名稱
        data_movie['ch_name'] = row.find('div', 'release_movie_name').a.text.strip()
        #print(data_movie)#每一圈 都會被取代成下一筆資料 data_movie['ch_name']
        #第一圈
        #data_movie['ch_name']={'ch_name': '逃'}
        #第二圈
        #data_movie['ch_name']={'ch_name': '名偵探柯南:紅之校外旅行 鮮紅篇&戀紅篇'}
        #第三圈
        #data_movie['ch_name']={'ch_name': '惡童當街 經典重映'}
        movies.append(data_movie) #再被取代前先存入for 外面的movies=[]
        #第一圈存入
        #[{'ch_name': '逃'}]
        #第二圈存入
        #[{'ch_name': '逃'}, {'ch_name': '名偵探柯南:紅之校外旅行 鮮紅篇&戀紅篇'}]
        #第三圈存入
        #[{'ch_name': '逃'}, {'ch_name': '名偵探柯南:紅之校外旅行 鮮紅篇&戀紅篇'}, {'ch_name': '惡童當街 經典重映'}]
        #print(movies)
    return movies

 

 
if __name__ == '__main__':
    webpage = check_req_url(yahoo_movie_url)
    #print(webpage)
    
    if webpage:
        movies = get_week_new_movies(webpage)
        print(movies)

 

完整程式碼:

#目標位置>>Yahoo>>電影>>Yahoo本週新片
#https://tw.movies.yahoo.com/movie_thisweek.html

import requests
from bs4 import BeautifulSoup

#Yahoo電影
yahoo_movie_url = 'https://tw.movies.yahoo.com/movie_thisweek.html' #目標位置

def check_req_url(url): #測試請求網址是否請求成功
    resp = requests.get(url) #請求網址
    #print(resp.status_code) #錯誤時404,成功時200
    if resp.status_code != 200:  #如果請求失敗
        print('Invalid url:', resp.url) #印出請求失敗的網址
        return "fail" #回傳失敗提示訊息
    else:
        return resp.text #回傳請求成功的html文字

def get_week_new_movies(webpage): #抓取電影資訊
    soup = BeautifulSoup(webpage, 'html.parser') #網頁解析
    movies = [] #域設電影資訊存這裡 
   
    #抓取<div class="release_info_text"></div>內文字
    rows = soup.find_all('div', 'release_info_text')
    data_movie = dict()
    #print(rows)
    for row in rows:
        data_movie = dict() #存成{"key":"value"}格式
        #電影名稱
        data_movie['ch_name'] = row.find('div', 'release_movie_name').a.text.strip()
        #print(data_movie)#每一圈 都會被取代成下一筆資料 data_movie['ch_name']
        #第一圈
        #data_movie['ch_name']={'ch_name': '逃'}
        #第二圈
        #data_movie['ch_name']={'ch_name': '名偵探柯南:紅之校外旅行 鮮紅篇&戀紅篇'}
        #第三圈
        #data_movie['ch_name']={'ch_name': '惡童當街 經典重映'}
        movies.append(data_movie) #再被取代前先存入for 外面的movies=[]
        #第一圈存入
        #[{'ch_name': '逃'}]
        #第二圈存入
        #[{'ch_name': '逃'}, {'ch_name': '名偵探柯南:紅之校外旅行 鮮紅篇&戀紅篇'}]
        #第三圈存入
        #[{'ch_name': '逃'}, {'ch_name': '名偵探柯南:紅之校外旅行 鮮紅篇&戀紅篇'}, {'ch_name': '惡童當街 經典重映'}]
        #print(movies)
    return movies
 
if __name__ == '__main__':
    webpage = check_req_url(yahoo_movie_url)
    #print(webpage)
    
    if webpage:
        movies = get_week_new_movies(webpage)
        print(movies)
   
    

接下來練習抓取其他資料:

期待度、英文名稱、電影介紹

for row in rows:
        data_movie = dict() #存成{"key":"value"}格式
        #電影名稱
        data_movie['ch_name'] = row.find('div', 'release_movie_name').a.text.strip()
        #英文名稱
        data_movie['english_name'] = row.find('div', 'release_movie_name').find('div', 'en').a.text.strip()
        #電影介紹
        data_movie['info'] = row.find('div', 'release_text').text.strip()
        #期待度
        data_movie['expectation'] = row.find('div', 'leveltext').span.text.strip()

 

完整:

#目標位置>>Yahoo>>電影>>Yahoo本週新片
#https://tw.movies.yahoo.com/movie_thisweek.html

import requests
from bs4 import BeautifulSoup

#Yahoo電影
yahoo_movie_url = 'https://tw.movies.yahoo.com/movie_thisweek.html' #目標位置

def check_req_url(url): #測試請求網址是否請求成功
    resp = requests.get(url) #請求網址
    #print(resp.status_code) #錯誤時404,成功時200
    if resp.status_code != 200:  #如果請求失敗
        print('Invalid url:', resp.url) #印出請求失敗的網址
        return "fail" #回傳失敗提示訊息
    else:
        return resp.text #回傳請求成功的html文字

def get_week_new_movies(webpage): #抓取電影資訊
    soup = BeautifulSoup(webpage, 'html.parser') #網頁解析
    movies = [] #域設電影資訊存這裡 
   
    #抓取<div class="release_info_text"></div>內文字
    rows = soup.find_all('div', 'release_info_text')
    data_movie = dict()
    #print(rows)
    for row in rows:
        data_movie = dict() #存成{"key":"value"}格式
        #電影名稱
        data_movie['ch_name'] = row.find('div', 'release_movie_name').a.text.strip()
        #英文名稱
        data_movie['english_name'] = row.find('div', 'release_movie_name').find('div', 'en').a.text.strip()
        #電影介紹
        data_movie['info'] = row.find('div', 'release_text').text.strip()
        #期待度
        data_movie['expectation'] = row.find('div', 'leveltext').span.text.strip()
       
        
        #預告片
        #print(data_movie)#每一圈 都會被取代成下一筆資料 data_movie['ch_name']
        #第一圈
        #data_movie['ch_name']={'ch_name': '逃'}
        #第二圈
        #data_movie['ch_name']={'ch_name': '名偵探柯南:紅之校外旅行 鮮紅篇&戀紅篇'}
        #第三圈
        #data_movie['ch_name']={'ch_name': '惡童當街 經典重映'}
        movies.append(data_movie) #再被取代前先存入for 外面的movies=[]
        #第一圈存入
        #[{'ch_name': '逃'}]
        #第二圈存入
        #[{'ch_name': '逃'}, {'ch_name': '名偵探柯南:紅之校外旅行 鮮紅篇&戀紅篇'}]
        #第三圈存入
        #[{'ch_name': '逃'}, {'ch_name': '名偵探柯南:紅之校外旅行 鮮紅篇&戀紅篇'}, {'ch_name': '惡童當街 經典重映'}]
        #print(movies)
    return movies

if __name__ == '__main__':
    webpage = check_req_url(yahoo_movie_url)
    #print(webpage)
    
    if webpage:
        movies = get_week_new_movies(webpage)
        print(movies)
   
    

 

Yiru@Studio - 關於我 - 意如