[Python] 크롤링 연습문제. reddit 크롤링 풀이
- WebProgramming
- 2019. 2. 18.
[Python] 크롤링 연습문제. reddit 크롤링 풀이
이번 포스트에서는 html.Parser로 파싱한 후에 BeautifulSoup4를 사용하여 www.reddit.com 을 크롤링 해보겠습니다.
실습환경 버전
Python 3.6.0
BeautifulSoup(4.5.3)
requests(2.12.4)
탐색
오늘 제가 크롤링 해볼 www.reddit.com의 모습입니다.
오늘 저는 저기서 타이틀만 가져와서 목록에 뿌려주려고 합니다.
제가 생각해놓은 순서는 이렇습니다.
1. 단순 GET요청
2. html화면에서 쪼개줄 타이틀 찾기
3. html.parser를 통하여 파싱후 타이틀부분 select
일단 해보겠습니다.
1. requests를 사용하여 서버의 응답확인
requests가 무엇인지 궁금하신분 requests 설치부터 라이브러리 사용 바로가기 <-클릭
코드
1
2
3
4
5
6
7
8
9
10
11
12
import requests #requests를 사용
#requests를 사용하여 단순 GET요청. get(주소)
response = requests.get('https://www.reddit.com')
#응답코드 확인
print(response)
#받아온 요청을 text로 변환
html = response.text
print(html)
cs
결과
서버에서 200번 정상응답을 해왔습니다.
2. 타이틀 부분찾기
f12를 눌러 개발자 도구를 열어줍니다.
코드에 마우스를 올리면 해당 부분이 블록으로 잡히게 됩니다. 마우스를 올리니 이녀석의 자식들을 살펴보겠습니다.
그다음은 여기같습니다. 열어봅니다.
이런식으로 타고 내려가줍니다.
찾았습니다. 타이틀 부분이네요.
이제 이녀석을 찾았으니 어떻게 html.parser를 어떻게 사용할 것인지 고민해봅시다.
보시게 되면 맨위의 entry unvoted와 아래의 entry unvoted는 1번째와 2번째의 경계중 하나입니다.
더 상위에서 내려올 수 있지만 이전 포스팅에서 말씀드렸듯 너무 세분화를 하는것은 좋지 않기 때문에 2~3개로 추렸습니다.
div class="entry unvoted"
div class="top-matter"
p class="title"
a class="title"
추려낼 수 있겠습니다.
3. 파싱후 select
복붙용 깔끔한 코드
1
2
3
4
5
6
7
8
9
10
11
import requests
from bs4 import BeautifulSoup
response=requests.get('https://www.reddit.com')
html=response.text
soup=BeautifulSoup(html,'html.parser')
tag_list=soup.select('p.title > a[class*=title]')
for idx, tag in enumerate(tag_list, 1):
print(idx, tag.text)
cs
주석 설명 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import requests
from bs4 import BeautifulSoup
response=requests.get('https://www.reddit.com')
html=response.text
#BeautifulSoup의 인스턴스를 html.parser로 지정(parser의 종류)
soup=BeautifulSoup(html,'html.parser')
# >: p의 title의 직계중. a태그의 class값에 title이 부분매칭되는 태그를 선택
tag_list=soup.select('p.title > a[class*=title]')
#넘버링하여 출력
for idx, tag in enumerate(tag_list, 1):
print(idx, tag.text)
cs
12번째줄 'p.title > a[class*=title]'에 대한 자세한 설명(클릭) 해당 포스트 안에 CSS Selector 참고하시면 됩니다.
확인
1부터 25까지 잘 출력되는것을 확인하실 수 있습니다.