1. 페이지 저장하기

import requests, bs4    # 비슷한 애들 끼리는 콤마(,)로 한 번에 선언해도 된다. requests : 웹페이지 긁어옴. bs4 : 파이썬의 IDE
import pandas as pd     # 얘도 한 번에 선언할 수는 있지만 그러면 가독성이 떨어진다.

# Step 1. requests 모듈로 웹페이지 긁어와 저장하기.

spark_url = "https://www.sparkkorea.com/퀴즈"
response = requests.get(spark_url)    # requests 함수를 이용해 서버를 get(얻어낸다)!
response.encoding = 'utf-8'
response    # 200 -> 서버가 살았다. 404 -> 서버가 죽었다. 해당 서버 페이지 HTML을 전부 긁어오지만 출력하면 200, 404로만 보여주는 것 같다.

# Step 2. bs4(BeautifulSoup) 모듈로 웹페이지를 예쁘게 담기.

spark_html = response.text    # spark_html이란 변수에 위에서 불러온 response를 text로 담아라.
spark_html_bs = bs4.BeautifulSoup(spark_html, "html.parser")    # spark_html에 대해서 "html.parser" 파싱하겠다. ("html.parser"는 안 써도 잘 돌아가긴 한다.)
# spark_html_bs라는 변수에 bs4(BeautifulSoup)모듈의 BeautifulSoup 함수를 이용해 예쁘게 담아라.
# 우리가 코드를 짤 때 IDE(이클립스, 아톰 등)을 사용하듯이 BeautifulSoup가 파이썬 내에서 코드를 예쁘게 보여준다.
# 앞으로 모든것은 bs4를 이용해 담은 이 'spark_html_bs'를 이용해 bs4의 다른 함수를 이용해 분석할거다.
# spark_html_bs

 

2.1. 저장된 페이지 탐색하기 (원하는 태그만 수집하기)

## 태그 중에서 첫 번째 a 태그만 가져와보자.
#aTag = spark_html_bs.find(name = "a")    # spark_html_bs에서 이름이 "a"인 첫 번째 것을 찾아라.
#aTag    # type(aTag)를 해보면 bs4.element.Tag

# 결과 : 
#
# <a class="skip-link screen-reader-text" href="#content">컨텐츠로 건너뛰기</a>


# 모든 a 태그를 가져와보자.
aTags = spark_html_bs.find_all(name = "a")    # spark_html_bs에서 이름이 "a"인 것을 모두 찾아라. 'findAll'이랑 같다.
aTags    # type(aTags)를 해보면 bs4.element.ResultSet

결과 :


[<a class="skip-link screen-reader-text" href="#content">컨텐츠로 건너뛰기</a>,
 <a href="https://sparkkorea.com/" rel="home">
                     스파크 코리아                </a>,
 <a href="https://sparkkorea.com/%ec%9e%90%eb%a3%8c%ec%8b%a4/">자료실</a>,
 <a href="https://sparkkorea.com/%ec%84%a4%eb%ac%b8-2/">설문s</a>,
 <a aria-current="page" href="https://sparkkorea.com/%ed%80%b4%ec%a6%88/">퀴즈</a>,
 <a href="https://sparkkorea.com/%ed%85%8c%ec%8a%a4%ed%8a%b8/">테스트</a>,
 <a href="https://sparkkorea.com/%ec%84%a4%eb%ac%b8/">학생퀴즈</a>,
 <a href="#"> 설문 준비중 </a>,
 <a href="https://forms.gle/Fw49w9GhWQChDcZm7"> 6/13 Spark 심화과정 </a>,
 <a href="https://forms.gle/G4TcXm3fKuHLHA6D6"> 6/13 Spark 기본과정 </a>,
 <a href="https://forms.gle/M8gr1kC2ubA3UDVp8"> 6/18 Spark [MAP_FILTER] </a>,
 <a href="https://forms.gle/h8w5mZ4MNaPLCPbi6"> 6/18 Spark GroupBy 심화 </a>,
 <a href="https://forms.gle/q5yL6QHfueDLM5w27"> 6/25 Spark RDD 실전 분석 </a>,
 <a href="https://forms.gle/Gxb4y6LfVYiaLu4M7"> 6/27 Spark RDD 실전 분석2 </a>,
 <a class="share-twitter sd-button share-icon" data-shared="sharing-twitter-102" href="https://sparkkorea.com/%ed%80%b4%ec%a6%88/?share=twitter" rel="nofollow noopener noreferrer" target="_blank" title="트위터로 공유하기"><span>트위터</span></a>,
 <a class="share-facebook sd-button share-icon" data-shared="sharing-facebook-102" href="https://sparkkorea.com/%ed%80%b4%ec%a6%88/?share=facebook" rel="nofollow noopener noreferrer" target="_blank" title="페이스북에 공유하려면 클릭하세요."><span>Facebook</span></a>,
 <a class="sd-link-color"></a>,
 <a href="https://wordpress.com/?ref=footer_segment_business" rel="nofollow">A WordPress.com Website.</a>]

