28 พฤษภาคม 2559

Published พฤษภาคม 28, 2559 by with 0 comment

ดึงข้อมูลราคาน้ำมันด้วยภาษา Python

สวัสดีผู้อ่านทุกท่านครับ บทความนี้ผมจะพาผู้อ่านไปเขียนโปรแกรมดึงข้อมูลราคาน้ำมันด้วยภาษา Python เพื่อนำไปใช้งานต่อยอดต่อไปครับ

แท่นขุดเจาะน้ำมันกลางทะเล - ดึงข้อมูลราคาน้ำมันด้วยภาษา Python แท่นขุดเจาะน้ำมันกลางทะเล

ผู้จำหน่ายน้ำมันรายใหญ่ที่สุดในไทย คงหนีไม่พัน ปตท. ปัจจุบันนี้ ราคาน้ำมันมีผลกระทบต่อราคาสินค้าต่าง ๆ ในไทย เพราะการขนส่งทำใช้น้ำมันเป็นต้นทุนการจัดจำหน่ายสินค้า และมีผลกระทบต่อประชาชนที่ใช้รถยนต์และจักรยานยนต์ในการเดินทางไปทำงานเป็นต้น ดังนั้นราคาน้ำมันจึงมีผลกระทบต่อเศรษฐกิจของไทย

ทาง ปตท. ได้มีเว็บเซอร์วิสสำหรับให้นักพัฒนาภายนอกสามารถดึงข้อมูลราคาน้ำมันมาใช้งานได้

เนื่องจากหน้าเว็บเซอร์วิสอยู่ในรูปแบบ WSDL (SOAP) เราจึงไม่สามารถดึงข้อมูลมาได้แบบตรง ๆ  ต้องใช้โมดูล SOAP client เข้ามาช่วย




ผมขอแนะนำโมดูล suds ซึ่งเป็นโมดูล SOAP client ในภาษา Python

  • ใช้ (LGPL) GNU Lesser General Public License 3

  • รองรับทั้ง Python 2 และ Python 3 (fork)

การติดตั้ง
เฉพาะ Python 2 เท่านั้น
ใช้คำสั่ง :
easy_install https://fedorahosted.org/releases/s/u/suds/python-suds-0.4.tar.gz

เฉพาะ Python 3 เท่านั้น

ใช้คำสั่ง :
pip install suds-py3

หน้าเว็บ https://fedorahosted.org/suds/ และ https://github.com/cackharot/suds-py3
อ่านเอกสารการใช้งานโมดูล suds ได้ที่ https://fedorahosted.org/suds/wiki/Documentation




เรามาลงมือเขียนโปรแกรมดึงข้อมูลกันเลยครับ
from suds.client import Client
client = Client('https://www.pttor.com/OilPrice.asmx?WSDL')
OilPrice = client.service.CurrentOilPrice(Language='thai')
# หากต้องการใช้ GetOilPrice ให้แก้เป็น client.service.GetOilPrice(รายละเอียดตามเอกสาร)
print(OilPrice)
print(type(OilPrice))
ผลลัพธ์
<class 'suds.sax.text.Text'>

จะเห็นได้ว่า ได้ผลลัพธ์เป็นสตริงที่มีโครงสร้าง XML อยู่ภายในสตริง เนื่องจากผมไม่ค่อยชอบ XML ผมจึงทำการแปลง XML ให้กลายเป็น JSON ด้วยโมดูล xmltodict (อ่านเพิ่มเติมได้ที่ โมดูล xmltodict และ json ในภาษา Python)
import xmltodict, json
OilPrice1 = xmltodict.parse(OilPrice) # ได้ผลลัพธ์เป็น json ในสตริง
Price = eval(json.dumps(OilPrice1)) # เรียกใช้งาน json ในสตริง
print(Price)

ผลลัพธ์

{'PTT_DS': {'DataAccess': [{'PRICE': '32.56', 'PRICE_DATE': '2016-05-19T05:00:00+07:00', 'PRODUCT': 'Blue Gasoline 95'}, {'PRICE_DATE': '2015-06-05T05:00:00+07:00', 'PRODUCT': 'Blue Gasoline 91'}, {'PRICE': '24.69', 'PRICE_DATE': '2016-05-19T05:00:00+07:00', 'PRODUCT': 'Blue Diesel'}, {'PRICE': '25.18', 'PRICE_DATE': '2016-05-19T05:00:00+07:00', 'PRODUCT': 'Blue Gasohol 91'}, {'PRICE': '23.04', 'PRICE_DATE': '2016-05-19T05:00:00+07:00', 'PRODUCT': 'Blue Gasohol E20'}, {'PRICE': '12.63', 'PRICE_DATE': '2016-05-16T00:01:00+07:00', 'PRODUCT': 'NGV'}, {'PRICE': '25.6', 'PRICE_DATE': '2016-05-19T05:00:00+07:00', 'PRODUCT': 'Blue Gasohol95'}, {'PRICE_DATE': '2009-10-01T05:00:00+07:00', 'PRODUCT': 'DIESEL PALM'}, {'PRICE_DATE': '2011-03-01T06:00:00+07:00', 'PRODUCT': 'Blue Diesel B5'}, {'PRICE': '18.89', 'PRICE_DATE': '2016-05-19T05:00:00+07:00', 'PRODUCT': 'Blue Gasohol E85'}, {'PRICE': '27.69', 'PRICE_DATE': '2016-05-19T05:00:00+07:00', 'PRODUCT': 'HyForce Premium Diesel'}]}}

ลองนำข้อมูลราคาน้ำมันที่ได้ไปประยุกต์ใช้งานกันต่อครับ

ติดตามบทความต่อไปนะครับ
ขอบคุณครับ

ต้นตาล @ Wannaphong.com (อีเมล [email protected])
บทความนี้เขียนโดย วรรณพงษ์ ภัททิยไพบูลย์

0 ความคิดเห็น:

แสดงความคิดเห็น

แสดงความคิดเห็นได้ครับ :)