สวัสดีครับ ยินดีตอนรับสู่ Python Dev บทความแรกนะครับ โดยบทความนี้เกิดจากความขี้เกียจทำให้ต้องหาวิธีในการช่วยทำให้ชีวิตง่ายขึ้น ซึ่งบทความนีจะเกี่ยวกับการใช้งาน Google อ่าน Blog ให้ฟังตามหัวข้อเลยครับ
เรามาเตรียมตัวก่อนเขียนโค้ดกันครับ
1. ให้ทำการลง virtual environment ก่อนนะครับ โดยผมจะใช้ตัว virtualenv นะครับ ด้วยคำสั่ง
1. ให้ทำการลง virtual environment ก่อนนะครับ โดยผมจะใช้ตัว virtualenv นะครับ ด้วยคำสั่ง
- pip install virtualenv
- pip install requests (สำหรับดึงข้อมูลจาก web)
- pip install beautifulsoup4 (สำหรับเอาข้อมูลเฉพาะที่ต้องการ ที่ได้จาก requests)
- pip install trafilatura (ดำข้อมูลจาก beautifulsoup4 มาแปลงเป็นข้อความ โดยจะตัดสิ่งที่ไม่จำเป็นออกให้)
- pip install gTTS (google Text To Speech แปลงข้อความเป็นเสียง)
หลังจากที่เรา install pip ที่ต้องการแล้วก็มาเริ่มกันเลยครับ
โดยเว็บที่เราจะให้ python ดึงเป็นตัวอย่างจะเป็น เว็บ unity.com นะครับ
1. ให้เราทำการสร้าง virtualenv ของเราขึ้นมาด้วยคำสั่ง
virtualenv -p python .
หลังจากรันแล้วให้ทำการ activate โดยพิมพ์
Scripts\activate
2. จากนั้นให้ทำการสร้าง python file ชื่อว่า unity.py และทำการใส่ code ดังนี้
import requests
from bs4 import BeautifulSoup
import trafilatura
from gtts import gTTS
import os
# 1. ดึงข้อมูลจาก web
URL = 'https://blogs.unity3d.com/feed'
page = requests.get(URL)
# 2. นำข้อมูลที่ได้จาก web มาทำการหา title และ link ที่ต้องการจะอ่าน
soup = BeautifulSoup(page.content, 'xml')
elems = soup.find_all('item')
# 3. สร้าง Folder สำหรับเก็บ Files
path = './unity'
isExist = os.path.exists(path)
if(isExist == False):
os.mkdir(path)
# หลังจากที่ได้ข้อมูล content แล้วก็นำมา สร้างเป็น file เสียง
for elem in elems:
# 4. ข้อมูลดิบที่ได้จะมี tag html ติดมาอยู่
raw_title = elem.find('title')
raw_link = elem.find('link')
# 5. นำข้อมูลดิบมาแปรรูป โดยการตัด tag html
title = (raw_title.text.strip())
link = (raw_link.text.strip())
# 6. หาชื่อ file name และกำหนด path file
fileName = (link.rsplit('/', 2)[-2])
filePath = path + '/' + fileName + '.mp3'
# 7. กรณีเคย สร้าง file มาแล้วให้ทำการ หาอันถัดไป จะได้ไม่ต้องสร้างซ้ำ เปลืองเน็ต
if(os.path.exists(filePath)):
continue
# 8. จากนั้นทำการเอา link ไปหา content ในแต่ละ page
downloaded = trafilatura.fetch_url(link)
result = trafilatura.extract(downloaded)
# 9. ทำการตัดข้อความที่ไม่ต้องการออก จากตัวอย่างคือการตอบ replies
stxt = result.split('replies')[0]
# 10. ทำการแปลง file และ save file
tts = gTTS(text=stxt,lang='th')
tts.save(filePath)
คำอธิบาย
1. เป็นการดึงข้อมูลจากเว็บนะครับ โดยเว็บที่เราดึงสามารถ เป็น RSS Feed หรือ เว็บ HTML ทั่วไปก็ได้นะครับ
2. จากนั้นกำหนดชนิดของ content เป็น xml หรือ html ขึ้นอยู่กับ ข้อ 1 และทำการอ่านข้อมูลใน tag item ดังรูป
โดยสิ่งที่เราต้องการคือ title กับ link นะครับ
1. เป็นการดึงข้อมูลจากเว็บนะครับ โดยเว็บที่เราดึงสามารถ เป็น RSS Feed หรือ เว็บ HTML ทั่วไปก็ได้นะครับ
2. จากนั้นกำหนดชนิดของ content เป็น xml หรือ html ขึ้นอยู่กับ ข้อ 1 และทำการอ่านข้อมูลใน tag item ดังรูป
โดยสิ่งที่เราต้องการคือ title กับ link นะครับ
3. ทำการสร้าง folder เก็บ files
4. อ่าน หัวข้อ และ link เป็นข้อมูลดิบ
5. จากนั้นทำการตัด tag html ออก เพื่อนำ link ไปอ่านข้อมูลข้างใน
6. ทำการ split '/' จากทางด้านขวา และ นำชื่อ link มาเป็น ชื่อไฟล์ ตัวอย่าง
https://blogs.unity3d.com/2020/11/24/how-unity-reflect-is-powering-retima/
เมื่อเราทำการ split และ เอาตำแหน่งที่ -2 ก็จะได้ชื่อไฟล์ว่า how-unity-reflect-is-powering-retima
7. หากมีการสร้างซ้ำให้ทำการ หา link ถัดไป
8. จากนั้นทำการส่ง link เข้าไปเพื่อเอา content ที่ต้องการออกมา
9. ทำการ split replies เพื่อเอาเฉพาะข้อความข่าว
10. แปลง และ save file จากนั้นก็ทำการวน บันทึก หัวข้ออื่นๆ
4. อ่าน หัวข้อ และ link เป็นข้อมูลดิบ
5. จากนั้นทำการตัด tag html ออก เพื่อนำ link ไปอ่านข้อมูลข้างใน
6. ทำการ split '/' จากทางด้านขวา และ นำชื่อ link มาเป็น ชื่อไฟล์ ตัวอย่าง
https://blogs.unity3d.com/2020/11/24/how-unity-reflect-is-powering-retima/
เมื่อเราทำการ split และ เอาตำแหน่งที่ -2 ก็จะได้ชื่อไฟล์ว่า how-unity-reflect-is-powering-retima
7. หากมีการสร้างซ้ำให้ทำการ หา link ถัดไป
8. จากนั้นทำการส่ง link เข้าไปเพื่อเอา content ที่ต้องการออกมา
9. ทำการ split replies เพื่อเอาเฉพาะข้อความข่าว
10. แปลง และ save file จากนั้นก็ทำการวน บันทึก หัวข้ออื่นๆ
หวังว่าจะมีประโยชน์ไม่มากก็น้อยนะครับ
ขอบคุณครับ
ขอบคุณครับ