[Bigdata 수집] urllib,requests (정적크롤링)/ Beautiful Soup 뷰티풀수프
정적 콘텐츠- HTML태그와 CSS로만 구성되는 웹 페이지
->간단히 추출가능
동적 컨텐츠- Javascript를 이용한 웹페이지
->Selenium기술 사용 필요
이번 글에서는 정적 콘텐츠를 추출하는 방법에 대해 알아보겠습니다! *^▽^*
스크래핑, 크롤링은 HTML이 필요하다.
이 HTML을 parsing(파싱) 하여 정보를 얻어내기 위해
다음 두 가지 웹콘텐츠 추출과정을 거쳐야 한다.
목차
1. "웹 콘텐츠 요청"의 주요모듈 : urllib, requests
3. select로 원하는 결과만 추출 : find_all, find, select
<<<"웹 콘텐츠 요청" 주요 모듈>>>
1. urllib 패키지 활용
2. requests 패키지 활용
두 방식 모두 결과는 같지만 방식만 다르다고 보면 됩니다!
urllib는 encoding과 urlopen을 사용하고
requests는 나중에 나온 방식이라 좀더 단순하게 get,post만 엮어주면 됩니다.
바로 위 예시를 urllib를 쓴다면 다음과 같습니다.
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()
좀 지치는 작업이긴 하지만
역시나 실제로 해보지 않으면
제대로 알 수 없기 때문에 꼭 한 번씩이라도
해보길 바랍니다 :)