ข้อมูลโรงงานอุตสาหกรรมกับ Selenium library web scraping

Aunchana Pimpisal
Super AI Engineer
Published in
4 min readFeb 2, 2021

เพื่อนๆ มีปัญหาจากการหาข้อมูลวิจัยในอินเตอร์เน็ตหรือเปล่า Selenium library web scraping คือคำตอบที่ช่วยในการหาข้อมูล

Selenium Python คือ opensource ที่ช่วยในการทดสอบการทำงานของเว็ปผ่าน browser ต่างๆ เช่น Firefox, Internet Explorer, Chrome, Safari เป็นต้น ผ่านภาษา html ซึ่งสามารถกดปุ่มหรือเติมข้อความอัตโนมัติได้ซึ่งการเริ่มใช้นั้นต้องติดตั้ง library ก่อน

pip install selenium

จาดนั้น download driver ซึ่งจะใช้เป็น browser ในการแสดงผล ในที่นี้เลือก Chrome driver และติดตั้ง path (D:python\lib\chromedriver.exe)

เมื่อติดตั้ง selenium เรียบร้อยแล้ว ลองมาทำ web scraping เพื่อ download ข้อมูลโรงงานแยกเป็นพื้นที่ในแต่ละอำเภอกัน เริ่มแรกเข้าไปที่เว็ปไซด์ของกรมโรงงานอุตสาหกรรมตาม url https://www.diw.go.th/hawk/default.php แล้วจะสร้าง bot เพื่อที่จะคลิกตรง “บริการข้อมูล” โดยผ่าน Google Chrome

รูปที่ 1 เว็ปไซด์กรมโรงงานอุตสาหกรรม

ในส่วนของการสร้าง bot ใน python เริ่มต้นด้วยการเรียก url ของกรมโรงงาน อุตสาหกรรม ผ่าน browser google chrome

#import webdriver
from selenium import webdriver
# เรียก webdriver ชี้ไปที่เก็บ path ของ google chrome driver
driver_s = webdriver.Chrome(r'D:\\python\\lib\\chromedriver.exe')
# link ของกรมโรงงานุตสาหกรรม
url_s='https://www.diw.go.th/hawk/default.php'
# driverเรียกใช้ url
driver_s.get(url_s)

เมื่อเรียก browser แล้วกด F12 เพื่อหา keyword ที่จะใช้จากภาษา html จะได้ตามรูปที่ 2 จากนั้นกดที่รูปลูกศรแล้วชี้ไปที่ “บริการข้อมูล”

รูปที่ 2 ภาษา html ของเว็ปไซด์กรมโรงงานอุตสาหกรรม
<a href="content.php?mode=dataservice" title="บริการข้อมูล">บริการข้อมูล</a>

จากภาษา html จะใช้คำว่า “บริการข้อมูล” เป็น keyword ในการคลิกโดยสามารถใช้ keyword ในการหา element ได้ และการหา xpath สามารถทำได้โดยชี้ไปที่ element แล้วคลิกขวากด copy และกด copy full XPath

รูปที่ 3 ภาษา html ของข้อมูลโรงงาน

Selenium สามารถหาตำแหน่งของelement โดยใช้ข้อมูลในภาษา html ซึ่งมีดังนี้

ID = “id”
XPATH = “xpath”
LINK_TEXT = “link text”
PARTIAL_LINK_TEXT = “partial link text”
NAME = “name”
TAG_NAME = “tag name”
CLASS_NAME = “class name”
CSS_SELECTOR = “css selector”

