Python Web Kazıma - Veri İşleme
Önceki bölümlerde, verileri web sayfalarından çıkarmayı veya çeşitli Python modülleri ile web kazımayı öğrendik. Bu bölümde, kazınan verileri işlemek için çeşitli tekniklere bakalım.
Giriş
Kazınan verileri işlemek için, verileri yerel makinemizde elektronik tablo (CSV), JSON gibi belirli bir biçimde veya bazen MySQL gibi veritabanlarında depolamalıyız.
CSV ve JSON Veri İşleme
İlk olarak, bilgileri web sayfasından aldıktan sonra bir CSV dosyasına veya bir elektronik tabloya yazacağız. İlk önce bilgiyi kullanarak elde edeceğimiz basit bir örnekle anlayalım.BeautifulSoup modül, daha önce olduğu gibi ve ardından Python CSV modülünü kullanarak bu metinsel bilgileri CSV dosyasına yazacağız.
Öncelikle, gerekli Python kitaplıklarını aşağıdaki gibi içe aktarmamız gerekiyor -
import requests
from bs4 import BeautifulSoup
import csv
Aşağıdaki kod satırında, url için GET HTTP istekleri yapmak için istekleri kullanıyoruz: https://authoraditiagarwal.com/ GET isteğinde bulunarak.
r = requests.get('https://authoraditiagarwal.com/')
Şimdi, aşağıdaki gibi bir Soup nesnesi oluşturmamız gerekiyor -
soup = BeautifulSoup(r.text, 'lxml')
Şimdi, sonraki kod satırlarının yardımıyla, yakalanan verileri dataprocessing.csv adlı bir CSV dosyasına yazacağız.
f = csv.writer(open(' dataprocessing.csv ','w'))
f.writerow(['Title'])
f.writerow([soup.title.text])
Bu komut dosyasını çalıştırdıktan sonra, metin bilgileri veya web sayfasının başlığı, yerel makinenizde yukarıda belirtilen CSV dosyasına kaydedilecektir.
Benzer şekilde, toplanan bilgileri bir JSON dosyasına kaydedebiliriz. Aşağıdakiler, son Python betiğinde yaptığımızla aynı bilgileri aldığımızın aynısını yapmak için anlaşılması kolay bir Python betiğidir, ancak bu sefer yakalanan bilgiler JSON Python modülü kullanılarak JSONfile.txt dosyasına kaydedilir.
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)
Bu komut dosyasını çalıştırdıktan sonra, yakalanan bilgiler, yani web sayfasının başlığı, yerel makinenizde yukarıda belirtilen metin dosyasına kaydedilecektir.
AWS S3 kullanarak Veri İşleme
Bazen, kopyalanmış verileri yerel depomuza arşiv amacıyla kaydetmek isteyebiliriz. Peki ya bu verileri büyük ölçekte saklamamız ve analiz etmemiz gerekirse? Cevap, Amazon S3 veya AWS S3 (Basit Depolama Hizmeti) adlı bulut depolama hizmetidir. Temel olarak AWS S3, herhangi bir yerden herhangi bir miktarda veriyi depolamak ve almak için oluşturulmuş bir nesne depolamadır.
Verileri AWS S3'te depolamak için aşağıdaki adımları takip edebiliriz -
Step 1- Öncelikle, verileri saklarken Python betiğimizde kullanmamız için gizli anahtarları sağlayacak bir AWS hesabına ihtiyacımız var. Verilerimizi depolayabileceğimiz bir S3 kovası oluşturacaktır.
Step 2 - Sonra, yüklememiz gerekiyor boto3S3 klasörüne erişmek için Python kitaplığı. Aşağıdaki komutun yardımı ile kurulabilir -
pip install boto3
Step 3 - Ardından, verileri web sayfasından alıp AWS S3 klasörüne kaydetmek için aşağıdaki Python komut dosyasını kullanabiliriz.
Öncelikle, kazıma için Python kitaplıklarını içe aktarmamız gerekiyor, burada birlikte çalışıyoruz requests, ve boto3 verileri S3 kovasına kaydetme.
import requests
import boto3
Şimdi verileri URL'mizden sıyırabiliriz.
data = requests.get("Enter the URL").text
Şimdi verileri S3 klasörüne depolamak için aşağıdaki gibi S3 istemcisi oluşturmamız gerekiyor -
s3 = boto3.client('s3')
bucket_name = "our-content"
Sonraki kod satırı aşağıdaki gibi S3 demeti oluşturacaktır -
s3.create_bucket(Bucket = bucket_name, ACL = 'public-read')
s3.put_object(Bucket = bucket_name, Key = '', Body = data, ACL = "public-read")
Artık AWS hesabınızdan içeriğimizi adlandırarak paketi kontrol edebilirsiniz.
MySQL kullanarak veri işleme
MySQL kullanarak verileri nasıl işleyeceğimizi öğrenelim. MySQL hakkında bilgi edinmek istiyorsanız, bağlantıyı takip edebilirsiniz.https://www.tutorialspoint.com/mysql/.
Aşağıdaki adımların yardımıyla verileri MySQL tablosuna kazıyabilir ve işleyebiliriz -
Step 1- Öncelikle, MySQL kullanarak, kazınmış verilerimizi kaydetmek istediğimiz bir veritabanı ve tablo oluşturmamız gerekiyor. Örneğin, aşağıdaki sorguyla tabloyu oluşturuyoruz -
CREATE TABLE Scrap_pages (id BIGINT(7) NOT NULL AUTO_INCREMENT,
title VARCHAR(200), content VARCHAR(10000),PRIMARY KEY(id));
Step 2- Sonra, Unicode ile ilgilenmemiz gerekiyor. MySQL'in varsayılan olarak Unicode'u işlemediğini unutmayın. Bu özelliği, veritabanı, tablo ve her iki sütun için varsayılan karakter setini değiştirecek aşağıdaki komutların yardımıyla açmamız gerekiyor -
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- Şimdi MySQL'i Python ile entegre edin. Bunun için aşağıdaki komut yardımıyla kurulabilen PyMySQL'e ihtiyacımız olacak
pip install PyMySQL
Step 4- Artık daha önce oluşturulan Scrap adlı veritabanımız, verileri web'den kopyalandıktan sonra Scrap_pages adlı tabloya kaydetmeye hazır. Burada, örneğimizde Wikipedia'dan veri alacağız ve bunlar veritabanımıza kaydedilecek.
Öncelikle gerekli Python modüllerini içe aktarmamız gerekiyor.
from urllib.request import urlopen
from bs4 import BeautifulSoup
import datetime
import random
import pymysql
import re
Şimdi, bunu Python ile entegre eden bir bağlantı kurun.
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()
Şimdi, Wikipedia ile bağlantı kurun ve ondan veri alın.
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)
Son olarak, hem imleci hem de bağlantıyı kapatmamız gerekiyor.
finally:
cur.close()
conn.close()
Bu, Wikipedia'dan toplanan verileri scrap_pages adlı tabloya kaydedecektir. MySQL ve web kazıma konusunda bilgiliyseniz, yukarıdaki kodu anlamak zor olmayacaktır.
PostgreSQL kullanarak veri işleme
Dünya çapında bir gönüllüler ekibi tarafından geliştirilen PostgreSQL, açık kaynaklı bir ilişkisel veritabanı Yönetim sistemidir (RDMS). PostgreSQL kullanılarak kazınan verilerin işlenmesi süreci MySQL'inkine benzer. İki değişiklik olacaktı: Birincisi, komutlar MySQL'den farklı olacak ve ikincisi, burada kullanacağızpsycopg2 Python kitaplığı, Python ile entegrasyonunu gerçekleştirir.
PostgreSQL'e aşina değilseniz, onu şu adresten öğrenebilirsiniz: https://www.tutorialspoint.com/postgresql/. Ve aşağıdaki komutun yardımıyla psycopg2 Python kitaplığını kurabiliriz -
pip install psycopg2