ทำ Web Scraping ด้วย BeautifulSoup

ทำ Web Scraping ด้วย BeautifulSoup กัน

สำหรับ Blog นี้เราจะมาดูวิธีการทำ Web scraping ด้วย Python3 และ BeautifulSoup ในระดับ Basic มากกกกกกกกกกกกก กันดูนะ :)

ก่อนที่เราจะเริ่มทำ web scraping เรามาเรียนรู้พื้นฐานเรื่อง website กันก่อนดีกว่า


Componenet of web page

เมื่อเราเข้าไปที่ web page ซัก url นึงแล้ว web browser ของเราก็จะทำการ request ไปที่ web server เราจะเรียกการ request ประเภทนี้ว่า GET request เนื่องจากเรา request ไปที่ server แล้วเราก็จะได้ file จาก server กลับมาเพื่อที่จะบอกกับ web browser นี้ว่าเราจะแสดงหน้า web page ของเราอย่างไร ซึ่งเนื้อหาใน file ที่กลับมาก็จะมีส่วนประกอบคร่าวๆ ดังนี้

  • HTML : เป็นเนื้อหาหลักของหน้านั้นๆ
  • CSS : เป็นตัวจัดการตกแต่ง HTML ของเราให้สวยงาม ดูดีขึ้น
  • JS : เป็นตัวจัดการ interactive ของ HTML ของเราให้ดีขึ้น
  • Image : รูปภาพใน format เช่น JPG , PNG สำหรับแสดงบน web

หลังจาก web browser ได้รับดังกล่าวมาแล้ว ก็จะทำการ render ออกมาสวยงามตามที่เราเห็นกันเป็นปกติ


HTML

HyperText Markup Language (HTML) คือ ภาษาสำหรับสร้าง web page ไม่ใช่ภาษา programming เหมือน python โดยตัว HTML จะเป็นตัวบอก web browser ว่าจะต้องทำการวาดโครงสร้างหน้าตาออกมาเป็นอย่างไร

เอาล่ะ เรามาทำความเข้าใจตัว HTML กันอย่างรวดเร็วกันดีกว่า HTML ประกอบไปด้วย tag <> โดยจะเริ่มด้วย <html> ซึ่งจะเป็นตัวบอก browser ว่าภายใต้สิ่งนี้คือสิ่งที่เราต้องการจะวาด ถ้าเราลองสร้าง file html เราก็จะได้ประมาณนี้

<html>  
</html>

ต่อมาภายใน <html> เราสามารถใส่ tag head และ tag body เพื่อแยกส่วน content ต่างๆในหน้า web page ของเราได้

<html>  
  <head>  
  </head>  
  <body>  
  </body>  
</html>

ตอนนี้เราจะเพิ่มเนื้อหาใน web page ของเราด้วย tag p โดย p คือ paragraph

และทำการใส่ css class และใส่ id ดังนี้

<html>  
    <head>  
    </head>  
    <body>  
        <p class="bold-paragraph">  
          Here's a paragraph of text!  
          <a href="https://www.google.com" id="link1">Google</a>  
        </p>  
        <p class="bold-paragraph extra-large">  
          Here's a second paragraph of text!  
          <a href="https://www.python.org" class="link2">Python</a>  
        </p>  
    </body>  
</html>

เราก็จะได้หน้า web page ของเราประมาณนี้


Request Library

ขั้นแรกของการทำ web scraping คือเราต้องทำการ request ไปที่ url ที่เราต้องการจะทำการ scrap ซึ่งเราสามารถใช้ Python library ที่ชื่อว่า request โดยเจ้า lib ตัวนี้จะทำการ GET request ไปที่ web server ของ url ที่เราระบุ และจำทำการ download content ของ web page นั้นมาให้เรา ป่ะๆ ลองทำกันดีกว่า

ทำการ install lib ใน cmd ด้วย pip install request จากนั้นก็เขียน code ตามนี้

เราจะได้ output เป็น <Response [200]> ซึ่งก็คือ request success

