본문 바로가기
코알라UNIV

6주차 내 마음대로 움직이는 로봇 브라우저

by 인듯아닌듯 2019. 11. 13.

6주차는 1주차부터 쌓인 누적량이 커져서 내용이 길어진다. 그래서 보기좋게 정리하는데 오랜시간이 걸린다.

그래도 마지막 주차인 만큼 알고있는 모든 내용을 쏟아붓기로한다

 

 

정적페이지와 동적페이지 구분

동적페이지:

1. 주소가 바뀌지않음

2. 검사 창에 있는 정보가 소스코드에는 존재하지않음

3. 1번2번의 이유는 유저가 행동에 따라 변할때, 페이지가 new_load 되는 것이 아니라, 페이지는 변하지않고 페이지안의 앱이 연산하는 것이기 때문에

  • <input>, <textarea> 등의 태그 안에 텍스트를 입력하고 싶을 때는선택한 요소에 .send_keys() 함수를 사용하면 원하는 내용을 입력할 수 있습니다.
  • <button>, <a> 등의 클릭 가능한 요소를 선택한 후에는 .click() 함수를 사용해서 상호작용이 가능합니다.
  • select와 select_one 은 find_elements 와 find_element 와 동치이다.-> 완전히 같아서 연속적인 select_one처럼, 연속적으로 selector를 사용하여 element을 찾아줄 수 있음.

-implicitly wait, explicitly wait 차이점

implicitly wait는 내제된 모든코드에서 될때까지 기다려주는 것

->근데 실행가능하면 바로 넘어감. 이것때문에 값을 load하지 못하는경우가 많다 차라리 time.sleep()이 확실해서 좋다.

explicitly wait는 특정코드에서 될때까지 기다려주는것(조금 어렵게 쓰이는 것으로 알고있다)

만약 여러분이 ajax를 사용하지 않는 웹 사이트에서 단순하게 DOM구조만 변경되는 상황이라면 사실 Explicitly wait을 사용하지 않아도 괜찮을 가능성이 높습니다. (DOM API처리속도는 굉장히 빠릅니다.) 하지만 최신 웹 사이트들은 대부분 ajax요청을 통해 웹 구조를 바꾸는 SPA(Single Page App)이 많기 때문에 크롤링을 진행할 때 Explicitly wait을 이용하는 것이 좋습니다.

webdriver.Chrome("./chromedriver")는 꼭 써줘야하는 요소

웹브라우저 기다려주는 방법 3개중 2개

webdriver.Chrome("./chromedriver").implicitly_wait()

time.wait()

---------------------------------------------------------------------

name =container.find_elements_by_css_selector()

셀리니움의 list selector

name의 container는 driver.find_elements_by_css_selector() 이므로,

현재 웹페이지와 컨테이너,선택자 모두 같아야해.

->셀리니움은 보고있는 페이지, 단지 그것만을 크롤링 해줌

 

for try,except에서 break의 위치

break가 for문을 위한 것이기때문에 한번쓰인다면, 상위 for문에 대해 작동한다.

왼쪽: except 가 실행되면, for문이 break    <-> 오른쪽: for문이 한 번 채 돌지 못하고 break

+try except 에서도 break continue 가 됨

if elif else 처럼 try에서는 뭐지 있을지 궁금했었는데,  pass가 최선

다만 한가지 try에서 오류의 종류에따라 다른 행동을 넣을 순 있다. try 하는 것이 여러개이면 pass 가 최선

facebook.com

페이지 계속 변함/login button의 id값도 변함 -> try except로 해결!

비슷한것으로는 인스타그램의 페이지가 chromedriver로 열었을 때, 열리기도하고 안열리기도 함.(이때 페이지에 영향을 주지않는 명령어값을 더해주면 된다? ex) &q=

컨테이너를 다 잡아놓고 list에서도 slicing가 됨!

기본적으로 driver.implicitly_wait(101) 을 쓰면 편한데

이제 태그가 <button>,<a> 아닌 div에서 sleep을 안쓰니깐, implicitly로는 해결이 안되고 에러가 뜬다.

sleep를 쓰니 해결됨.

javascript가 click을해서 뭐 혼선이 있다는데.

https://stackoverflow.com/questions/48665001/can-not-click-on-a-element-elementclickinterceptedexception-in-splinter-selen

 

네이버지도에서 '방방' 검색후 page변경하는 중

페이지마다 container를 새로 잡아줘야하므로 for 문안으로!


스터디하면서 느낀점

1.selenium은 우리가 실제로 보고있는 보여지는 페이지만 가져온다.

보이지 않는 값이 '검사창'에 모두 잡혀도 그것이 잡히지않음(공백으로 나옴)


2. 오류나면 time.sleep 이 답이 될 수 있다.

-> 완벽하게 멈출때까지 time.sleep을 해줘야지 안그러면 SPA가 load되는중 크롤링을 하게된다.

-> implicitly time은 페이지가 로드 될때까지 기다려주는거고 실제로 속도문제로 모든 내용이 load되도록 기다려주기위해서는 sleep이 좀 더 확실한 방법 같으니,  implicitly time < time.sleep 가 낫다고 생각된다.

3. requests에서는 클래스명 쓰고 nth-of-type 하면 안된다고했었는데 셀리니움에서는 된다.

(+아니 requests에서도 .class:nth-of-type()이 된다.)

 


옛날내용 다시 복습하면서 느끼는 것들

Class name이 두개인 것들// 다 써도되고 하나만 써도되고

navershoppingTop100

wait의 사용 -> 길게해야하고, 같은코드로 접근하면 또안됨

input은 input값이 넣어진후에 다음 코드를 읽기 시작함

크롤링_6주차_문제.pptx
0.94MB