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()
---------------------------------------------------------------------
셀리니움의 list selector
name의 container는 driver.find_elements_by_css_selector() 이므로,
현재 웹페이지와 컨테이너,선택자 모두 같아야해.
->셀리니움은 보고있는 페이지, 단지 그것만을 크롤링 해줌
for try,except에서 break의 위치
break가 for문을 위한 것이기때문에 한번쓰인다면, 상위 for문에 대해 작동한다.
+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을해서 뭐 혼선이 있다는데.
페이지마다 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값이 넣어진후에 다음 코드를 읽기 시작함
'코알라UNIV' 카테고리의 다른 글
7주차 데이터로 타이타닉을 분석하라 (0) | 2019.11.20 |
---|---|
~중간점검~ (0) | 2019.11.13 |
5주차 똑똑하게 데이터 수집하기 (0) | 2019.11.06 |
4주차 데이터를 저장하는 방법 (0) | 2019.11.01 |
3주차 파이썬으로 데이터 수집하기 (0) | 2019.10.17 |