근데 위에처럼 'a 태그'를 spark_html_bs 전체에서 가져오면 페이지 내에 있는 모든 a태그를 가져와버린다.

만약 특정 영역의 'a 태그'코드만 가져오려면 어떻게 해야할까?

우선 웹 브라우저 개발자 도구에서 HTML 태그를 뜯어본다. 그 다음 아~ 내가 어떤걸 얻고 싶구나~를 알고 코드를 짜는거다. 지금 내가 찾을 'a 태그'가 포함된 구역(div)를 아래 첨부한다

<div class="class_spark_quiz" id="id_spark_quiz">

     <h1>Spark 퀴즈 </h1>
    <a href="https://forms.gle/Fw49w9GhWQChDcZm7"> 6/13 Spark 심화과정 </a>
    <p></p>  
    <a href="https://forms.gle/G4TcXm3fKuHLHA6D6"> 6/13 Spark 기본과정 </a>
    <p></p> 
    <a href="https://forms.gle/M8gr1kC2ubA3UDVp8"> 6/18 Spark [MAP_FILTER] </a>
    <p></p> 
    <a href="https://forms.gle/h8w5mZ4MNaPLCPbi6"> 6/18 Spark GroupBy 심화 </a>
    <p></p> 
    <a href="https://forms.gle/q5yL6QHfueDLM5w27"> 6/25 Spark RDD 실전 분석 </a>

    <p></p> 
    <a href="https://forms.gle/Gxb4y6LfVYiaLu4M7"> 6/27 Spark RDD 실전 분석2 </a>


    <p></p> 
</div>

< 개발자 도구로 뜯어본 HTML >

 

2.2. 범위 좁히기

tag의 attrs로 찾기

# Step 1. 수많은 'div 태그' 구역 중 위에 보이는 'div 태그' 구역만 골라서 추출해보자.

# div 태그 : 속성 (i.e. id, class, etc...) 별로 구역을 나눈다. 이를 이용해 특정 구역에 특정 조건을 넣어 검색할 수 있다.
# name = "태그명", attrs = {"속성명":"속성값"} 으로 찾는다. 여기서 attrs(파라미터)는 "id명":"id값" 또는 "class명":"class값"이다.
divTags_including_aTags = spark_html_bs.find(name = "div", attrs = {"class":"class_spark_quiz"}) # find_all도 가능.
# divTags_including_aTags에 spark_html_bs에서 찾아라. 태그 이름이 div인데 그 중에서 속성명은 class고, 속성값은 class_spark_quiz다.
divTags_including_aTags


결과 :

