大家應該多多少少都有聽過爬蟲,這裡我就不贅述,對於爬蟲不熟悉的人可以看一下什麼是爬蟲
這次使用的主要module:Requests, Beautifulsoup 和 Pandas,前兩者用來爬取資料,後者用來儲存成資料格式。
這次的實作目標為爬取 Yahoo!電影-本週新片的資訊為目標,包含預告片網址,滿意度,上映日期等等。
首先當然要先安裝,我使用的IDE為PyCharm,這裡教的就是Pycharm下載libs的方式
首先,點擊右下角interpreter的地方,點進interpreter setting。
進入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 BeautifulSoupdef 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: