코알라UNIV

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

인듯아닌듯 2019. 11. 13. 22:16

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