<div class="class_spark_quiz" id="id_spark_quiz">
<h1>Spark 퀴즈 </h1>
<a href="https://forms.gle/Fw49w9GhWQChDcZm7"> 6/13 Spark 심화과정 </a>
<p></p>
<a href="https://forms.gle/G4TcXm3fKuHLHA6D6"> 6/13 Spark 기본과정 </a>
<p></p>
<a href="https://forms.gle/M8gr1kC2ubA3UDVp8"> 6/18 Spark [MAP_FILTER] </a>
<p></p>
<a href="https://forms.gle/h8w5mZ4MNaPLCPbi6"> 6/18 Spark GroupBy 심화 </a>
<p></p>
<a href="https://forms.gle/q5yL6QHfueDLM5w27"> 6/25 Spark RDD 실전 분석 </a>
<p></p>
<a href="https://forms.gle/Gxb4y6LfVYiaLu4M7"> 6/27 Spark RDD 실전 분석2 </a>
<p></p>
</div>

 

tag의 id로 찾기

# 위에꺼를 동일하게 이번에는 id를 이용해 추출해보자.
divTags_including_aTags2 = spark_html_bs.find(name = "div", attrs = {"id":"id_spark_quiz"})
divTags_including_aTags2


결과 :

<div class="class_spark_quiz" id="id_spark_quiz">
<h1>Spark 퀴즈 </h1>
<a href="https://forms.gle/Fw49w9GhWQChDcZm7"> 6/13 Spark 심화과정 </a>
<p></p>
<a href="https://forms.gle/G4TcXm3fKuHLHA6D6"> 6/13 Spark 기본과정 </a>
<p></p>
<a href="https://forms.gle/M8gr1kC2ubA3UDVp8"> 6/18 Spark [MAP_FILTER] </a>
<p></p>
<a href="https://forms.gle/h8w5mZ4MNaPLCPbi6"> 6/18 Spark GroupBy 심화 </a>
<p></p>
<a href="https://forms.gle/q5yL6QHfueDLM5w27"> 6/25 Spark RDD 실전 분석 </a>
<p></p>
<a href="https://forms.gle/Gxb4y6LfVYiaLu4M7"> 6/27 Spark RDD 실전 분석2 </a>
<p></p>
</div>

어떤 방식으로 작동하는걸까? .attrs로 속성명과 속성값을을 확인해보자.

# attrs를 이용해 위에서 따로 구역을 오려낸 'div 태그'의 속성값을 모두 확인한 결과다.
# 해당 'div 태그'가 이렇게 2개의 속성명:속성값을 가지기 때문에 class로도 찾을 수 있는거고, id로도 찾을 수 있는거다.
# 만약, 원본 spark_html_bs 내에 div태그들 중에 동일한 class 속성명과 속성값을 가진 div 태그가 있을 경우,
# id 속성명과 속성값이 다르다면 attrs = {"class":"class_spark_quiz", "id":"id_spark_quiz"} 이렇게 찾을 수 있다.
divTags_including_aTags.attrs


결과 :

{'class': ['class_spark_quiz'], 'id': 'id_spark_quiz'}

보통 그럴 일은 없지만 혹시라도 attrs가 같은 다른 구역의 태그가 또 있거나 id가 같은 다른 구역의 태그가 또 있을 경우 2개의 조건을 한 번에 주면 범위를 더욱 특정할 수 있다.

# 속성값을 2개 다 줘보자.
divTags_including_aTags3 = spark_html_bs.find\
(name = "div", attrs = {"class":"class_spark_quiz", "id":"id_spark_quiz"})
divTags_including_aTags3


결과 :

<div class="class_spark_quiz" id="id_spark_quiz">
<h1>Spark 퀴즈 </h1>
<a href="https://forms.gle/Fw49w9GhWQChDcZm7"> 6/13 Spark 심화과정 </a>
<p></p>
<a href="https://forms.gle/G4TcXm3fKuHLHA6D6"> 6/13 Spark 기본과정 </a>
<p></p>
<a href="https://forms.gle/M8gr1kC2ubA3UDVp8"> 6/18 Spark [MAP_FILTER] </a>
<p></p>
<a href="https://forms.gle/h8w5mZ4MNaPLCPbi6"> 6/18 Spark GroupBy 심화 </a>
<p></p>
<a href="https://forms.gle/q5yL6QHfueDLM5w27"> 6/25 Spark RDD 실전 분석 </a>
<p></p>
<a href="https://forms.gle/Gxb4y6LfVYiaLu4M7"> 6/27 Spark RDD 실전 분석2 </a>
<p></p>
</div>

 

