Python

[python] ํŒ๋‹ค์Šค๋ฅผ ํ™œ์šฉํ•œ ์›นํฌ๋กค๋ง๊ณผ ๋ฐ์ดํ„ฐ ๋ถ„์„ - Excel ํŒŒ์ผ๋กœ ์ •๋ณด ์ €์žฅํ•˜๊ธฐ

hyonie 2024. 5. 5. 10:57

 

 

 

๋ชฉ์ฐจ

     


    ๊ฐ€๋น„์•„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฉ”์ธํ™”๋ฉด ํฌ๋กค๋งํ•˜๊ธฐ

    import requests
    from bs4 import BeautifulSoup as bs
    import re
    
    gabiapage = requests.get("https://library.gabia.com/")
    soup = bs(gabiapage.text, "html.parser")
    
    elements = soup.select('div.esg-entry-content a > span')
    
    #print(elements)
    
    for index, element in enumerate(elements, 1):
        print('{}๋ฒˆ์งธ ๊ฒŒ์‹œ๊ธ€์˜ ์ œ๋ชฉ : {}'.format(index, element.text))

     

    • BeautifulSoup ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ importํ• ๋•Œ, bs ๋ณ„์นญ์œผ๋กœ ์ค„์—ฌ์„œ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์‚ฌ์šฉํ•œ๋‹ค.
    • div.esg-entry-content a > span ์œผ๋กœ ๋ชจ๋“  ๊ฒŒ์‹œ๊ธ€์˜ ์ œ๋ชฉ์ด ๋‹ด๊ธด <span> ์š”์†Œ๋“ค์„ ์„ ํƒํ•œ๋‹ค.
    • enumerate()ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ ํƒ๋œ ์š”์†Œ์— ์ธ๋ฑ์Šค๋ฅผ ๋ถ€์—ฌํ•œ๋‹ค. ์ด๋•Œ ์ธ๋ฑ์Šค๋Š” 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค. ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด์„œ ์„ ํƒ๋œ ์š”์†Œ๋“ค์„ ์ˆœํšŒํ•˜๋ฉด์„œ ๊ฐ ์š”์†Œ์˜ ํ…์ŠคํŠธ, ์ฆ‰ ๊ฒŒ์‹œ๊ธ€์˜ ์ œ๋ชฉ์„ ์ถœ๋ ฅํ•œ๋‹ค.

     

     


    ๐Ÿ” ์ถœ๋ ฅํ•œ ๋ฐ์ดํ„ฐ ํ™•์ธ

    ์œ„ ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด 388๊ฐœ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

    ๊ฐ€๋น„์•„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฉ”์ธํ™”๋ฉด์—์„œ ๊ฐ€์ ธ์˜จ ํŽ˜์ด์ง€๋„ค์ด์…˜์— ํ‘œ์‹œ๋˜์ง€ ์•Š๋Š” ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ• ์ˆ˜ ์žˆ๋‹ค.

    ์ด ๋ฐ์ดํ„ฐ๋Š” ํŒŒ์‹ฑํ•˜์—ฌ ๊ฐ€์ ธ์˜จ ํ›„, ๋ฉ”๋ชจ๋ฆฌ ์ƒ์— ์žˆ๋Š” element ๋ณ€์ˆ˜์— ์กด์žฌํ•œ๋‹ค.

     

    ์ด๋Ÿฌํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ด€ํ•˜๋ ค๋ฉด ํŒŒ์ผ์— ์ €์žฅํ•ด์•ผํ•œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด re ๋ชจ๋“ˆ์€ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€์•Š๊ณ , ๋Œ€์‹  pandas ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” pd ๋ณ„์นญ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค.

     

    print ( '{}๋ฒˆ์งธ ๊ฒŒ์‹œ๊ธ€์˜ ์ œ๋ชฉ : {}' . format (index, element.text))

     

     


     

    ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ/๋ถ„์„์„ ์œ„ํ•œ Pands ํ™œ์šฉ

     

     

    ๐Ÿ“ฆ pandas ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€

    ์œ„์—์„œ ํฌ๋กค๋งํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ExcelํŒŒ์ผ๋กœ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ํŒ๋‹ค์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋„๋กํ•œ๋‹ค.

    1. cmd ์ฐฝ ์‹คํ–‰
    2. ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž pip๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์น˜ ํ™•์ธ pip show pands
    3. ์„ค์น˜๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด pip install pands 

     

     


     

    ๐Ÿ“ ์›นํฌ๋กค๋ง2.py ์ฝ”๋“œ์ž‘์„ฑ

    import requests
    from bs4 import BeautifulSoup as bs
    import pandas as pd
    
    gabiapage = requests.get("https://library.gabia.com/")
    soup = bs(gabiapage.text, "html.parser")
    
    elements = soup.select('div.esg-entry-content a.eg-grant-element-0')
    
    titles = []
    links = []
    
    for index, element in enumerate(elements, 1):
        titles.append(element.text)
        links.append(element.attrs["href"])
    
    print(titles)
    print(links)
    • `titles = [], links = []` : ๊ฐ๊ฐ ๊ฒŒ์‹œ๊ธ€์˜ ์ œ๋ชฉ๊ณผ ๋งํฌ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋นˆ ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ
    • `for index, element in enumerate(elements,1)` : elements ์—๋Š” ๊ฒŒ์‹œ๊ธ€์˜ ์ œ๋ชฉ๊ณผ ๋งํฌ๋ฅผ ํฌํ•จํ•˜๋Š” HTML์š”์†Œ๊ฐ€ ๋‹ด๊ฒจ์žˆ๋‹ค. enumerate()ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ์š”์†Œ์˜ ์ธ๋ฑ์Šค ํ•จ๊ป˜ ์š”์†Œ ์ž์ฒด๋ฅผ ๋ฐ˜๋ณตํ•œ๋‹ค.
    • ๊ฐ ์š”์†Œ์˜ ํ…์ŠคํŠธ์™€ href ์†์„ฑ์„ ์ถ”์ถœํ•˜๊ณ  titles, links ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ํ•œ๋‹ค.

     

     

     


     

    โœจ ์›นํฌ๋กค๋ง2.py ์ฝ”๋“œ์ถ”๊ฐ€ - Excel ํŒŒ์ผ๋กœ ๋ณ€ํ™˜

    ์ด์ œ ์ˆ˜์ง‘ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ด€ํ•˜๊ธฐ ์œ„ํ•ด ํŒ๋‹ค์Šค๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค. ํŒ๋‹ค์Šค์˜ ๋ณ„์นญ์œผ๋กœ pd๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. 

    ๋จผ์ € ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์„ ์ƒ์„ฑํ•ด์•ผํ•œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” pd.DataFrame()์„ ์‚ฌ์šฉํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์„ ๋งŒ๋“ค๊ณ  ๊ฐ ์—ด์— ์žˆ๋Š” key-valueํ˜•์‹์œผ๋กœ ๊ฐ’์„ ๋„ฃ๋Š”๋‹ค. ์ด๋•Œ print(links)๋กœ ์ถœ๋ ฅํ•œ ๋‚ด์šฉ์„ links ํ‚ค ๊ฐ’์— ๋ฆฌ์ŠคํŠธํ˜•ํƒœ๋กœ ๋„ฃ๋Š”๋‹ค.

     

    df.to_excel() ๋ฉ”์„œ๋“œ๋Š” ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์—‘์…€ ํŒŒ์ผ์˜ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ €์žฅํ•˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค.

    ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์€ ๋ฉ”ํŠธ๋ฆญ์Šค ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ์—‘์…€์˜ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ํŒŒ์ผ๋กœ ์ €์žฅํ•œ๋‹ค.

    df = pd.DataFrame()
    df["titles"] = titles
    df["links"] = links
    
    df.to_excel('test.xlsx', sheet_name = "Sheet1")

     

    • `df = pd.DataFrame()` :  ๋นˆํ”„๋ ˆ์ž„ ์ƒ์„ฑ
    • `df["titles"] = titles ์™€ df["links"] = links` : titles์—ด๊ณผ links ์—ด์„ ์ถ”๊ฐ€ํ•œ๋‹ค. ๊ฐ ์—ด์—๋Š” ์ด์ „์— ์ˆ˜์ง‘ํ•œ ์ œ๋ชฉ๊ณผ ๋งํฌ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค.
    • `df.to_excel('test.xlsx', sheet_name = "Sheet1")` : to_excel() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์„ Excel ํŒŒ์ผ๋กœ ์ €์žฅํ•œ๋‹ค. ์ด๋•Œ ํŒŒ์ผ ์ด๋ฆ„์€ text.xlsx๋กœ ํ•˜๊ณ , ์‹œํŠธ์˜ ์ด๋ฆ„์€ "Sheet1"๋กœ ์ง€์ •ํ•œ๋‹ค.

     

     

    ๐Ÿ’ฅ ๋ฌธ์ œ ํ•ด๊ฒฐ

    ํŒ๋‹ค์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งŒ ์„ค์น˜ํ•˜๋ฉด ๋˜๋Š” ์ค„.. openpyxl ๋ชจ๋“ˆ์ด ์—†์–ด์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. 

    openpyxl์€ ํŒ๋‹ค์Šค๊ฐ€ Excel ํŒŒ์ผ์„ ์ž‘์„ฑํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.

     

     

     

     


     

     

    ๐Ÿ”ง openpyxl ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€

     

    1. ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ openpyx์„ ์„ค์น˜
    2. pip install openpyxl ๋ช…๋ น์„ ์‹คํ–‰ ํ•œํ›„ ๋‹ค์‹œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ •์ƒ์ ์œผ๋กœ Excel ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ๋‹ค.
      pip install openpyxl

     

    ์‹คํ–‰์„ ํ•˜๋ฉด ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์˜ ๋‚ด์šฉ์ด ์—‘์…€ ํŒŒ์ผ๋กœ ๋ณ€ํ™˜๋˜์–ด ์ถœ๋ ฅ๋˜๊ณ , ์ง€์ •ํ•œ ๊ฒฝ๋กœ์— ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ๋‹ค.

    ์ƒ์„ฑ๋œ ์—‘์…€ ํŒŒ์ผ์€ ์ผ๋ฐ˜์ ์ธ ์—‘์…€ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์—ด์–ด์„œ ํ™•์ธํ• ์ˆ˜ ์žˆ๋‹ค.

     

     

     

    ๐Ÿ’ญ ๋งˆ๋ฌด๋ฆฌ

    ํฌ๋กค๋ง์„ ํ†ตํ•ด ์ˆ˜์ง‘ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ”๋“œ ๋ช‡ ์ค„๋กœ ์‰ฝ๊ฒŒ ์ •๋ฆฌํ•˜์—ฌ ํŒŒ์ผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์—ˆ๋‹ค.

    ์—‘์…€ ํŒŒ์ผ๋กœ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋‚ด์šฉ ๋ถ„์„์„ ํ• ์ˆ˜ ์žˆ์—ˆ๊ณ , ์ด๋ฅผ ํ†ตํ•ด ํฌ๋กค๋งํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ์‹œ๊ฐํ™”ํ•˜๊ณ  ์ธ์‚ฌ์ดํŠธ๋ฅผ ๋„์ถœํ• ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋˜ํ•œ Selenium ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํฌ๋กค๋ง์„ ์ˆ˜ํ–‰ํ• ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋™์  ์›นํŽ˜์ด์ง€์—์„œ๋„ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•  ์ˆ˜์žˆ๋‹ค.