본문 바로가기

나 취준생/파이썬

실전 웹 스크롤링 해보기 1 ( 시청자 게시판 반응 )

320x100

웹 스크롤링 실전 1단계 ( ebs 레이디 버그 게시판 )



아이들 댓글..인줄 알았는데 아니네?

어쨌든 시청자 게시판의 반응들을 스크롤링 해보자




1. 저번에는 웹페이지에서 ctl+s 로 직접 웹페이지를 바탕화면에 저장한 뒤 불러왔지만

이번에는 웹상의 url을 파이썬이 인식할 수 있도록 해주자.


1
2
3
4
5
6
from bs4 import BeautifulSoup
import urllib.request
list_url="http://home.ebs.co.kr/ladybug/board/6/10059819/oneBoardList?hmpMnuld=1"
url=urllib.request.Request(list_url)
result=urllib.request.urlopen(url).read().decode('UTF-8')
print(result)



urllib.request.Request 는 사람이 알아볼 수 있는 url을 파이썬이 알아볼 수 있도록 변환하는 첫번째 작업이다.

그 다음 url의 문서들을 result 변수에 담았다.




result를 print 해보면 이렇게 html 코드가 담겼다.



2. 이렇게 담은 html 코드를 beautiful soup 모듈을 사용해서

웹스크롤링을 할 수 있도록 하자.


1
2
3
4
5
6
7
from bs4 import BeautifulSoup
import urllib.request
list_url="http://home.ebs.co.kr/ladybug/board/6/10059819/oneBoardList?hmpMnuld=1"
url=urllib.request.Request(list_url)
result=urllib.request.urlopen(url).read().decode('UTF-8')
soup=BeautifulSoup(result,"html.parser")
print(soup)

c



3. 이제 웹 페이지로 이동해서, 저번에 설명한 크롬 관리자 모드를 활용한 방법으로

쉽게 class를 찾아보자.




<p class_ ="con" > 재미있다 </p> 를 확인



4. find_all 함수로 p 태그 중 con 클래스에 해당하는 부분 전부 출력하기


1
2
3
4
5
6
7
8
from bs4 import BeautifulSoup
import urllib.request
list_url="http://home.ebs.co.kr/ladybug/board/6/10059819/oneBoardList?hmpMnuld=1"
url=urllib.request.Request(list_url)
result=urllib.request.urlopen(url).read().decode('UTF-8')
soup=BeautifulSoup(result,"html.parser")
result2=soup.find_all('p', class_ ='con')
print(result2)




슬슬 댓글 내용들이 모여 보이기 시작했다.


근데 이 때 마지막 줄이 </p>] 인 것에 주목하자.


형태가 리스트인 것을 기억해두자!




5. 위의 결과에서 html 코드를 제외하고 텍스트만 가져오기


1
2
3
4
5
6
7
8
9
from bs4 import BeautifulSoup
import urllib.request
list_url="http://home.ebs.co.kr/ladybug/board/6/10059819/oneBoardList?hmpMnuld=1"
url=urllib.request.Request(list_url)
result=urllib.request.urlopen(url).read().decode('UTF-8')
soup=BeautifulSoup(result,"html.parser")
result2=soup.find_all('p', class_ ='con')
for i in result2:
    print(i.get_text())





텍스트만 보이긴 하는데 보기가 불편하니까 조건을 좀 더 주자


6. 보기 편하게 가져오기


1
2
3
4
5
6
7
8
9
from bs4 import BeautifulSoup
import urllib.request
list_url="http://home.ebs.co.kr/ladybug/board/6/10059819/oneBoardList?hmpMnuld=1"
url=urllib.request.Request(list_url)
result=urllib.request.urlopen(url).read().decode('UTF-8')
soup=BeautifulSoup(result,"html.parser")
result2=soup.find_all('p', class_ ='con')
for i in result2:
    print(i.get_text(" ",strip=True))




한 번에 캡쳐가 가능할 정도로 줄어들었다!



7. 다음 결과를 params 라는 리스트에 담기


1
2
3
4
5
6
7
8
9
10
11
from bs4 import BeautifulSoup
import urllib.request
list_url="http://home.ebs.co.kr/ladybug/board/6/10059819/oneBoardList?hmpMnuld=1"
url=urllib.request.Request(list_url)
result=urllib.request.urlopen(url).read().decode('UTF-8')
soup=BeautifulSoup(result,"html.parser")
result2=soup.find_all('p', class_ ='con')
params=[]
for i in result2:
    params.append(i.get_text(" ",strip=True))
print(params)




근데 리스트에 담고 보니 아까는 엔터 공백으로 보였던 것들이 \r\n 이런식으로 보인다.


이것은 다음에 데이터 정제에서 다뤄보자



8. 이번에는 게시글을 올린 날짜를 스크롤링하기 위해서

게시글 날짜가 있는 html 문서의 태그 이름과 클래스 이름을 확인하기



아까와 동일한 방법으로 찾아보니,

<span class="date">2020.12.11 19:52</span> 인 것을 확인


9. params2에 날짜들을 담기


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from bs4 import BeautifulSoup
import urllib.request
list_url="http://home.ebs.co.kr/ladybug/board/6/10059819/oneBoardList?hmpMnuld=1"
url=urllib.request.Request(list_url)
result=urllib.request.urlopen(url).read().decode('UTF-8')
soup=BeautifulSoup(result,"html.parser")
result2=soup.find_all('p', class_ ='con')
params=[]
for i in result2:
    params.append(i.get_text(" ",strip=True))
result3=soup.find_all('span', class_ ='date')
params2=[]
for i in result3:
    params2.append(i.get_text(" ",strip=True))