2.3. 범위 좁히기 반복

# Step 2. bs4로 가져온 전체 spark_html_bs 중에서 위 Step 1.을 통해 원하는 영역(div)만 추출했다.
#         여기서 다시 원하는 'a 태그'만 추출하자.

# 위에서 구역을 추려낸 divTag 영역에서 a태그를 모두 찾아라.
aTags = divTags_including_aTags.find_all(name = "a")
aTags


결과 :

[<a href="https://forms.gle/Fw49w9GhWQChDcZm7"> 6/13 Spark 심화과정 </a>,
 <a href="https://forms.gle/G4TcXm3fKuHLHA6D6"> 6/13 Spark 기본과정 </a>,
 <a href="https://forms.gle/M8gr1kC2ubA3UDVp8"> 6/18 Spark [MAP_FILTER] </a>,
 <a href="https://forms.gle/h8w5mZ4MNaPLCPbi6"> 6/18 Spark GroupBy 심화 </a>,
 <a href="https://forms.gle/q5yL6QHfueDLM5w27"> 6/25 Spark RDD 실전 분석 </a>,
 <a href="https://forms.gle/Gxb4y6LfVYiaLu4M7"> 6/27 Spark RDD 실전 분석2 </a>]

자료형을 확인해보면 리스트는 아니지만 인덱스가 부여되어 리스트처럼 사용할 수 있다.

# type(aTags)를 해보면 bs4.element.ResultSet다. 리스트는 아니지만 인덱스가 부여되어 리스트처럼 사용할 수 있다.
print(aTags[0],"\n",aTags[3],"\n",aTags[5])

결과 :

<a href="https://forms.gle/Fw49w9GhWQChDcZm7"> 6/13 Spark 심화과정 </a> 
 <a href="https://forms.gle/h8w5mZ4MNaPLCPbi6"> 6/18 Spark GroupBy 심화 </a> 
 <a href="https://forms.gle/Gxb4y6LfVYiaLu4M7"> 6/27 Spark RDD 실전 분석2 </a>

 

3. 추출이 완료된 원하는 태그(과정 2.3)에서 속성을 확인하고 원하는 요소만 뽑아내기

aTags[0].text

결과 :
' 6/13 Spark 심화과정 '


aTags[0].attrs

결과 : 
{'href': 'https://forms.gle/Fw49w9GhWQChDcZm7'}    # 딕셔너리 형태란 것을 알 수 있다.


aTags[0].attrs["href"]    # 딕셔너리니까 Key로 Value를 호출한다.

결과 :
'https://forms.gle/Fw49w9GhWQChDcZm7'

 < > 로 묶인 이 녀석들이 어떤 구조인지는 다음을 통해 파악하자.

<div class="class_spark_quiz" id="id_spark_quiz">
태그 : div, 속성명 : "class", 속성값 : "class_spark_quiz"
태그 : div, 속성명 : "id", 속성값 : "id_spark_quiz"

<a href="https://forms.gle/Fw49w9GhWQChDcZm7"> 6/13 Spark 심화과정 </a>
태그 : a, 속성명 : "href", 속성값 : "https://forms.gle/Fw49w9GhWQChDcZm7", 텍스트 : 6/13 Spark 심화과정

 

위에서 추출한 'a 태그'에서 URL 주소랑, 웹페이지에 보이는 텍스트를 추출해보자.

link = aTags[0].attrs["href"]
title = aTags[0].text
print(link, title)


결과 :

https://forms.gle/Fw49w9GhWQChDcZm7  6/13 Spark 심화과정 

 

위에서 하나 추출해서 디버깅을 해봤으니 이걸 리스트에 모두 담아보자.

linkList = []
titleList = []

