ボーナスsqliteにデータを入れる


1. sqlite


廃棄されたデータが含まれているといえば、Coueraで学んだsqliteを思い出した.そこで抽出したデータをSQLで保存してみました.
import requests
import sqlite3
import json
import codecs
from bs4 import BeautifulSoup
# sqlite 를 사용하기 위해 필요할지도 모르는 모듈을 import 해온다.

def extract_job(html):    
    title = html.find("h2", {"class": "mb4"}).find("a")["title"]
    company = html.find("h3", {"class":"fc-black-700"}).find("span").string.strip()
    location = html.find("span", {"class": "fc-black-500"}).string.strip()
    job_id = html["data-jobid"]
    link = f"https://stackoverflow.com/jobs?id={job_id}&q=python"
    
    return title,company,location,link
# 기존의 return은 중괄호 안에 보기좋게 저장되어있었다. dict의 tuple 형태로 말이다. 
#근데 그렇게 저장하면 각각의 원소를 뽑아내기 힘들어진다. 그래서 위에 처럼 간소화 하자!

def extract_so_jobs(last_page): 
    conn = sqlite3.connect("C:\\Bitnami\\wampstack-7.4.6-1\\apache2\\htdocs\\scrapper.sqlite") # Mention the full path to where SQLite is located.
    cur = conn.cursor()  
    cur.executescript('''
    DROP TABLE IF EXISTS scrapper;

    CREATE TABLE scrapper (title TEXT, company TEXT, location TEXT, link TEXT)
    ''') 
    # 두줄을 적으려면 executescript 함수를 사용할 것.
    # SQL 문법과 python 안에서의 사용법은 구글링하면 자세하게 알 수 있으므로 생략하겠다.

    jobs = [] 
    for page in range(1):
        print(f"Scrapping SO Page:{page}")
        result = requests.get(f"{URL}&pg={page + 1}")
        soup = BeautifulSoup(result.text, "html.parser")
        results = soup.find_all("div", {"class":"-job"} )
        for result in results:
            job = extract_job(result)
            jobs.append(job)     

    # 또 다시 for loop을 만들어준다 jobs 리스트를 순회하기 위해서.  
    for data in jobs:
        title = data[0]
        company = data[1]
        location = data[2]
        link = data[3]
        cur.execute('''INSERT INTO scrapper (title, company, location, link)
            VALUES ( ?, ?, ?, ? )''', ( title, company, location, link ) )
        conn.commit()
    cur.close()
    return jobs

# 생각보다 간단했지만 이걸 알아내기까지 많은 시행착오를 겪었다.
もういい...もういい...もういい...やっと本当にできるようになりました私はとても喜んで、誇りに思って、とても興奮しています.
考えの転換が重要らしい.実際、jobs[]の値をpython courseraのようにjsファイルに単独で抽出し、開き、for loopに戻りたいと思っていました.
jsファイルのリストが整理されず、エラーが続き、ファイルが見つからないエラーが発生し、クラッシュしました.ファイルは単独で作成しないでください.
ここでextract so job関数にjobs[]に格納してfor loopを返すと考えると,その後容易に解決できる.
考えを広げて,考えに閉じ込めないでください.自由に!