IT 프로그래밍/빅데이터

[Bigdata 수집] urllib,requests (정적크롤링)/ Beautiful Soup 뷰티풀수프

잉휴 2021. 3. 2. 17:07

정적 콘텐츠- HTML태그와 CSS로만 구성되는 웹 페이지

->간단히 추출가능

 

동적 컨텐츠- Javascript를 이용한 웹페이지

->Selenium기술 사용 필요

 

이번 글에서는 정적 콘텐츠를 추출하는 방법에 대해 알아보겠습니다! *^▽^*

 

 

스크래핑, 크롤링은 HTML이 필요하다. 

이 HTML을 parsing(파싱) 하여 정보를 얻어내기 위해

다음 두 가지 웹콘텐츠 추출과정을 거쳐야 한다.


목차

1. "웹 콘텐츠 요청"의 주요모듈 : urllib, requests

2. BeautifulSoup 사용 : 파싱

3. select로 원하는 결과만 추출 : find_all, find, select

 

 

<<<"웹 콘텐츠 요청" 주요 모듈>>>

 

1. urllib 패키지 활용

 

2. requests 패키지 활용

 

두 방식 모두 결과는 같지만 방식만 다르다고 보면 됩니다!

 urllib는 encoding과 urlopen을 사용하고

requests는 나중에 나온 방식이라 좀더 단순하게 get,post만 엮어주면 됩니다.

 

바로 위 예시를 urllib를 쓴다면 다음과 같습니다.

s 주의

 


HTML을 가져왔으니 이제 파싱을 해보겠습니다

BEAUTIFUL SOUP

위와 같은 html이 있을때 

bs=BeautifulSoup(html_doc, 'html.parser') 를 이용해 

객체를 생성한다.

 

여러가지 출력방법

내용을 추출하는 방법은  bs.태그명 을 사용하는데

이는 태그의 계층구조를 이용한 접근방식이다.

 

(string,text,get_text는 대체적으로 같은 내용을

추출한다고 보면된다)

 

자세한 설명은 이미지에

 

 

String, text, contents 으로 출력

 

추출해볼 html을 입력하고 속성값을 출력해보았다

 

출력

String, text, contents 마다  나오는 방식이 조금씩 다른 것을 확인할 수 있다

 

부모 태그를 추출하는

bs.태그명.parent

형제 태그를 추출하는

bs.태그명.next_sibling

bs.태그명.previous_sibling

등도 있지만 생략!

 

자손을 추출하는 파싱방법

 

각각의 항목을 전부 가져오려면 for문을 쓰자!

 

*descendatns는 포함된 모든 내용을 추출한다

특정한 것만 나오게 하려면

 

select()

find()

find_all()

사용


Select( )

 

보통 select를 가장 많이 쓴다

만약 가져오려는 li를 찾기 힘들때에는

다음과 같은 방법으로 복사한 후...

 

메모장에 붙여보면 아래처럼 나온다

 

#content > div.article > div:nth-child(1) > div.lst_wrap > ul > li:nth-child(1)

('>' 이 표시는 select()에서 쓰인다)


Select( )의 두 가지 방식

1. requests 방식의 select()

2. urllib 방식의 select()

 

좀 지치는 작업이긴 하지만

역시나 실제로 해보지 않으면

제대로 알 수 없기 때문에 꼭 한 번씩이라도 

해보길 바랍니다 :)