aTagsLen = len(aTags)
for i in range(0,aTagsLen,):
    linkList.append(aTags[i].attrs["href"])
    titleList.append(aTags[i].text)
    
    
linkList

결과 :

['https://forms.gle/Fw49w9GhWQChDcZm7',
 'https://forms.gle/G4TcXm3fKuHLHA6D6',
 'https://forms.gle/M8gr1kC2ubA3UDVp8',
 'https://forms.gle/h8w5mZ4MNaPLCPbi6',
 'https://forms.gle/q5yL6QHfueDLM5w27',
 'https://forms.gle/Gxb4y6LfVYiaLu4M7']
 
 
 titleList
 
 결과 :
 
 [' 6/13 Spark 심화과정 ',
 ' 6/13 Spark 기본과정 ',
 ' 6/18 Spark [MAP_FILTER] ',
 ' 6/18 Spark GroupBy 심화 ',
 ' 6/25 Spark RDD 실전 분석 ',
 ' 6/27 Spark RDD 실전 분석2 ']

 

4. 원하는 요소들을 모두 뽑아냈으니 DataFrame으로 만들어보자.

# 원하는 것들을 속성별로 뽑아내 리스트에 담았다. 이제 이걸 판다스를 이용해 DataFrame로 만든다.(컬럼헤더도 붙여보자.)

combinedList_DF = pd.DataFrame(zip(titleList, linkList), columns = ["spark 퀴즈 타이틀", "spark 퀴즈 링크"] )
combinedList_DF

 

cf. find_all은 find_all(name = 'ABC', limit = 3) 이런식으로 개수를 제한시키는 방법으로 응용할 수 있다.

 

 

셀레니움 활용 : 2020/05/04 - [개발자/Python] - Python (파이썬) 웹 크롤링 기초 - Spark 퀴즈 정보 긁어오기 (Selenium O)

 

Python (파이썬) 웹 크롤링 기초 - Spark 퀴즈 정보 긁어오기 (Selenium O)

2020/04/22 - [개발자/Python] - Python (파이썬) 웹 크롤링 기초 - Spark 퀴즈 정보 긁어오기 Python (파이썬) 웹 크롤링 기초 - Spark 퀴즈 정보 긁어오기 1. 페이지 저장하기 import requests, bs4 # 비슷한 애..

greendreamtrre.tistory.com

 

완성본 모음

더보기

1. 요소를 리스트로 추출해 열(column)을 만들어 판다스로 합치는 방법. (위에서 한 방법)

열(column)이 많을 경우 n개의 컬럼이 있다면 n개의 열을 만들어야한다. (= for문을 돌릴 n개의 리스트를 만들어야한다.)
따라서 열이 적을 때 유리하다.(즉, 열이 많을 때 불리하지만 행이 많을 때 유리하다.)

import requests, bs4    # 비슷한 애들 끼리는 콤마(,)로 한 번에 선언해도 된다. requests : 웹페이지 긁어옴. bs4 : 파이썬의 IDE
import pandas as pd     # 얘도 한 번에 선언할 수는 있지만 그러면 가독성이 떨어진다.

# Step 1. requests 모듈로 웹페이지 긁어와 저장하기.
spark_url = "https://www.sparkkorea.com/퀴즈"
response = requests.get(spark_url)    # requests 함수를 이용해 서버를 get(얻어낸다)!
response.encoding = 'UTF-8'

# Step 2. bs4(BeautifulSoup) 모듈로 웹페이지를 예쁘게 담기.
spark_html = response.text    # spark_html이란 변수에 위에서 불러온 response를 text로 담아라.
spark_html_bs = bs4.BeautifulSoup(spark_html, "html.parser")    # spark_html에 대해서 "html.parser" 파싱하겠다. ("html.parser"는 안 써도 잘 돌아가긴 한다.)
# spark_html_bs라는 변수에 bs4(BeautifulSoup)모듈의 BeautifulSoup 함수를 이용해 예쁘게 담아라.
# 우리가 코드를 짤 때 IDE(이클립스, 아톰 등)을 사용하듯이 BeautifulSoup가 파이썬 내에서 코드를 예쁘게 보여준다.
# 앞으로 모든것은 bs4를 이용해 담은 이 'spark_html_bs'를 이용해 bs4의 다른 함수를 이용해 분석할거다.
# spark_html_bs # 디버깅용.