ซึ่งตัวเลข status_code ที่ขึ้นต้นด้วย 2 คือ success แต่หากขึ้นต้นด้วย 4 5 คือ error สามารถดูรายละเอียดเพิ่มเติมเรื่อง request status code ได้ที่นี่ click

ถ้าเราลอง print(page.content) เราจะเห็นได้ว่าตัว content ที่เราได้มานั้นดูเข้าใจได้ยาก ดังรูป

b’<!DOCTYPE html>\n\n \n A simple example page\n\n\n

Here is some simple content for this page.

\n \n‘


BeautifulSoup

และแล้วก็ถึงเวลาของพระเอกของเรา เจ้า BeautifulSoup เนี่ยจะมาทำการ parse content ที่เรา download ได้มา ให้มันสวยงามเข้าใจได้ง่ายมากขึ้น ลองกันเลยดีกว่า

ทำการ install pip install beautifulsoup4 จากนั้นก็เขียน code ตามนี้

เราจะได้ output สวยงาม ตามนี้

<!DOCTYPE html>    
<html>   
<head>   
<title>A simple example page</title>  
</head>   
<body>   
<p>Here is some simple content for this page.</p>   
</body>   
</html>

ค้นหา Tags ทั้งหมดบน Content

หากเราได้ content จาก web page ที่เราต้องการมาแล้ว แล้วเราต้องการหา tag p ทั้งหมดที่อยู่บนนั้น เราสามารถทำได้โดยใช้คำสั่ง find_all() เช่น

print(soup.find_all('p')) ต่อจาก ตัวอย่างก่อนหน้า จะได้ list ออกมาตามนี้

[<p>Here is some simple content for this page.</p>]

จะเห็นได้ว่าเจ้า find_all() เนี่ยมัน return ออกมาเป็น list ให้เรา เราจึงสามารถ get position ของ list ได้ด้วย soup.find_all('p')[0].getText() ก็จะได้ผลลัพธ์ตามนี้

Here is some simple content for this page.


ค้นหา Tags ทั้งหมดบน Content ด้วย Class หรือ Id

ลองสร้าง web page ด้วย html ใหม่โดยมีการใส่ class และ id ใหม่ ตามนี้

<html>  
    <head>  
        <title>A simple example page</title>  
    </head>  
    <body>  
        <div>  
            <p class="inner-text first-item" id="first">  
                First paragraph.  
            </p>  
            <p class="inner-text">  
                Second paragraph.  
            </p>  
        </div>  
        <p class="outer-text first-item" id="second">  
            <b>  
                First outer paragraph.  
            </b>  
        </p>  
        <p class="outer-text">  
            <b>  
                Second outer paragraph.  
            </b>  
        </p>  
    </body>  
</html>

แต่ ณ ที่นี้จากเราสามารถยิง url ไปลองได้ที่ https://dataquestio.github.io/web-scraping-pages/ids_and_classes.html โอเคไปเขียน code ลองดึง tag ที่มี id = first ออกมาแสดง ลองเขียน code ตามนี้ดู

soup.find_all(id="first")

เราก็จะได้ผลลัพธ์ของ tag ที่มี id = first ออกมาตามนี้

[<p class="inner-text first-item" id="first">  
                 First paragraph.  
             </p>]

ต่อมาเราจะลองทำการหา tag p ที่มี class outer-tex โดยทำการเขียน code ดังนี้

soup.find_all(‘p’, class_=’outer-text’)

เราก็จะได้ผลลัพธ์ของ tag ที่มี class outer-text ออกมาตามนี้

[<p class="outer-text first-item" id="second">  
 <b>First outer paragraph.</b>  
 </p>, 
 <p class="outer-text">  
 <b>Second outer paragraph.</b>  
 </p>]

มาถึงตรงจุดนี้เราก็จะทำการดึง content จาก web page หรือที่เรียกว่า web scraping กันได้แล้ว อีกทั้งยังสามารถแยกตาม tag , id , class ของ content นั้นได้ด้วย


จบไปแล้วสำหรับ basic การทำ web scraping แบบ baby walk ถ้าติดขัดตรงไหน หรือมีอะไรจะแนะนำ comment หรือ inbox มาได้โดยตรงเลยนะครับ :P

Reference

Source : .