# เพื่อแยกข้อความที่เป็นตัวอักษรจากภาษา php 
from selenium.webdriver.common.by import By
# ให้เวลา WebDriver หา element
from selenium.webdriver.support.ui import WebDriverWait
# condition ที่ถูกยกเว้นของ element
from selenium.webdriver.support import expected_conditions as EC
import time
# webdriver รอ 20s นาทีจนเจอ element ที่หาโดยใช้ตัวหนังสือ("บริการข้อมูล")แล้วคลิก
WebDriverWait(driver_s,20).until(EC.element_to_be_clickable((By.LINK_TEXT,"บริการข้อมูล"))).click()
# แสดงผล 3s (ขึ้นอยู่กับผู้เขียนว่าต้องการแสดงหน้าจอค้างไว้หรือไม่)
time.sleep(3)
#หา element ของ xpathของข้อมูลโรงงาน
driver_s.find_element_by_xpath("/html/body/div[2]/table[1]/tbody/tr/td[2]/table/tbody/tr/td/table/tbody/tr[2]/td/a").click()
# แสดงผล 3s (ขึ้นอยู่กับผู้เขียนว่าต้องการแสดงหน้าจอค้างไว้หรือไม่)
time.sleep(3)
# webdriver รอ 20s นาทีจนเจอ element ที่หาโดยใช้ตัวหนังสือ("Download ข้อมูลโรงงานฯ (Excel)")แล้วคลิก
WebDriverWait(driver_s,20).until(EC.element_to_be_clickable((By.LINK_TEXT,"Download ข้อมูลโรงงานฯ (Excel)"))).click()
# แสดงผล 5s (หน้าจอค้างไว้เพื่อให้ webdriver ปิดหน้าจอ)
time.sleep(5)
# webdriver ปิด chrome
driver_s.quit()
รูปที่ 4 ลำดับ ของ bot ในการกดเว็ปไซด์กรมโรงงาน

ข้อมูลโรงงานแบ่งตามพื้นที่ ตามภาคต่างๆ จังหวัด อำเภอ และตำบลในประเทศไทยซึ่งมีทั้งหมด 928 ไฟล์ ดังนั้นจึงใช้ bot มาช่วยในการ download excel file ทั้งหมด เนื่องจากต้องมีการคลิกตามขั้นตอนแล้วจึง download file ได้โดยมีขั้นตอนดังนี้ ภาค ->จังหวัด -> อำเภอ -> download โรงงานในอำเภอนี้ทั้งหมด

รูปที่ 5 เว็ปไซด์ของกรมโรงงานโดยข้อมูลโรงงานแยกตามพื้นที่

โดยในที่นี้จะใช้ข้อมูลของภาค จังหวัด และอำเภอในประเทศไทยที่เป็นexcel file ข้อมูลมาช่วยในการหา element โดยใช้ keyword ภาค จังหวัด และ อำเภอเพื่อ download file

import pandas as pd# download ข้อมูลภาค จังหวัด และอำเภอ df=pd.read_csv('D:\python\Super_AI2\medium\list_pro.csv')# เปลี่ยนคำว่า"ภาคกลาง"ให้เป็น"กทม. และภาคกลาง" ส่วนภาคอื่นๆเหมือนเดิม
df['ภาค']=df['ภูมิภาคอย่างเป็นทางการ'].apply(lambda x:"กทม. และภาคกลาง" if x=='ภาคกลาง' else x )
รูปที่ 6 excel file ของภาค จังหวัดและอำเภอ

เนื่องจากการ download จะต้องเป็นไปตามขั้นตอนจากภาค ->จังหวัด -> อำเภอ -> download โรงงานในอำเภอนี้ทั้งหมด

