1.抓取 上映日期 : 2020-11-20 中的日期
2.抓取 電影海報圖片的 <img src="url">
抓取目前位置的上一個層級
3.抓取預告片的 url
抓取目前位置的下一個層級
1.抓取 上映日期 : 2020-11-20 中的日期 "2020-11-20"
import re
def get_date(date_str):
# e.x. "上映日期:2017-03-23" -> match.group(0): "2017-03-23"
#記得import re
#1.\d找到數字
#2.要找一整組的所以\d+,+代表1個以上
#3.有可能有'-'
pattern = '\d+-\d+-\d+'
match = re.search(pattern, date_str)
print(match)
print(match.group(0))
if match is None:
return date_str
else:
return match.group(0)
print(match)
認識match.group()
import re
a = "123abc456";
s1=re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0) #123abc456,返回整体
s2=re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1) #123
s3=re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2) #abc
s4=re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3) #456
print(s1);
print(s2);
print(s3);
print(s4);
print(match.group(0))
#上映日期 只抓日期 "上映日期:2020-11-20" -> match.group(0): "2020-11-20"
data_movie['release_date'] = get_date(row.find('div', 'release_movie_time').text)
完整Code:
#目標位置>>Yahoo>>電影>>Yahoo本週新片
#https://tw.movies.yahoo.com/movie_thisweek.html
import requests
import re
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, 'html5lib') #網頁解析
movies = [] #預設電影資訊存這裡
#抓取<div class="release_info_text"></div>內文字
rows = soup.find_all('div', 'release_info_text')
#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()
#上映日期 只抓日期 "上映日期:2020-11-20" -> match.group(0): "2020-11-20"
data_movie['release_date'] = get_date(row.find('div', 'release_movie_time').text)
movies.append(data_movie) #再被取代前先存入for 外面的movies=[]
return movies
def get_date(date_str):
# e.x. "上映日期:2017-03-23" -> match.group(0): "2020-11-20"
#記得import re
#1.\d找到數字
#2.要找一整組的所以\d+,+代表1個以上
#3.有可能有'-'
pattern = '\d+-\d+-\d+'
match = re.search(pattern, date_str)
#print(match)
#print(match.group(0))
if match is None:
return date_str
else:
return match.group(0)
if __name__ == '__main__':
webpage = check_req_url(yahoo_movie_url)
#print(webpage)
if webpage:
movies = get_week_new_movies(webpage)
print(movies)
2.抓取 電影海報圖片的 <img src="url">
目前我們的位置是在
<div class="release_info_text"></div>
所以要到上一個層級 <div class="release_foto"> </div> 去抓海報圖片
#抓取目前位置的上一個層級
#海報圖片(需要在原本路徑下在回上一個層級)
data_movie['poster_url'] = row.parent.find_previous_sibling('div', 'release_foto').a.img['src']
抓取 a 標籤網址內的電影ID
例如: https://movies.yahoo.com.tw/movieinfo_main/%E9%80%83-run-10565
電影id 為 10565
def get_movie_id(url):
try:
movie_id = url.split('-')[-1]
print(movie_id)
except:
movie_id = url
return movie_id
#電影ID
data_movie['movie_id'] = get_movie_id(row.find('div', 'release_movie_name').a['href'])
3.抓取預告片的 url
到下一個層級,find_next_sibling
#預告片
trailer_a = row.find_next_sibling('div', 'release_btn color_btnbox').find_all('a')[1]
print(trailer_a)
movie['trailer_url'] = trailer_a['href'] if 'href' in trailer_a.attrs.keys() else ''
Yiru@Studio - 關於我 - 意如