본문 바로가기
코알라UNIV

5주차 똑똑하게 데이터 수집하기

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

 

선택자의 tag만으로 선택하기어려울때가있다.

class이름은 없고 같은 상위 컨테이너에 같은 태그로 있을때, 순서를 이용해서 타겟팅을 해주어야한다.

(공통적으로 selector를 이용함)

 

in 선택자 in 리스트
error(없는 값에 .text -> error) error(out of border ex:list[3])
Data 1개 -> if문 string 사용가능 Data가 나눠짐
nth-of-type(1,2,3,4...) list[0,1,2,3,4...]

nth-child는 단독으로 쓰이는게 의미가 있는듯 li:nth-child 해도 nth-child가 우선시됨

 

nth-of-type - 주의사항

1. 무조껀 ">"을 써줘야한다.

2. class , id 와 함께쓰이면 안된다.

 

if-> 비교연산자들 / continue break / in list , in "string"

지극히 개인적인 부분

select_one("p").text (o) ///// select_one("p span").text (x) 선택은 하나만되

나머지는 누락/ find_all 같은느낌이 아니야

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡstage3.stage4ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

조금 더 다양한 데이터를 얻기 위함

1. 속성값

2. 이중 requests

3. 데이터를 원하는 파일형식으로 저장

1. url= title.attrs["href"]속성값 가져오기

  • 속성값을 문자열로 받기때문에 .text 써주면 error남

2. for문안에 한번 더 requests

  • 이중 requests에서는 굳이 다시 container를 잡을 필요가없는것이 대부분의 경우가 중복값이 없기때문에 그 페이지 자체가 컨테이너가 되는 경우가 많다.

3. from urllib.request import urlretrieve

urltretrieve(img.attrs['src'], Directory/파일명.확장자)

  • Data에 맞는 확장자가 있음(저장할 때 잘 해야겠지?/오히려 속일 수가 있어)
  • 컴퓨터 환경이나 방화벽들의 문제들로 urllib에서 urlretrieve가 안되는경우 :
     import ssl
     ssl._create_default_https_context = ssl._create_unverified_context

 

 

자작문제/

문제만들기.pptx
1.72MB

 

네이버쇼핑 top100 물품에 대해 최저가top3 쇼핑몰을 crawling 할때, 중간에 가다가 에러가 나는 경우가 있어서 질문을 올렸었다.

배경사진이 없어서 ㅋ;

- def에서 return이 작동하는 원리

try,except 구문을 두번 사용한 함수 trycatch

code는 위에서 아래로 읽기 때문에, 첫번째 try except에서 둘 중 무엇이 되었간에 밑에 있는 try and except에 씌여진 return값으로 반환될꺼라고 생각했었다. 하지만 실제로는 예상했던 코드의 동작방법과는 다르게 작동하였다.

틀릴꺼라고 생각했는데 잘 동작하는 경우....왜 되는거지??

그 이유를 알고자 두가지 경우로 실험해보았다.

1. try except를 함수 적용

2. try except를 함수없이 적용

두 값이 다르게 나왔다.

오른쪽사진의 왼쪽 소스코드가 함수로 tryandExcept를 해본것이고, 오른쪽 소스코드가 함수없이 사용해본 것이다.

함수로 썼을때는 '1' 이 출력됬고, 함수를 쓰지않았을 때는 '2ddd'가 출력됬다.

둘의 차이는 return 때문이다. return은 반환과 동시에 함수를 끝내는 것으로 보인다. for문의 break 기능을 return에서 가지고 있는 것으로 예측된다. (실제로도 맞다 12/29)

try를 하고, 또 다시 다른 try를 해보는 식의 다중 try를 if문의 elif 같은 형태로 만들고 싶다는 질문에 대한 답변:

 

 

 

 

 

 


코알라에 나온 질문

1. https://coalastudy.com/feed/2411

"nth-of-type 을 자손으로 했을 때 어떻게 선택되어질까?" 에 대한 설명.

설명에 의하면, 자손에 해당하는 div까지 모두 수집한 후에 nth-of-type을 적용한다고하는데 나는 다르게 생각한다.

director를 for문 돌렸을 때 다른 것이 출력되는 것이 아니 추가적으로 출력된 것을 보면

div:nth-of-type(2)에 해당하는 모든 녀석을 자손으로 찾으니깐 여러값이 뜨는 것으로 보인다. 이는 html inspection에서 ctrl+F 로하여 검색한 결과와 일치한다.

2.https://coalastudy.com/feed/2436 내용은 모두 이해했음. 해결방안도 앎

그냥 자연스럽게 한 것이라, 알 수 있었던 이유를 되짚어보니  https://steniipion.tistory.com/11 3주차에 있었던 Camila 와 Shawn의 Senorita에서 select_one 선택되어 .text를 하면 그 안의 태그 속 Data까지 모두 끌어와진다는 것을 알고 있었기때문이다.

코드를 해석해보면서 느낀 점

  • try: 1) 2) 3) vs try: 1) try: 2)
  • javascript의 join : var element = element.join() <--------> python의 join : element = ",".join(element)
  • .text 는 값이 없거나, list이거나 , 이미 .text를 적용했거나 다 error가 뜬다.
  • print("안녕하세요"+html태그) ->(x) :print안에는 모두 같은 형식이여야함