본문 바로가기

개발

python 파씽 requests,BeautifulSoup



안녕하세요 


오늘은 python을 이용한 파씽을 해보겠습니다.


선행 조건

pip 설치, python2.7 설치





일단 python 으로 웹을 파씽 해보겠습니다.

그러기 위해 라이브러리가  필요합니다. 많은 라이브러리가 있지만 저는 

requests이라는 라이브러리를 사용하겠습니다.(쉽기 때문에)



설치


명령어

$pip install requests



이런 화면이 나오면 성공한 것입니다.


사용법을 알아보겠습니다.


일단 .py 파일 만든후 requests를 import 해줍니다.



기본 사용법은 위와 같이 사용합니다.

requests.get 함수를 사용하여 저장된 get 방식으로 url에 접속합니다.

그 결과를 res 라는 변수에 저장합니다.(다른 변수로 사용가능)

print 문으로 res에서 text를 출력합니다.


(cf. requests 는 post값 cookie 값들도 함께 전송할 수 있습니다. 등등 더 많은 기능들이 있습니다. 공식문서 참고)



python 파일을 실행하면 위와 같이 출력 됩니다.

http://www.naver.com의 html 코드를 정상적으로 출력했습니다.


하지만 저희가 필요한건 html 코드를 제외한 순수 text 입니다. 

이때 필요한 라이브러리가 BeautifulSoup이라는 라이브러리 입니다.



설치

$pip install BeuatifulSoup4



위 화면 처럼 나오면 정상적으로 설치 된 것입니다.



그러면 BeautifulSoup을 사용하여 방금 가져온 naver html 코드에서 텍스트만 추출해 보겠습니다.




위와 같이 코드를 작성 합니다.

BeautifulSoup을 import 한 후


BeautifulSoup이라는 함수를 사용하여 해당 text(res.text)를 html.parser 의 기능을 사용하겠다. 라는 의미로 해석하시면 될 것 같습니다.


 Soup.get_text()는 파씽한 html 코드에서 text 부분만 추출하는 기능입니다.

(Soup.text 로도 동일 기능)


실행 시키면 위와 같이 text만 추출이 가능합니다.



확실히 text만 추출을 했는데 이상한 코드도 포함되어 있습니다.

이는 아마 javascript 일 것입니다. 


이를 없애주기 위해서는 아래와 같은 for문을 사용합니다.




이런식의 사용으로 script를 제거 할 수 있습니다.


이렇게 해도 제거 되지 않을 때 구글 검색 ㄱㄱ 

(네이버는 안되는 경우가 있는데 script 단어를 사용 안하는 경우가 있음 근데 지금은 원하는 부분의 텍스트를 추출할것이기 때문에 상관 없습니다.)


그러면 특정 태그를 찾아보도록 하겠습니다.


제가 찾을 태그 는 



"매일 카페 블로그 지식IN 쇼핑 Pay 사전 뉴스" 등등을 나타내고 있는 태그를 추출하겠습니다.

일단 개발자 모드로 해당 text가 어디에 있는지를 확인합니다.



해당 태크는 div class="section_navbar" 입니다.



사용법은 위와 같습니다.


찾을 태그 div class 나 혹은 id 등등을 입력 해당 이름


Soup.find("div",{"class":"section_navbar'})


cf)

모든 div 태그 추출하기


for i in Soup.findAll("div"):

print i.get_text()


모든 div 태그를 돌면서 안에 있는 ul 태그 추출하기


for i in Soup.findAll("div"):

for j in i.findAll("ul"):

print j.get_text()

이런 식으로 사용하시면 됩니다.

   


그러면 아래와 같이 찾고자 하는 내용을 추출할 수 있습니다.




근데 문제는 정렬입니다.

추출한 택스트에는 \t \n \b \r 등의 문자가 포함되어 있습니다.

여러 방법들이 있겠지만 저는 replace를 사용하여 정렬을 합니다.




TIP

추출한 내용에 어느 공백이 들어가있는지 확인하기


공백이 길게 있다면 space를 여러번 입력한건지 혹은 \t을 사용한건지 눈으로는 확인하기 어렵습니다.

그렇기 때문에 저는 해당 공백을 치환하여 확인합니다.


navbar에 알수 없는 공백들이 있다고 가정


naver=navbar.encode("utf-8").replace("\n","A").replace("\r","B").replace("\t","C")


print naver


이런식으로하면 어디에 어느 공백이 들어가있는지 확인 하실 수 있습니다.

그 후에 가공 ㄱㄱ