본문 바로가기
Python

[파이썬]웹스크래핑(크롤링)-크롤링 시작하기

by GGShin 2021. 8. 14.

크롤링을 하기위한 기본 셋팅을 마치고 본격적으로 크롤링을 시작해 봅시다. 

먼저 print(soup)을 하여보면, 하단에 해당 페이지의 정보가 다 보이게 됩니다.

이 정보는 해당 페이지의 검사 화면에서 확인가능한 정보와 일치합니다.

바로 이 화면과 일치하는 정보를 볼 수 있습니다. 

BS4에는 크게 두 가지 기능이 있는데, 

하나는 select_one이고 다른 하나는 select 입니다.

 

먼저 select_one을 사용해보겠습니다. 

먼저 스크래핑을 원하는 정보(저는 그린북이라는 정보를 선택했습니다.)를 누른 뒤, 해당 코드에서 마우스 오른쪽->Copy->Copy selector를 눌러 복사합니다. 

selector는 해당 정보가 어디에 있는지를 알려주는 역할을 합니다. 

 

그런 다음 soup.select_one() 의 괄호 안에 붙여넣기 해줍니다. 

print하여 어떤 정보가 나오는지 확인해 보면,

그린 북이라고 하는 제가 선택한 정보가 잘 나오는 것을 확인할 수 있습니다. 

 

.text를 사용해서 <a></a>태그 안에 있는 그린 북 이라는 글자만을 가지고 올 수 도 있습니다. 

그린 북 이라는 글자만 나온 것을 볼 수 있습니다.

[' '] 를 사용해서 태그의 속성을 가지고 올 수 도 있습니다. 

href만 가지고 와봤습니다.

 

그 다음으로, select를 사용하여 복수의 정보를 가져와보겠습니다. 

 

좀 전에는 랭킹에 나온 영화명 중에서 그린 북에 대한 정보만을 가져왔었는데요,

랭킹 창의 모든 영화명을 다루고 싶다면 어떻게 할까요?

바로 select_one 대신 select를 사용하면 됩니다!

 

select를 사용하기 위해서는, 내가 원하는 정보들이 어떠한 공통점을 가지고 있는지 파악하는 것이 선행되어야 합니다.

 

영화 랭킹들을 쭉 보니 각각 <tr></tr>로 묶여있음을 알 수가 있습니다. 

아까 전 그린 북의 셀렉터를 복사한 것 처럼 그린 북 아래 영화들의 셀렉터를 복사해서 코드를 확인해 봅니다.

그러면 위와 같이 #old_content > table > tbody > tr 부분이 공통적이라는 것을 알 수가 있습니다. 

 

그래서 soup.select를 사용해서 공통 부분을 묶어줍니다. 

(select는 자료가 list의 형태로 나오게 됩니다. )

 

for in 문을 활용해서 안의 내용물들을 확인해보면 아래와 같이 tr별로 정보가 잘 나오고 있음을 알 수 있습니다. 

방대한 정보 중에서 영화의 제목만을 가져오고 싶다면,

다시 영화 제목의 셀렉터를 복사해와서 그 구조를 확인해 봅니다.

뒤에 nth-child(2) 부분을 제외하고는 또 공통적이었던 td.title > div > a 부분을 복사합니다. 

그래서 for in 문 안에서 a_tag로 tr.select_one (tr에서 이거 하나만 골라줘) 으로 해당 부분을 넣어주어 그 부분만을 가져오도록 합니다. 

프린트하여서 보면 타이틀만 잘 가지고 왔음을 확인할 수 있습니다.

 

잘나가다가 간혹 중간에 None이 있는 경우가 있는데, 이것은 랭킹 사이트 화면에서 보면 영화 정보가 아닌 가로 줄이 들어가 있어서 그렇습니다.

None 부분이 나오게 하지 않으려면, if  is not None을 활용해서 None 이 아닌 경우만 불러올 수 있습니다. 

중간중간 보이던 None은 빼고 정보를 잘 가져왔습니다. 

그러면 이제 오류 없이 태그 사이의 글자들(영화제목)만 불러올 수 있습니다!

비슷하게 응용하여,

 

몇 위인지 나타내는 숫자와 평점도 불러올 수 있겠습니다.

반응형