# Step 3. (범위 좁히기) 수많은 'div 태그' 구역 중 원하는 구역의 'div 태그' 구역만 골라서 추출해보자. (개발자 도구로 미리 확인하기.)
# div 태그 : 속성 (i.e. id, class, etc...) 별로 구역을 나눈다. 이를 이용해 특정 구역에 특정 조건을 넣어 검색할 수 있다.
# name = "태그명", attrs = {"속성명":"속성값"} 으로 찾는다. 여기서 attrs(파라미터)는 "id명":"id값" 또는 "class명":"class값"이다.
# divTags_including_aTags에 spark_html_bs에서 찾아라.
# 태그 이름이 div인데 그 중에서 {}"속성명":"속성값"}은 {"class":"class_spark_quiz", "id":"id_spark_quiz"}다.
divTags_including_aTags = spark_html_bs.find\
(name = "div", attrs = {"class":"class_spark_quiz", "id":"id_spark_quiz"}) # find_all도 가능.
# divTags_including_aTags # 디버깅용.

# Step 4. (범위 좁히기) 추출한 'div 태그' 구역 중 원하는 'a 태그'만 다시 추출하자.
aTags = divTags_including_aTags.find_all(name = "a")
# aTags # 디버깅용. (리스트는 아니지만 인덱스를 가져 리스트처럼 사용할 수 있다.)

# Step 5. 태그 범위 좁히기가 완료되면 원하는 요소만 뽑아서 리스트로 담아보자.
linkList = []
titleList = []

aTagsLen = len(aTags)
for i in range(0,aTagsLen,):
    linkList.append(aTags[i].attrs["href"])
    titleList.append(aTags[i].text)
    
# Step 6. 위에서 만든 각각의 요소 리스트를 DataFrame으로 만들어보자.
combinedList_DF = pd.DataFrame(zip(titleList, linkList), columns = ["spark 퀴즈 타이틀", "spark 퀴즈 링크"] )
combinedList_DF

 

2. n번째 행의 요소를 객체 데이터 리스트로 만들어 매트릭스를 만들고 판다스로 합치는 방법 (열(column)이 많을 때 유리하다)

Step 4. 까지는 동일하다. Step 5. 부터 어떻게 다른지 보자.
(위에와 반대의 성격을 갖는다. 열이 많을 때 유리하고, 행이 많을때는 불리하다.)

import requests, bs4    # 비슷한 애들 끼리는 콤마(,)로 한 번에 선언해도 된다. requests : 웹페이지 긁어옴. bs4 : 파이썬의 IDE
import pandas as pd     # 얘도 한 번에 선언할 수는 있지만 그러면 가독성이 떨어진다.

# Step 1. requests 모듈로 웹페이지 긁어와 저장하기.
spark_url = "https://www.sparkkorea.com/퀴즈"
response = requests.get(spark_url)    # requests 함수를 이용해 서버를 get(얻어낸다)!
response.encoding = 'UTF-8'

# Step 2. bs4(BeautifulSoup) 모듈로 웹페이지를 예쁘게 담기.
spark_html = response.text    # spark_html이란 변수에 위에서 불러온 response를 text로 담아라.
spark_html_bs = bs4.BeautifulSoup(spark_html, "html.parser")    # spark_html에 대해서 "html.parser" 파싱하겠다. ("html.parser"는 안 써도 잘 돌아가긴 한다.)
# spark_html_bs라는 변수에 bs4(BeautifulSoup)모듈의 BeautifulSoup 함수를 이용해 예쁘게 담아라.
# 우리가 코드를 짤 때 IDE(이클립스, 아톰 등)을 사용하듯이 BeautifulSoup가 파이썬 내에서 코드를 예쁘게 보여준다.
# 앞으로 모든것은 bs4를 이용해 담은 이 'spark_html_bs'를 이용해 bs4의 다른 함수를 이용해 분석할거다.
# spark_html_bs # 디버깅용.

