[爬蟲系列]Python爬蟲入門實作(一)—Yahoo本週新片資訊

nana ba
9 min readMar 11, 2021

--

大家應該多多少少都有聽過爬蟲,這裡我就不贅述,對於爬蟲不熟悉的人可以看一下什麼是爬蟲

這次使用的主要module:Requests, Beautifulsoup 和 Pandas,前兩者用來爬取資料,後者用來儲存成資料格式。

這次的實作目標為爬取 Yahoo!電影-本週新片的資訊為目標,包含預告片網址,滿意度,上映日期等等。

首先當然要先安裝,我使用的IDE為PyCharm,這裡教的就是Pycharm下載libs的方式

首先,點擊右下角interpreter的地方,點進interpreter setting。

前面是使用python的版本,後面為環境名稱

進入interpreter setting後,點擊左下角的+號(代表install)。

點進install頁面之後,用搜尋欄找到要用的lib再按下install Package就可以了

安裝好之後,就可以來import剛剛那些lib,pandas我們晚點再導入

import requests
from bs4 import BeautifulSoup

initial需要用到的資料結構

#Yahoo本週新片網址,字串
url = 'https://movies.yahoo.com.tw/movie_thisweek.html'
#用來儲存爬取到的每一筆資料,列表
content = []
#改變頁數以繼續爬取,字典
kv = {'page': 1}

接下來利用requests獲取url的資訊,利用Get方法請求伺服器網頁內容,再利用status_code來檢查是否成功,後面的params則是會利用字典的內容修改url,現在page的值1,url就會是

https://movies.yahoo.com.tw/movie_thisweek.html?page=1

等爬完第一頁後再利用迴圈讓page的值+1便可以爬取下一頁

url = ‘https://movies.yahoo.com.tw/movie_thisweek.html'
resp = requests.get(url, params =kv)
print(resp.status_code) #200則表示成功

請求成功後,我們將訪問到的內容傳入Beautifulsoup裡面,Beautifulsoup是非常優秀的爬蟲模組,可以對特定目標篩選、擷取、分析等等。

#中文內容編碼為utf-8
resp.encoding = ‘utf-8’
#text擷取文字內容,使用lxml作為解析器
soup = BeautifulSoup(resp.text, ‘lxml’)
#打印出網站框架
print(soup)

此時看到的網站框架應該為HTML形式,至此已經算是將資料全部爬取下來,再來就是從中擷取我們所需的資訊了

本段完整的程式碼

#import libs we need
import requests
from bs4 import BeautifulSoup
import pandas as pd
#Yahoo本週新片網址,字串
url = 'https://movies.yahoo.com.tw/movie_thisweek.html'
#用來儲存爬取到的每一筆資料,列表
content = []
#改變頁數以繼續爬取,字典
kv = {'page': 1}
#請求伺服器下載資料內容
resp = requests.get(url,params=kv)
#中文內容編碼為utf-8
resp.encoding = ‘utf-8’
#text擷取文字內容,使用lxml作為解析器
soup = BeautifulSoup(resp.text, ‘lxml’)
#打印出網站框架
print(soup)

先介紹這次會用到的Beautifulsoup的功能

text — 去除網頁框架只查看文字

find — 回傳第一個符合的Html tag

find_all — 回傳所有符合的Html tag

find_next—從目前所在位置, 回傳下一個符合的Html tag

了解以上功能後,來查看Yahoo電影的網站架構,發現每一部新片的資訊都放在release_move_name的<div>後面

所以我們就利用find_all的功能把這部分的資訊擷取出來,再使用for迴圈逐一取出每一個’release_movie_name’裡面的內容。

舉個例子,中文名稱被放在a tag裡,所以我用find_next(‘a’)來擷取內容,也就是從<div class=”release_movie_name”>這邊開始往下找到的第一個a tag,裡面的文字內容就是電影中文名字,文字內容用.string來取出。剩下的大家可以自己打開網頁架構觀察,最後再把資料儲存到一開始content list即可。

rows = soup.find_all('div', class_='release_movie_name')for row in rows:
# 中文名稱
name = row.find_next('a')
ch_name = name.string.strip('\n').strip()
# 英文名稱
en_name = name.find_next('a')
en_name = en_name.string.strip('\n').strip()
# 預告
trailer = row.find('a')['href']
# 評分
rate = row.find_next('span').string
# 上映時間
release_time = row.find_next('div', attrs={'class': "release_movie_time"}).string
release_time = release_time.split(':')[-1].strip()

c = [ch_name, en_name, trailer, rate, release_time]
content.append(c)

統整一下目前完整的爬蟲架構,創建一個crawler.py將它寫成函式

crawler.py

import requests
from bs4 import BeautifulSoup
def new_movie(page, url):
url = url
content = []
page = page
kv = {'page': 1}
for i in range(page):

resp = requests.get(url, params=kv)

soup = BeautifulSoup(resp.text, 'lxml')

rows = soup.find_all('div', class_='release_movie_name')

for row in rows:
# 中文名稱
name = row.find_next('a')
ch_name = name.string.strip('\n').strip()
# 英文名稱
en_name = name.find_next('a')
en_name = en_name.string.strip('\n').strip()
# 預告
trailer = row.find('a')['href']
# 評分
rate = row.find_next('span').string
# 上映時間
release_time = row.find_next('div', attrs={'class': "release_movie_time"}).string
release_time = release_time.split(':')[-1].strip()

c = [ch_name, en_name, trailer, rate, release_time]
content.append(c)
#修改url的?page值,加一就是下一頁
kv['page'] += 1
return content

接著創建一個儲存成資料格式的main.py,此時我們就可以導入pandas,還有其他輔助的模組,並寫成函式

main.py

import crawler
#取得路徑用
import os
#時間戳
import datetime
#資料儲存
import pandas as pd

def list_to_csv(url, page):
#表格title
columns = ['中文名稱', '英文名稱', '預告片網址', '評分', '上映時間']
#呼叫crawler.py中的new_movie函式
new_movie_list = crawler.new_movie(page=page, url=url)
#時間戳
timestamp = datetime.datetime.now().strftime('%Y%m%d')
timestamp = timestamp[:4] + '-' + timestamp[4:6] + '-' + timestamp[6:9]
#轉成DataFrame
df = pd.DataFrame(new_movie_list, columns=columns)

#儲存成csv檔案
filename = 'new movie list' + timestamp + '.csv'
df.to_csv(filename, index=False)
print(f'文件{filename}已成功保存至{os.getcwd()}')

最後只要執行main.py就完成了

輸出的檔案格式

sample code:

--

--