講者:邱妍瑛
日期:2020 / 02 / 12
Preparation
新建資料夾並開啟虛擬環境
$ mkdir 資料夾名稱
$ cd 到剛剛新增的資料夾
$ pipenv --three
$ pipenv shell
一共有六個套件要安裝
$ pipenv install flask
$ pipenv install line_bot_sdk
$ pipenv install gunicorn
$ pipenv install requests
$ pipenv install BeautifulSoup4
$ pipenv install lxml
裝完可以打開 pipfile 確認都有安裝成功
coding time
目標是爬取開眼電影網的本週新片:
import requests
from bs4 import BeautifulSoup
import requests
from bs4 import BeautifulSoup
#GET請求
r = requests.get('http://www.atmovies.com.tw/movie/new/')
r.encoding = 'utf-8'
import requests
from bs4 import BeautifulSoup
#GET請求
r = requests.get('http://www.atmovies.com.tw/movie/new/')
r.encoding = 'utf-8'
soup = BeautifulSoup(r.text, 'lxml')
print(soup)
Python 在解析網頁時預設用 Unicode 去解析,輸出格式會與系統編碼格式不同,因而導致中文輸出亂碼。
r.encoding = 'utf-8'
<a href="連結">電影名稱 </a>
打開網頁的開發人員工具
import requests
from bs4 import BeautifulSoup
r = requests.get('http://www.atmovies.com.tw/movie/new/')
r.encoding = 'utf-8'
soup = BeautifulSoup(r.text, 'lxml')
filmTitle = soup.select('div.filmTitle a')
print(filmTitle)
[<a href="/movie/fben51502397/">絕地戰警 FOR LIFE Bad Boys for Life </a>,
<a href="/movie/fjen64916630/">不完美的正義 Just Mercy </a>,
<a href="/movie/fskr58999329/">青春催落去 Start-Up </a>
......
此時的輸出結果
[<a href="/movie/fben51502397/">絕地戰警 FOR LIFE Bad Boys for Life </a>,
<a href="/movie/fjen64916630/">不完美的正義 Just Mercy </a>,
<a href="/movie/fskr58999329/">青春催落去 Start-Up </a>
......
原本的輸出結果
import requests
from bs4 import BeautifulSoup
r = requests.get('http://www.atmovies.com.tw/movie/new/')
r.encoding = 'utf-8'
soup = BeautifulSoup(r.text, 'lxml')
filmTitle = soup.select('div.filmTitle a')
print(filmTitle[0].text)
print("http://www.atmovies.com.tw" + filmTitle[0]['href'])
在 html 的語法中,
超連結的語法是這樣表示的:
參考資料:HTML a href 連結屬性
<a href="要連結的 URL 會放在這裡">
由於是要讓使用者在 line 裡面使用,
因此一次給太多數量的電影或多或少會造成使用者的困擾,
所以加上數量限制是必要的。
計算傳了幾個?
限制數量?
計算傳了幾個
i = 0
num = ['one', 'two', 'three']
for i in range(0,3):
print(num[i],i)
平常我們在用 for 迴圈時大概會是這樣:
0 one
1 two
2 three
此時的輸出結果:
num = ['one', 'two', 'three']
for i, element in enumerate(num):
print(i, element)
可以使用 enumerate() 函数更簡潔的達成此目標
import requests
from bs4 import BeautifulSoup
r = requests.get('http://www.atmovies.com.tw/movie/new/')
r.encoding = 'utf-8'
soup = BeautifulSoup(r.text, 'lxml')
filmTitle = soup.select('div.filmTitle a')
content = ""
for i, data in enumerate(filmTitle):
print(i) #可以印出 i 來看看
content += data.text + "\n" + "http://www.atmovies.com.tw/"
+ data['href'] + "\n\n"
print(content)
這邊是設定當使用者輸入「本周新片」時,就會觸發 class 裡面寫的程式碼。
在本地端測試無誤後,即可發佈到 heroku 上,就完成電影查詢 line bot 了。
if event.message.text == '本周新片':
coding time
web: gunicorn 你的檔名(不用加副檔名):app
# 像是 web: gunicorn app:app
新增 Procfile
.env
新增 .gitignore
在 .gitignore 的檔案中寫入不想被上傳的檔案像是這邊的 .env
$ quit
$ pipenv shell
重新開啟虛擬環境
先到 Heroku 的頁面點 Create New App
$ heroku login
$ cd 到放剛剛檔案的資料夾
$ git init
$ heroku git:remote -a 你剛剛新增的app的名稱
發佈到 heroku 上 -1
$ git add .
$ git commit -am "你想要留下的說明"
$ git push heroku master
發佈到 heroku 上 -2
點選 open app
複製網址並更改 line 那邊的網址