print(params2)




10. 날짜와 텍스트를 함께 출력하기


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from bs4 import BeautifulSoup
import urllib.request
list_url="http://home.ebs.co.kr/ladybug/board/6/10059819/oneBoardList?hmpMnuld=1"
url=urllib.request.Request(list_url)
result=urllib.request.urlopen(url).read().decode('UTF-8')
soup=BeautifulSoup(result,"html.parser")
result2=soup.find_all('p', class_ ='con')
params=[]
for i in result2:
    params.append(i.get_text(" ",strip=True))
result3=soup.find_all('span', class_ ='date')
params2=[]
for i in result3:
    params2.append(i.get_text(" ",strip=True))
for i,j in zip(params2,params):
    print(i,j)




11. 1페이지 뿐만 아니라 게시판 전체의 페이지를 싹 다 출력하기 (핵심)



게시판 1,2,3,... 쭉 있는 url을 한 번 보면,

http://home.ebs.co.kr/ladybug/board/6/10059819/oneBoardList?c.page=1&searchKeywordValue=0&bbsId=10059819&hmpMnuld=1&searchKeyword=&searchCondition=&searchConditionValue=0&


http://home.ebs.co.kr/ladybug/board/6/10059819/oneBoardList?c.page=2&searchKeywordValue=0&bbsId=10059819&hmpMnuld=1&searchKeyword=&searchCondition=&searchConditionValue=0&


http://home.ebs.co.kr/ladybug/board/6/10059819/oneBoardList?c.page=3&searchKeywordValue=0&bbsId=10059819&hmpMnuld=1&searchKeyword=&searchCondition=&searchConditionValue=0&

  

이렇게 페이지 번호만 다르다.

(지금까지 메인 게시판으로 했었네 허허 지금부터 중요하니까 상관은 없지만!)


이것을 활용해서 한꺼번에 스크롤링 해보자


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from bs4 import BeautifulSoup
import urllib.request
for i in range(1,23):
    list_url="http://home.ebs.co.kr/ladybug/board/6/10059819/oneBoardList?c.page="+str(i)+"&searchKeywordValue=0&bbsId=10059819&hmpMnuld=10&searchKeyword=&searchCondition=&searchConditionValue=0&"
    url=urllib.request.Request(list_url)
    result=urllib.request.urlopen(url).read().decode('UTF-8')
    soup=BeautifulSoup(result,"html.parser")
    result2=soup.find_all('p', class_ ='con')
    params=[]
    for i in result2:
        params.append(i.get_text(" ",strip=True))
    result3=soup.find_all('span', class_ ='date')
    params2=[]
    for i in result3:
        params2.append(i.get_text(" ",strip=True))
    for i,j in zip(params2,params):
        print(i,j)




어우 가슴이 웅장해진다


12. 지금 리스트에 담고 출력하고, 다시 []으로 초기화하고를 반복하고 있는데, 그렇게 하지말고

깔끔하게 리스트 하나에 쫙 담도록 수정하기


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from bs4 import BeautifulSoup
import urllib.request
params1=[]
params2=[]
for i in range(1,23):
    list_url="http://home.ebs.co.kr/ladybug/board/6/10059819/oneBoardList?c.page="+str(i)+"&searchKeywordValue=0&bbsId=10059819&hmpMnuld=10&searchKeyword=&searchCondition=&searchConditionValue=0&"
    url=urllib.request.Request(list_url)
    result=urllib.request.urlopen(url).read().decode('UTF-8')
    soup=BeautifulSoup(result,"html.parser")
    result2=soup.find_all('p', class_ ='con')
    
    for i in result2:
        params1.append(i.get_text(" ",strip=True))
    result3=soup.find_all('span', class_ ='date')
    
    for i in result3:
        params2.append(i.get_text(" ",strip=True))
        
for i,j in zip(params2,params1):
    print(i+' '+j)



그냥 리스트 생성을 for문 밖에서 해주고,

print를 for문 밖에 해주면 된다.


그러면 쭈루루루루룩 나오는게 아니고 시간이 좀 걸렸다가, 한 번에 툭 하고 나온다.


13. 댓글과 작성 시간을 메모장에 따로 저장하기


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from bs4 import BeautifulSoup
import urllib.request
params1=[]
params2=[]
f=open('c:\\data\\mytext95.txt','w',encoding='UTF-8')
for i in range(1,23):
    list_url="http://home.ebs.co.kr/ladybug/board/6/10059819/oneBoardList?c.page="+str(i)+"&searchKeywordValue=0&bbsId=10059819&hmpMnuld=10&searchKeyword=&searchCondition=&searchConditionValue=0&"
    url=urllib.request.Request(list_url)
    result=urllib.request.urlopen(url).read().decode('UTF-8')
    soup=BeautifulSoup(result,"html.parser")
    
    result1=soup.find_all('p', class_ ='con')
    result2=soup.find_all('span', class_ ='date')
    
    for i in result1:
        params1.append(i.get_text(" ",strip=True))
    for i in result2:
        params2.append(i.get_text(" ",strip=True))
        
for i,j in zip(params2,params1):
    f.write(i+' '+j+'\n')




반응형

'나 취준생 > 파이썬' 카테고리의 다른 글

웹 스크롤링 연습 (더 나은미래 신문)  (0) 2020.12.18
웹 스크롤링 연습 ( 중앙 일보 기사 )  (0) 2020.12.16
크롤링 입문 - beautiful soup 모듈  (0) 2020.12.15
HTML 기초 개념  (0) 2020.12.15
딕셔너리  (0) 2020.12.10