# Step 3. (범위 좁히기) 수많은 'div 태그' 구역 중 원하는 구역의 'div 태그' 구역만 골라서 추출해보자. (개발자 도구로 미리 확인하기.)
# div 태그 : 속성 (i.e. id, class, etc...) 별로 구역을 나눈다. 이를 이용해 특정 구역에 특정 조건을 넣어 검색할 수 있다.
# name = "태그명", attrs = {"속성명":"속성값"} 으로 찾는다. 여기서 attrs(파라미터)는 "id명":"id값" 또는 "class명":"class값"이다.
# divTags_including_aTags에 spark_html_bs에서 찾아라.
# 태그 이름이 div인데 그 중에서 {}"속성명":"속성값"}은 {"class":"class_spark_quiz", "id":"id_spark_quiz"}다.
divTags_including_aTags = spark_html_bs.find\
(name = "div", attrs = {"class":"class_spark_quiz", "id":"id_spark_quiz"}) # find_all도 가능.
# divTags_including_aTags # 디버깅용.

# Step 4. (범위 좁히기) 추출한 'div 태그' 구역 중 원하는 'a 태그'만 다시 추출하자.
aTags = divTags_including_aTags.find_all(name = "a")
# aTags # 디버깅용. (리스트는 아니지만 인덱스를 가져 리스트처럼 사용할 수 있다.)

# Step 5. 태그 범위 좁히기가 완료되면 원하는 요소만 뽑아서 매트릭스 리스트로 담아보자.
rowList = []    # 행을 만들어줄 바깥 리스트 생성하기.

aTagsLen = len(aTags)
for i in range(0, aTagsLen,):
    eachText = aTags[i].text               # i번째 객체 데이터에 넣을 'spark 퀴즈 타이틀'을 추출.
    eachTitle = aTags[i].attrs["href"]     # i번째 객체 데이터에 넣을 'spark 퀴즈 링크'을 추출.
        
    # [eachText,eachTitle]을 하나의 객체 데이터 리스트로 만들어 바깥 리스트(rowList)에 넣어 매트릭스 만들기.
    rowList.append([eachText,eachTitle])
    
# Step 6. 위에서 만든 매트릭스 리스트를 DataFrame으로 만들어보자.
rowList_DF = pd.DataFrame(rowList, columns = ["spark 퀴즈 타이틀","spark 퀴즈 링크"])
rowList_DF

 

2.2 위에 2번을 그냥 짧게 줄인 것

import requests, bs4
import pandas as pd

url = 'https://sparkkorea.com/퀴즈/'
response = requests.get(url).text.encode('utf-8')
response_bs = bs4.BeautifulSoup(response, "html.parser")

target = response_bs.find_all(name='div', attrs={'class':'class_spark_quiz'})
target

target = target[0].find_all(name='a')
target

target[0]    # <a href="https://forms.gle/Fw49w9GhWQChDcZm7"> 6/13 Spark 심화과정 </a>
target[0].attrs    # {'href': 'https://forms.gle/Fw49w9GhWQChDcZm7'} # 딕셔너리 형태 확인.
target[0].attrs['href']    # 'https://forms.gle/Fw49w9GhWQChDcZm7' # 딕셔너리니까 Key로 Value를 호출.

target[0].name    # 'a'
target[0].text    # ' 6/13 Spark 심화과정 '

resultList = []

targetLen = len(target)
for i in range(0,targetLen,):
    targetLink = target[i].attrs['href']
    targetName = target[i].text
    
    resultList.append([targetLink,targetName])    # 매트릭스로 담는다.

resultList

quizDB = pd.DataFrame(resultList, columns=['퀴즈 링크','퀴즈 제목'])
quizDB

+ Recent posts