[Python] เขียน API ดึงรูปแมวเหมียวมาเซฟด้วย Requests Library !

[เขียนโค้ด] เขียน API เซฟรูปแมวเหมียวด้วย Requests Library!

เราจะมาเข้าใจการใช้ Requests ด้วยวิธีง่ายๆ ด้วยการทำเรื่องง่ายๆ อย่างเช่นตัวอย่างที่จะอธิบายต่อไปนี้ คือการดึงรูปมาเซฟ นั่นเอง

เริ่มต้นเลย! เรามีเว็บไซต์ง่ายๆ http://placekitten.com/ ที่เพียงแค่ใส่ image size ใน URL ก็สามารถได้รูปแมวเหมียวขึ้นมา

เช่น http://placekitten.com/g/300/200

kittens

นั่นคือ กว้าง 300 px, สูง 200 px

สิ่งต่อไปคือ เราจะเซฟรูปยังไงนะ?

คีย์ลัดของเราคือ Requests Library

Requests คืออะไร?

Requests คือ HTTP Library ตัวหนึ่งที่เขียนด้วยภาษา Python (for human beings เป็นมิตรกับสุขภาพจิต)  ให้เราส่ง HTTP/1.1 request ไปได้ (https://github.com/kennethreitz/requests)

ตัวอย่างการใช้ requests เช่น

>>> import requests

>>> r = requests.get(https://api.github.com/user’, auth=(‘user’, ‘pass’))

>>> r.status_code

200

>>> r.headers[‘content-type’]

‘application/json; charset=utf8’

>>> r.encoding

‘utf-8’

>>> r.text

u'{“type”:”User”…’

>>> r.json()

{u’private_gists’: 419, u’total_private_repos’: 77, …}

เริ่มต้นด้วยการ install package นี้เข้าเครื่อง

ด้วยคำสั่ง

$ pip install requests

หรือจะ clone มาโดยตรงจากผู้สร้างก็ได้

$ git clone git://github.com/kennethreitz/requests.git

จากนั้นเราก็เริ่มโค้ดกันได้เลย!

เริ่มต้น ทำกรอบง่ายๆด้วยการสร้าง class และแบ่งเป็นคอนเซปง่ายๆดังนี้

import requests

class Kitten():

   // 1. ทำ url ให้สมบูรณ์ : การที่เราจะดึงข้อมูลจาก placekitten ได้ เราจะต้องรู้ที่อยู่ (url) ของไฟล์ที่เราต้องการจะเซฟก่อน โดยการป้อนwidth และ height เข้าไป

   // 2. เขียน request เพื่อที่จะดึงข้อมูลนั้น

   // 3. นำข้อมูลที่ดึงมา เขียนลงไฟล์ที่เราสร้างขึ้นมาในเครื่อง (เซฟรูป)

  1. เราต้องการจะทำให้ได้รูปตามที่ความยาวและความกว้างที่เรากำหนด custom เอง ดังนั้นจึงสร้างตัวแปรรับค่า

width = raw_input(“How wide do you want image to be?”)

height = raw_input(“How tall do you want image to be?”)

ค่า url ที่ได้จึงควรจะเป็น

url = “http://placekitten.com/g/” + width + “/” + height

เท่านั้นเราก็ได้ url แล้ว!

  1. สิ่งถัดไปคือ เมื่อเราได้ที่อยู่ของข้อมูลแล้ว เราก็เขียน API เรียก request เพื่อเอาค่านั้นมา โดยวิธี requests.get()

kitten = requests.get(url)

และค่าที่เราได้จะนำไปเก็บที่ตัวแปร kitten

3. นำข้อมูลที่ดึงมาเรียบร้อยแล้วลงไฟล์ที่เราสร้าง !

f = open(“kittens.png”, “w”)  // open() เป็นฟังก์ชั่น built-in ของ python เพื่อบอกว่าต้องการจะเขียนไฟล์ png ขึ้นมาใหม่ ชื่อว่า kittens แต่แค่เปิดไว้เฉยๆ ยังไม่ได้ทำอะไร

f.write(kitten.content)  // นำข้อมูลที่เราได้ดึงมาก่อนหน้า นำมาเขียนลง kittens.png ที่เปิดคาไว้ให้แล้ว

f.close // ปิดไฟล์

สังเกตว่าข้อมูลที่ดึงมานั้น( kitten) จะใช้เฉยๆไม่ได้ เพราะเราได้ kitten เป็น object ที่เป็น dictionary

ถ้าเราลอง kitten.__dict__ ดู จะเจอ

{‘cookies’: <RequestsCookieJar[Cookie(version=0, name=’__cfduid’, value=’df2b7c0cd57b968b95249e432bca8a3b91482412416′, port=None, port_specified=False, domain=’.placekitten.com’, domain_specified=True, domain_initial_dot=True, path=’/’, path_specified=True, secure=False, expires=1513948416, discard=False, comment=None, comment_url=None, rest={‘HttpOnly’: None}, rfc2109=False)]>, ‘_content’: ‘\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x00\x00\x01\x00\x01\x00\x00\xff\xfe\x00;CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), quality = 65\n\xff\xdb\x00C\x00\x0b\x08\x08\n\x08\x0…. บลาๆเยอะมาก ‘ }

ใน content นั่นเองที่เก็บข้อมูลรูปภาพอยู่ นั่นคือต้องใช้ kitten.content เขียนลงไปในไฟล์ใหม่

จบคอนเซปหลักๆ เราก็ fill in โค้ดได้เลย

import requests

class Kitten():

    def get_width_and_height(self, width, height):       /// ฟังก์ชั่น เพื่อรับค่า input ของ weight และ height

        self.width = width

        self.height = height

        return (self.width, self.height)

    def get_image(self): /// ฟังก์ชั่น เพื่อสร้างรูปภาพขึ้นมา

        url = “http://placekitten.com/g/&#8221; + self.width + “/” + self.height   

        kitten = requests.get(url)

        f = open(“kittens.png”, “w”)

        f.write(kitten.content)

        f.close

        return url

width = raw_input(“How wide do you want image to be”)             

height = raw_input(“How tall do you want image to be”)

x = Kitten()

x.get_width_and_height(width, height) /// instantiate เพื่อนำค่า width และ height เข้าฟังก์ชั่นแรก

x.get_image()

จากนั้นเมื่อเรารันไฟล์ ก็จะมีคำสั่ง How wide/tall do you want image to be ?  ให้เราป้อนขนาดรูปภาพที่ต้องการลงไป

คราวนี้ใน path เราก็มีรูปแมวเหมียวขึ้นมาแล้ว เย้

400

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.