list_s,list_p,list_a=[],[],[]#อ่านข้อมูลทีละ row
for index, row in df.iterrows():
# เรียก webdriver ชี้ไปที่เก็บ path ของ google chrome driver
driver = webdriver.Chrome(r'D:\\python\\lib\\chromedriver.exe')
# driver เรียกใช้ 'http://www2.diw.go.th/factory/tumbol.asp'
driver.get('http://www2.diw.go.th/factory/tumbol.asp')
# webdriver รอ 10s นาทีจนเจอ element ที่หาโดยใช้ตัวหนังสือ(row['ภาค]="กทม. และภาคกลาง")แล้วคลิก
WebDriverWait(driver,0).until(EC.element_to_be_clickable((By.LINK_TEXT,row['ภาค']))).click()
# webdriver รอ 10s นาทีจนเจอ element ที่หาโดยใช้ตัวหนังสือ('จ.'+row['ProvinceThai'="จ.กรุงเทพมหานคร")แล้วคลิก
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.LINK_TEXT,'จ.'+row['ProvinceThai']))).click()
#ถ้าสามารถพิมพ์ row['ภาค'],'จ.'+row['ProvinceThai'],
'อ.'+row['DistrictThaiShort'] ได้ให้ทำคำสั่งต่อไป
try:
print(row['ภาค'],'จ.'+row['ProvinceThai'],'อ.'+row['DistrictThaiShort'])
#เก็บข้อมูลของภาค จังหวัด อำเภอในรูปของ list
list_s.append(row['ภาค'])
list_p.append('จ.'+row['ProvinceThai'])
list_a.append('อ.'+row['DistrictThaiShort'])
# webdriver รอ 10s นาทีจนเจอ element ที่หาโดยใช้ตัวหนังสือ('อ.'+row['DistrictThaiShort']='อ.พระนคร')แล้วคลิก
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.LINK_TEXT,'อ.'+row['DistrictThaiShort']))).click()
# webdriver รอ 10s นาทีจนเจอ element ที่หาโดยใช้ตัวหนังสือ('download โรงงานในอำเภอนี้ทั้งหมด')แล้วคลิก
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.LINK_TEXT,'download โรงงานในอำเภอนี้ทั้งหมด'))).click()
# แสดงผล 3s (หน้าจอค้างไว้เพื่อให้ webdriver ปิดหน้าจอ)
time.sleep(3)
#ปิด webdriver ปิด chrome
driver.quit()
# ถ้าไม่สามารถทำคำสั่งข้างบนได้
except:
#ปิด webdriver ปิด chrome
driver.quit()
#เก็บข้อมูลในรูปของ DataFram
list_ex=pd.DataFrame(zip(list_s,list_p,list_a),columns=['ภาค','จังหวัด','อำเภอ'])
list_ex.to_csv('list_excel.csv')
รูปที่ 7 excel file ที่ download ในคอมพิวเตอร์

แล้วก็จะได้ excel file ของข้อมูลโรงงานของแต่ละอำเภอ จากนั้นรวมทุก file เข้าด้วยกันก็จะได้ข้อมูลทั้งหมดของกรมโรงงานอุสหกรรมในประเทศไทยมาทำวิจัยต่อ

import os, shutilimport pandas as pdimport numpy as npnew_dir='D:\python\Super_AI2\medium\Factory'factory_list,update_date=[],[]for fn in os.listdir(new_dir):print(fn)# อ่านข้อมูลของแต่ละ excel file ใน folderdf=pd.read_excel(os.path.join(new_dir, fn))df1=df.iloc[:-2]factory_list.append(df1)update_date.append(df.tail(1))#รวมข้อมูลของ excel file เข้าด้วยกันframe=pd.concat(factory_list,axis=0,ignore_index=True)print(frame.tail())da=pd.concat(update_date,axis=0,ignore_index=True)print(da.tail())#save ข้อมูลเก็บในรูปของ csv fileframe.to_csv('D:\python\Super_AI2\medium\\factory_All.csv')da.to_csv('D:\python\Super_AI2\medium\\update_All.csv')
รูปที่ 8 ข้อมูลโรงงานของกรมโรงงานอุตสาหกรรมในประเทศไทย
รูปที่ 9 ค่าเฉลี่ยเงินทุนของโรงงานต่อจังหวัด

Code อยู่ใน google colab เพื่อนๆ สามารถ เข้าไปศึกษากันได้ แต่ตอนรันควร download.ipynb และรันในเครื่องคอมพิวเตอร์

https://colab.research.google.com/drive/1bnMYyC-KrYmezmsqKO3Rh93aeUbKwZku?usp=sharing

Reference

https://selenium-python.readthedocs.io/

https://www.diw.go.th/hawk/default.php

--

--