BeautifulSoup 모듈은 HTML과 XML을 파싱하는 데에 사용되는 파이썬 라이브러리
설치
$ pip install beautifulsoup4
$ pip list
목표 :https://www.rottentomatoes.com 사이트 메인화면의 Top Box Office에 해당하는 영화 제목과 링크 리스트를 가져온다.
fromurllib.requestimporturlopenfrombs4importBeautifulSoupurl="https://www.rottentomatoes.com/"html=urlopen(url)source=html.read()# 바이트코드 type으로 소스를 읽는다.html.close()# urlopen을 진행한 후에는 close를 한다.soup=BeautifulSoup(source,"html5lib")# 파싱할 문서를 BeautifulSoup 클래스의 생성자에 넘겨주어 문서 개체를 생성, 관습적으로 soup 이라 부름table=soup.find(id="Top-Box-Office")movies=table.find_all(class_="middle_col")formovieinmovies:title=movie.get_text()print(title,end=' ')link=movie.a.get('href')url='https://www.rottentomatoes.com'+linkprint(url)
결과화면
The Fate of the Furious
https://www.rottentomatoes.com/m/the_fate_of_the_furious
The Boss Baby
https://www.rottentomatoes.com/m/the_boss_baby
Beauty and the Beast
https://www.rottentomatoes.com/m/beauty_and_the_beast_2017
....
....
beautifulsoup을 사용한 스크랩핑 2
목표 : stack overflow 에서 python 검색 결과 질문 리스트와 링크를 가져온다.
Mutually exclusive many-to-many relationship in Django models
http://stackoverflow.com/questions/43657599/mutually-exclusive-many-to-many-relationship-in-django-models
How can I get the index of selected item in a treeview?
http://stackoverflow.com/questions/43657591/how-can-i-get-the-index-of-selected-item-in-a-treeview
How to install Tkinter module with python 2.7.5 in Redhat linux 7?
http://stackoverflow.com/questions/43657590/how-to-install-tkinter-module-with-python-2-7-5-in-redhat-linux-7
Grouping columns in python tabulate alphabetically
http://stackoverflow.com/questions/43657584/grouping-columns-in-python-tabulate-alphabetically
...
...
selenium을 사용한 크롤링(Crawling)
beautifulsoup은 사용자 행동을 특정해서 데이터를 가져올 수 없다.
사용자의 행동을 동적으로 추가하려면 selenium이 필요하다.
selenium 및 웹 드라이버 설치
selenium 설치
Selenium은 테스트 코드 실행으로 브라우저에서의 액션을 테스트 할 수 있게 해주는 테스팅 도구
드라이버는 브라우저를 띄우고 통제 드라이빙하는 역할을 한다.
(WebDriver는 웹 브라우저와 selenium API 사이의 교량 역할을 한다. 테스트될 웹 페이지에 jQuery가 로드되어 있으면 selenium API를 통해서도 그와 관련된 이벤트를 전송할 수 있다. 테스트될 웹 페이지에 특정 css가 로드되어 있으면 이 또한 참조할 수 있다. URL 변경, input 테그의 내용 조작, css 변경 등 해당 웹 페이지의 모든 것을 제어할 수 있다.)
$ sudo mv geckodriver /usr/local/bin
selenium을 사용한 google 크롤링
목표 : 구글에 접속하여 ‘macbook pro’를 검색하고, 검색 결과 제목을 가져온다.
MacBook Pro - Apple (KR)
MacBook Pro 구입하기 - Apple (KR)
MacBook Pro 식별 방법 - Apple 지원
Apple MacBook Pro - Best Buy
MacBook Pro - Wikipedia
MacBook Pro: Thinner Design With New OLED Touch Bar, Order Now
Vertical MacBook Pro 2016 – Henge Docks
New MacBook Pro - iStore
Apple MacBooks: Pro, Air, Original Macbook | B&H
Amazon.com: Apple MacBook Pro MF839LL/A 13.3-Inch Laptop with ...
python수업을 듣거나 알고리즘 문제를 풀 때 jupyter notebook을 자주 사용하고 있다.
코드를 수정하기 편하고 결과를 바로 확인 할 수 있어서 좋은데, 배경화면이 흰색이라 눈이 아팠다.
레티나에서 볼 때는 봐줄만 하지만 외부모니터(DELL Ultrasharp)는 눈이 부셔서 흰 화면을 띄우기가 힘들다.
그래서 찾아보니 간단하게 iPython Jupyter Notebook 테마를 바꿀수 있었다!
A binary gap within a positive integer N is any maximal sequence of consecutive zeros that is surrounded by ones at both ends in the binary representation of N.
For example, number 9 has binary representation 1001 and contains a binary gap of length 2. The number 529 has binary representation 1000010001 and contains two binary gaps: one of length 4 and one of length 3. The number 20 has binary representation 10100 and contains one binary gap of length 1. The number 15 has binary representation 1111 and has no binary gaps.
Write a function:
def solution(N)
**that, given a positive integer N, returns the length of its longest binary gap. The function should return 0 if N doesn’t contain a binary gap.
For example, given N = 1041 the function should return 5, because N has binary representation 10000010001 and so its longest binary gap is of length 5.**
Assume that:
N is an integer within the range [1..2,147,483,647].
Complexity:
**expected worst-case time complexity is O(log(N));
expected worst-case space complexity is O(1).**
풀이과정
함수의 인자로 받은 N을 2진수로 바꾼다
2진수 N의 각 자릿수 중에 1에 해당하는 자릿수의 인덱스 값을 찾아 빈 배열에 담는다.
배열에 담긴 요소를 인접한 요소와 뺀 결과를 새로운 빈 배열에 담는다.
그중에서 최댓값을 리턴한다.
풀이코드
defsolution(N):N=bin(N)[2:]# 함수의 인자로 받은 N을 2진수로 바꾼다, format(N, 'b') 도 가능arr=[]foridx,valueinenumerate(N):ifvalue=='1':arr.append(idx)# 2진수 N의 각 자릿수 중에 1에 해당하는 자릿수의 인덱스 값을 찾아 빈 배열에 담는다.arr2=[]foriinrange(len(arr)-1):arr2.append(arr[i+1]-arr[i]-1)# 배열에 담긴 요소를 인접한 요소와 뺀 결과를 새로운 빈 배열에 담는다.returnmax(arr2)# 그 중에서 최댓값을 리턴한다.
#1defsolution(N):returnlen(max(bin(N)[2:].strip('0').strip('1').split('1')))# Big-O : N#2defsolution(N):returnlen(max(format(N,'b').strip('0').split('1')))# Big-O : N
.strip() / .split()
str.strip() 메소드를 활용하여 문자열 양 끝에서 원하는 연속된 문자열을 삭제할 수 있다.
# 2진수 '100100010000' 의 경우,'100100010000'.strip('0')# '10010001'# 좌, 우 끝의 모든 연속된 0을 삭제'100100010000'.strip('0').strip('1')# '001000'# 좌,우 끝의 모든 연속된 1을 삭제'100100010000'.strip('0').strip('1').split('1')# ['00', '000']# 1을 기준으로 문자열을 나눠 배열에 담는다
플래닝 포커 를 통해서 주어진 문제를 푸는데 어느정도의 시간이 걸릴지 협의하고, 2명씩 팀을 이루어 페어 프로그래밍 을 진행하였다.
전략을 제시하는 네비게이터와 코드를 작성하는 드라이버의 역할을 5분에 한번씩 돌아가면서 맡았는데 신선하고 즐거운 경험이었다. 비록 3문제 중에 1문제 밖에 풀지 못했지만 생각했던 풀이 방식에 대해서 상대방에게 말로 설명하면서 막연했던 생각이 더 구체화 되는 기분도 들었다.
배려심 있는 좋은 팀원을 만나 즐겁게 진행했는데, 그렇지 않은 팀도 있었나보다 (‘잘하면 고효율, 못하면 가문의 원수가 되는 짝프로그래밍’ 이라는 말이 그냥 나온 말이 아닌가 보다..)
실력도 중요하지만 무엇보다 함께 일하고 싶은 사람 이 되어야겠다는 생각을 다시 했다.
한달 동안 거의 매일같이 수업에 참여했는데, 수업 이전에 3달 정도를 혼자 공부하다가 다른 사람들과 함께 공부하니 즐거웠다. 특히 바로 궁금한 걸 물어볼 수 있는 선생님이 계시는 게 좋았다.
스크랩핑, 크롤링 수업 내용을 다시 연습하고 강의노트를 정리했다. 아직 구체적으로 필요성을 느끼지 못해서 그런지 적극적으로 찾아서 배우고 싶다는 마음은 (아직은) 생기지 않는다. 그리고 무엇보다 만들고 싶은걸 하려면 공부해야 할 것들이 많다..!
django 연습 프로젝트의 github의 커밋 이력을 다시 읽어보았다. 그동안은 별다른 기준 없이 커밋을 진행했지만, 이제부터는 선생님의 패턴을 참고하여 신경써서 진행하려고 한다. 복습겸 깃헙에서 커밋 이력을 살펴보았는데, 작은 단위로 커밋을 진행하니 훨씬 코드를 수정사항을 이해하기 빠르다는 인상을 받았다.
Flask, sqlite를 사용하여 db를 화면에 표시하고, form을 사용하여 post로 전송한 데이터를 db에 저장하는 기능을 연습했다.
django에서 구현해본 기능이라 공식문서를 찾아보면 쉽게 구현할 수 있지 않을까 생각했는데 생각보다 시간이 걸렸다.
그동안 한국어로 된 동영상 강의를 보면서 너무 쉽게만 배운려고 한건 아니었나 생각이 들었다.
앞으로 일부러라도 공식 기술 문서를 읽고 원하는 기능을 구현하는 경험을 쌓아야겠다.
내일 할 일
vagrant 설치하고 가상환경 위에 postgreSQL 설치
django 프로젝트 내 app 구분 기준에 대해서 선생님께 의견 들어보기
컴퓨터 공학 입문 마지막 수업 참여
4월 25일 (화)
오늘 할 일 (계획)
BinaryGap 알고리즘 문제 다른사람 풀이 살펴보기
Big-O 에 대해서 공부하고 알고리즘 문제 풀이 코드의 Big-O 구하기
강사님께 문의 드리기 (퀵소트 시간 복잡도)
오늘 한 일 (회고)
BinaryGap알고리즘 문제의 다른 사람 코드를 살펴보았다. strip(), split() 메소드를 사용해서 코드 1줄로 해결하는 풀이가 인상적이었다. (나는 왜 저런 식으로 접근하지 못했을까!) 충분히 고민을 해본 뒤에 잘하는 사람의 코드를 보면 항상 감탄하게 되고 배우는 것도 많은 것 같다.
앞으로 알고리즘 문제를 풀면서 big-O를 함께 구해보려고 하는데, 내가 구한 Big-O가 맞는건지 모르겠다. 이 부분은 선생님께 조언을 들어봐야겠다. 찾아보니 코드를 넣으면 big-O를 자동으로 구해주거나 하는 프로그램은 없는 것 같다. (Big-O is easy to calculate, if you know how)
Write two Python functions to find the minimum number in a list.
The first function should compare each number to every other number on the list. O(n^2).
The second function should be linear O(n)