cs109 #Lecture 2 DataScraping

cs109의 강의 구성이 어떻게 되는지 잘 모르겠다..
배운 거 다른 교수가 또 하고 또 하고 그런다.
그리고 올린 강의 교재도 다 안 끝내고 수업이 끝난다.
무슨 영화 트레일러 같은 느낌이다.
여튼 그래도 듣기 시작한 거 다 들어야겠다.


1. Pandas

또 pandas를 배운다..
배우지 못한 것들 위주로 해야겠다..

1.1 Split-Apply-Combine

말 그대로 groupby 함수를 이용해서 split하고,
적용하고 싶은 함수(ex. count(), mean() ...)를 이용해 split된 데이터 프레임에게 apply하고,
다시 합쳐 큰 데이터 프레임을 만든다.

grouped_data = ratings['movie_id'].groupby(ratings['user_id'])

위 코드는 rating의 user_id를 기준으로 rating의 movie_id를 split하는 것이다.
그렇다면 user_id가 한 개일 때 여러가지 moive_id들이 존재할 것이다.

ratings_per_user = grouped_data.count()

쪼개진 데이터 프레임에 count 함수를 적용시킨다.


1.2 Quiz

print (ratings[ratings.movie_id.isin(good_movie_ids)].rating)

이건 도약이 좀 있지만 isin 함수가 잘 쓰일 수 있다는 생각에 써봤다.
ratings 데이터 프레임에 good_movie_ids (rating 이 가장 높은 영화의 ids의 리스트) 가 movie_id 열에 존재하면 isin 함수를 통해 True를 반환한다.
그럼 []안에 True 값이 가리키는 mov의 rating 출력된다.


2. Passing a Function

2.1 lamda

한 줄로 사용자 정의 함수를 표현할 수 있다.

average_ratings = grouped_data.apply(lambda f: f.mean())


3. Python data scraping

3.1 robot.txt

이 문서를 통해 스크래핑이 합법인지 확인할 수 있다.


3.2 Scraping

스크래핑에 유용한 라이브러리로는 urllib, beautifulsoup, pattern 등 여러가지가 존재한다.

url = 'http://www.crummy.com/software/BeautifulSoup'
source = urllib2.urlopen(url).read()

url을 불러와 읽어드린다.

print source.count('Soup')

Soup라는 단어를 찾아 갯수를 센다.

position =  source.find('alien video games')

alien video games라는 단어의 위치를 찾는다.

print source[position:position + 20]

alien video games라는 단어의 위치부터 20칸 멀어져있는 단어까지 출력

soup = bs4.BeautifulSoup(source)
 
print (soup)
print (soup.prettify())

위 두가지 출력의 결과는 조금 다르다. prettify 가 좀 더 깔끔하게 나온다.

soup.findAll('a')

위 명령어는 a가 포함된 HTML tag를 모두 출력해준다.


1.
link_list = [l.get('href') for l in soup.findAll('a')]
[l for l in link_list if l is not None and l.startswith('http')]

2.
external_links = []
for l in link_list:
    if l is not None and l[:4] == 'http':
        external_links.append(l)

위 두개의 결과는 같다. 1번이 훨씬 간결해보인다. 


4. Python Dictionaries

a = {'a': 1, 'b':2}
print a.keys()
print a.values()

위의 것들은 다 안다.
이제 반복문을 통해 딕셔너리의 내부를 보기 위해 2가지 옵션이 있다.

1.
for k,v in zip(a.keys(), a.values()):
    print k,v

2.
for k,v in a.iteritems():
    print k,v

두 옵션의 결과는 
a    1
b    2
로 같은 결과를 출력한다.

댓글

이 블로그의 인기 게시물

윈도우 설치에서 파티션 설정 오류(NTFS)

[exploit writing] 1_스택 기반 오버플로우 (1) First

하둡 설치 오류 정리