크롤링(bs4, selenium)

bs만 사용하면 동적웹을 다룰수 없기 때문에 selenium을 사용하여 다음페이지로 이동 및 그때 그때해당하는 이벤트를 처리 해줘야한다.

우선, 아마존 리뷰 데이터를 가져 오는것을 목표로 할 예정이다.(프로젝트)

리뷰가 긍정, 부정으로 나줘져 있기 때문에 제일 상단 위치에 main.py를 만들고 한뎁스 들어가서 긍정(cri), 부정(pos).py 를 만들었다.

그리고

if __name__ == "__main__":
    print("File one executed when ran directly")
else:
   print("File one executed when imported")

를 이용하여 main에서 실행하면 작동하게 바꾸었다.

if 부분에 이제 코드를 넣는데 

from tmp import cri 
from tmp import pos

이런식으로  cri와 pos를 가지고 와서 함수를 돌리는 식으로 만들었다.

분석 작업을 하면서 크롤링도 같이 돌리려고 하였지만 크롤링이 자꾸 중간에 멈춰서 다른 컴퓨터 한대에 ubuntu를 설치하였고, ssh로 접속하여 원격으로 돌릴려고 하였다.

하지만

윈도우에서 잘 돌아 가던 코드들이 우분투에 가니깐 잘 안돌아 갔다. (ubuntu 18.04)

원인은 권한과 관련된 오류 였는덧것 같은데 결국 해결하지 못하고, 다른 방법을 찾아봤다.

vscode -> extensions -> remote Explorer로 ssh접속하여 anaconda 환경 바꿔주고 돌리니깐 ubuntu에서 selenium을 사용할때 –headless를 True해주면 잘 되었지만 그럴경우 chrome에서 자동으로 영어를 한국어로 자꾸 번역해줘서 이미 만들어놓은 코드들이 오류가 심각하게 났기 때문에 headless를 False로 돌릴 방법을 생각해야만 했다.

그 결과 jupyter notebook에서 실행해보니 selenium문제가 잘 해결되어서 jupyter notebook에서 작업하기로 생각했다.

 asin = 1234
 
 url=f'https://www.amazon.com/product-reviews/{asin}/ref=cm_cr_arp_d_viewopt_srt?ie=UTF8&reviewerType=all_reviews&sortBy=recent&pageNumber=1'
 
 driver.get(url)

amazon에는 고유 asin넘버가 있어 이것을 먼저 가져와서 리스트형태로 넣어준다면 원하는 품목의 다양한 데이터들을 크롤링 할 수 있다.

source=driver.page_source

soup=bs(source,"html.parser")

위와 같은 방식으로 bs에게 페이지 소스를 넣었고.

soup.select('.a-section.a-spacing-none.review-views.celwidget > div')         


slc_bs.findall(class_='a-row a-spacing-mini review-data review-format-strip').text)


soup.find(attrs={'data-hook':'review-title'}).text.replace('\n','')

soup.select를 사용하면 클레스에 접근할때 ‘.class’ .를 넣어줘서 접근하고 리턴값은 리스트가 된다.

반대로 find와 findall의 경우 {}안에 속성을 넣어 값을 접근하거나 class_=을 사용하여 (python에서는 class가 예약어라 _를 붙혀서 사용한다.) 클레스에 접근한다.

그리고 크롤링 할때 가장중요한 점은 우선 전체 페이지 중에서 내가 가져오고 싶은 페이지의 범위를 먼저 좁혀준 뒤 그다음, 해당 클래스, 테그에 접근하여 데이터를 가져와야한다.

그리고 

아마존의 경우 리뷰가 미국 / 그 외 나라 로 분류가 되어있었고 그때에도 테그가 달라졌기 때문에 나라가 바뀌면 생기는 특수상황을 예외문으로 넣어 다르게 데이터를 가져와라고 잡아줘야 했다.

Leave a Comment

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다