Python Web Scraping - การประมวลผลข้อมูล
ในบทก่อนหน้านี้เราได้เรียนรู้เกี่ยวกับการดึงข้อมูลจากหน้าเว็บหรือการขูดเว็บโดยโมดูล Python ต่างๆ ในบทนี้ให้เราดูเทคนิคต่างๆในการประมวลผลข้อมูลที่คัดลอกมา
บทนำ
ในการประมวลผลข้อมูลที่คัดลอกมาเราต้องจัดเก็บข้อมูลในเครื่องของเราในรูปแบบเฉพาะเช่นสเปรดชีต (CSV) JSON หรือบางครั้งในฐานข้อมูลเช่น MySQL
การประมวลผลข้อมูล CSV และ JSON
ขั้นแรกเราจะเขียนข้อมูลหลังจากดึงจากหน้าเว็บลงในไฟล์ CSV หรือสเปรดชีต ก่อนอื่นให้เราทำความเข้าใจผ่านตัวอย่างง่ายๆซึ่งก่อนอื่นเราจะดึงข้อมูลโดยใช้BeautifulSoup โมดูลดังที่เคยทำก่อนหน้านี้และจากนั้นโดยใช้โมดูล Python CSV เราจะเขียนข้อมูลที่เป็นข้อความลงในไฟล์ CSV
ขั้นแรกเราต้องนำเข้าไลบรารี Python ที่จำเป็นดังนี้ -
import requests
from bs4 import BeautifulSoup
import csv
ในโค้ดบรรทัดต่อไปนี้เราใช้การร้องขอเพื่อส่งคำขอ GET HTTP สำหรับ url: https://authoraditiagarwal.com/ โดยการร้องขอ GET
r = requests.get('https://authoraditiagarwal.com/')
ตอนนี้เราต้องสร้างวัตถุซุปดังต่อไปนี้ -
soup = BeautifulSoup(r.text, 'lxml')
ตอนนี้ด้วยความช่วยเหลือของโค้ดบรรทัดถัดไปเราจะเขียนข้อมูลที่คว้าลงในไฟล์ CSV ชื่อ dataprocessing.csv
f = csv.writer(open(' dataprocessing.csv ','w'))
f.writerow(['Title'])
f.writerow([soup.title.text])
หลังจากเรียกใช้สคริปต์นี้ข้อมูลที่เป็นข้อความหรือชื่อของหน้าเว็บจะถูกบันทึกไว้ในไฟล์ CSV ที่กล่าวถึงข้างต้นในเครื่องของคุณ
ในทำนองเดียวกันเราสามารถบันทึกข้อมูลที่รวบรวมไว้ในไฟล์ JSON ต่อไปนี้เป็นสคริปต์ Python ที่เข้าใจง่ายสำหรับการทำเช่นเดียวกันกับที่เรากำลังดึงข้อมูลเดียวกันกับที่เราทำในสคริปต์ Python ล่าสุด แต่คราวนี้ข้อมูลที่จับได้จะถูกบันทึกไว้ใน JSONfile.txt โดยใช้โมดูล JSON Python
import requests
from bs4 import BeautifulSoup
import csv
import json
r = requests.get('https://authoraditiagarwal.com/')
soup = BeautifulSoup(r.text, 'lxml')
y = json.dumps(soup.title.text)
with open('JSONFile.txt', 'wt') as outfile:
json.dump(y, outfile)
หลังจากเรียกใช้สคริปต์นี้ข้อมูลที่จับได้เช่นชื่อของหน้าเว็บจะถูกบันทึกไว้ในไฟล์ข้อความที่กล่าวถึงข้างต้นในเครื่องของคุณ
การประมวลผลข้อมูลโดยใช้ AWS S3
บางครั้งเราอาจต้องการบันทึกข้อมูลที่คัดลอกไว้ในที่จัดเก็บในตัวเครื่องเพื่อวัตถุประสงค์ในการเก็บถาวร แต่ถ้าเราต้องจัดเก็บและวิเคราะห์ข้อมูลนี้ในปริมาณมากล่ะ? คำตอบคือบริการจัดเก็บข้อมูลบนคลาวด์ชื่อ Amazon S3 หรือ AWS S3 (Simple Storage Service) โดยพื้นฐานแล้ว AWS S3 เป็นที่เก็บข้อมูลออบเจ็กต์ซึ่งสร้างขึ้นเพื่อจัดเก็บและดึงข้อมูลจำนวนใด ๆ จากที่ใดก็ได้
เราสามารถทำตามขั้นตอนต่อไปนี้สำหรับการจัดเก็บข้อมูลใน AWS S3 -
Step 1- อันดับแรกเราต้องมีบัญชี AWS ซึ่งจะมอบคีย์ลับสำหรับใช้ในสคริปต์ Python ของเราในขณะที่จัดเก็บข้อมูล มันจะสร้างที่เก็บข้อมูล S3 ซึ่งเราสามารถจัดเก็บข้อมูลของเราได้
Step 2 - ต่อไปเราต้องติดตั้ง boto3ไลบรารี Python สำหรับการเข้าถึงที่เก็บข้อมูล S3 สามารถติดตั้งได้ด้วยความช่วยเหลือของคำสั่งต่อไปนี้ -
pip install boto3
Step 3 - ต่อไปเราสามารถใช้สคริปต์ Python ต่อไปนี้สำหรับการขูดข้อมูลจากหน้าเว็บและบันทึกลงในที่เก็บข้อมูล AWS S3
ขั้นแรกเราต้องนำเข้าไลบรารี Python เพื่อทำการขูดที่นี่เรากำลังดำเนินการกับ requestsและ boto3 บันทึกข้อมูลลงในถัง S3
import requests
import boto3
ตอนนี้เราสามารถขูดข้อมูลจาก URL ของเราได้แล้ว
data = requests.get("Enter the URL").text
ตอนนี้สำหรับการจัดเก็บข้อมูลไปยังถัง S3 เราจำเป็นต้องสร้างไคลเอนต์ S3 ดังต่อไปนี้ -
s3 = boto3.client('s3')
bucket_name = "our-content"
โค้ดบรรทัดถัดไปจะสร้างบัคเก็ต S3 ดังนี้ -
s3.create_bucket(Bucket = bucket_name, ACL = 'public-read')
s3.put_object(Bucket = bucket_name, Key = '', Body = data, ACL = "public-read")
ตอนนี้คุณสามารถตรวจสอบที่เก็บข้อมูลพร้อมตั้งชื่อเนื้อหาของเราจากบัญชี AWS ของคุณ
การประมวลผลข้อมูลโดยใช้ MySQL
ให้เราเรียนรู้วิธีการประมวลผลข้อมูลโดยใช้ MySQL หากคุณต้องการเรียนรู้เกี่ยวกับ MySQL คุณสามารถไปที่ลิงค์https://www.tutorialspoint.com/mysql/.
ด้วยความช่วยเหลือของขั้นตอนต่อไปนี้เราสามารถขูดและประมวลผลข้อมูลลงในตาราง MySQL -
Step 1- ขั้นแรกโดยใช้ MySQL เราต้องสร้างฐานข้อมูลและตารางที่เราต้องการบันทึกข้อมูลที่คัดลอกมา ตัวอย่างเช่นเรากำลังสร้างตารางด้วยแบบสอบถามต่อไปนี้ -
CREATE TABLE Scrap_pages (id BIGINT(7) NOT NULL AUTO_INCREMENT,
title VARCHAR(200), content VARCHAR(10000),PRIMARY KEY(id));
Step 2- ต่อไปเราต้องจัดการกับ Unicode โปรดทราบว่า MySQL ไม่จัดการ Unicode ตามค่าเริ่มต้น เราจำเป็นต้องเปิดคุณสมบัตินี้ด้วยความช่วยเหลือของคำสั่งต่อไปนี้ซึ่งจะเปลี่ยนชุดอักขระเริ่มต้นสำหรับฐานข้อมูลสำหรับตารางและสำหรับทั้งสองคอลัมน์ -
ALTER DATABASE scrap CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE Scrap_pages CONVERT TO CHARACTER SET utf8mb4 COLLATE
utf8mb4_unicode_ci;
ALTER TABLE Scrap_pages CHANGE title title VARCHAR(200) CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
ALTER TABLE pages CHANGE content content VARCHAR(10000) CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
Step 3- ตอนนี้รวม MySQL กับ Python สำหรับสิ่งนี้เราจะต้องใช้ PyMySQL ซึ่งสามารถติดตั้งได้ด้วยความช่วยเหลือของคำสั่งต่อไปนี้
pip install PyMySQL
Step 4- ตอนนี้ฐานข้อมูลของเราชื่อ Scrap ที่สร้างขึ้นก่อนหน้านี้พร้อมที่จะบันทึกข้อมูลหลังจากคัดลอกจากเว็บลงในตารางชื่อ Scrap_pages ในตัวอย่างของเราเราจะขูดข้อมูลจาก Wikipedia และจะถูกบันทึกลงในฐานข้อมูลของเรา
ขั้นแรกเราต้องนำเข้าโมดูล Python ที่จำเป็น
from urllib.request import urlopen
from bs4 import BeautifulSoup
import datetime
import random
import pymysql
import re
ตอนนี้ทำการเชื่อมต่อซึ่งรวมเข้ากับ Python
conn = pymysql.connect(host='127.0.0.1',user='root', passwd = None, db = 'mysql',
charset = 'utf8')
cur = conn.cursor()
cur.execute("USE scrap")
random.seed(datetime.datetime.now())
def store(title, content):
cur.execute('INSERT INTO scrap_pages (title, content) VALUES ''("%s","%s")', (title, content))
cur.connection.commit()
ตอนนี้เชื่อมต่อกับ Wikipedia และรับข้อมูลจากมัน
def getLinks(articleUrl):
html = urlopen('http://en.wikipedia.org'+articleUrl)
bs = BeautifulSoup(html, 'html.parser')
title = bs.find('h1').get_text()
content = bs.find('div', {'id':'mw-content-text'}).find('p').get_text()
store(title, content)
return bs.find('div', {'id':'bodyContent'}).findAll('a',href=re.compile('^(/wiki/)((?!:).)*$'))
links = getLinks('/wiki/Kevin_Bacon')
try:
while len(links) > 0:
newArticle = links[random.randint(0, len(links)-1)].attrs['href']
print(newArticle)
links = getLinks(newArticle)
สุดท้ายนี้เราต้องปิดทั้งเคอร์เซอร์และการเชื่อมต่อ
finally:
cur.close()
conn.close()
สิ่งนี้จะบันทึกข้อมูลที่รวบรวมจาก Wikipedia ลงในตารางชื่อ scrap_pages หากคุณคุ้นเคยกับ MySQL และการขูดเว็บรหัสข้างต้นจะไม่ยากที่จะเข้าใจ
การประมวลผลข้อมูลโดยใช้ PostgreSQL
PostgreSQL ซึ่งพัฒนาโดยทีมอาสาสมัครทั่วโลกเป็นระบบจัดการฐานข้อมูลเชิงสัมพันธ์แบบโอเพ่นซอร์ส (RDMS) กระบวนการประมวลผลข้อมูลที่คัดลอกมาโดยใช้ PostgreSQL นั้นคล้ายกับ MySQL จะมีการเปลี่ยนแปลงสองประการ: ประการแรกคำสั่งจะแตกต่างจาก MySQL และประการที่สองเราจะใช้ที่นี่psycopg2 ไลบรารี Python เพื่อดำเนินการรวมกับ Python
หากคุณไม่คุ้นเคยกับ PostgreSQL คุณสามารถเรียนรู้ได้ที่ https://www.tutorialspoint.com/postgresql/. และด้วยความช่วยเหลือของคำสั่งต่อไปนี้เราสามารถติดตั้งไลบรารี psycopg2 Python -
pip install psycopg2