twosb world

What a wonderful Programming?


  • 홈

  • About

  • 태그

  • 카테고리

  • 아카이브

  • 검색

위메프 카테고리 상품 크롤링 by Selenium

작성일 2018-07-16 | In PYTHON |

위메프 카테고리 상품 크롤링 by Selenium

대상 카테고리는 패션,뷰티 / 식품,생활,유아동 / 가전,디지털 총 3가지 카테고리이며 아래 url 주소에 각각

  • 패션,뷰티 : http://www.wemakeprice.com/main/100010
  • 식품,생활,유아동 : http://www.wemakeprice.com/main/100010
  • 가전,디지털 : http://www.wemakeprice.com/main/100030

을 넣으면 된다. 또한, 마지막의 df.to_excel('df.xlsx', sheet_name='sheet1') 부분의 df.xlsx 은 카테고리별로 다르게 지정해주도록 하자. 실행은 jupyter notebook 으로 하고, Selenium 은 미리 설정이 되어 있어야하니 이전글을 참고하고 시작하자.

정확히 내가 크롤링 하고 싶은 정보인 DataFrame df_1은

카테고리 상품 상위 501개 중 오늘오픈 한 상품이자 히든프라이스 상품이 아닌 데이터의 게시 순서와 상품 이름과 판매 가격과 원 가격, ~ & 外 표현이 있는지 여부와 상품 이름 길이이다.

기준 시간은 2018년 7월 15일 오후 11시 50분 경이다.
혹시 len(items)가 501개 이하로 나온다면 time.sleep(3)에 숫자를 조금 더 크게 바꿔주자.
급하니 일단 코드만…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import requests
from bs4 import BeautifulSoup
from selenium import webdriver
import pandas as pd
import operator
import numpy as np
import re

url = "http://www.wemakeprice.com/main/100010"
driver = webdriver.Chrome()
driver.get(url)
time.sleep(3)

last_height = driver.execute_script("return document.body.scrollHeight")

for _ in range(15):
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(3)
new_height = driver.execute_script("return document.body.scrollHeight")
last_height = new_height

items = driver.find_elements_by_css_selector(".group_list > .section_list > ul > li")
len(items)

dict_list = []
for item in items:
dict_list.append({
"상품 이름": item.find_element_by_css_selector('.tit_desc').text,
"원 가격": item.find_element_by_css_selector('.prime').text\
.split(" ")[0].replace(",","")[:-1],
"판매 가격": item.find_element_by_css_selector('.sale').text\
.split(" ")[0].replace(",","")[:-1],
"판매량": item.find_element_by_css_selector('.point').text,
"오늘 오픈 여부": item.find_element_by_css_selector('.box_sticker').text,
"~, 外 여부": item.find_element_by_css_selector('.etc').text,
})

df = pd.DataFrame(dict_list, columns=["상품 이름","원 가격","판매 가격","판매량","오늘 오픈 여부", "~, 外 여부"])

df['판매 가격'].replace(regex=True,inplace=True,to_replace='원',value='')
df['원 가격'].replace(regex=True,inplace=True,to_replace='',value=np.NaN)
df['오늘 오픈 여부'].replace(regex=True,inplace=True,to_replace='',value=np.NaN)
df['~, 外 여부'].replace(regex=True,inplace=True,to_replace='',value=np.NaN)

df["상품 이름 길이"] = ''

len_list = []
for i in df["상품 이름"]:
len_list.append(len(i))
df["상품 이름 길이"] = len_list

df.index = df.index + 1

df["게시 순서"] = df.index

df = df[['게시 순서', '판매량', '상품 이름', '판매 가격', '원 가격', '~, 外 여부', '상품 이름 길이', '오늘 오픈 여부']]

df.rename(columns=lambda x : x.replace('원 가격', '원 가격 포함 여부'), inplace=True)

won_list = []
df["원 가격 포함 여부"].fillna(0, inplace=True)
df["~, 外 여부"].fillna(0, inplace=True)
for i in df["원 가격 포함 여부"]:
if i != 0:
won_list.append(1)
else:
won_list.append(0)
df["원 가격 포함 여부"] = won_list

won_list = []
for i in df["~, 外 여부"]:
if i != 0:
won_list.append(1)
else:
won_list.append(0)
df["~, 外 여부"] = won_list

df

df_1 = df.copy()

df_1 = df_1[df_1["오늘 오픈 여부"] == "오늘오픈"]
df_1 = df_1[df_1["판매 가격"] != "0"]
df_1 = df_1.reset_index(drop=True)

df_1

df_1.to_excel('파일이름 원하는대로.xlsx', sheet_name='sheet1')

driver.quit()

한 칸 Enter된 것 마다 다른 셀에 집어넣어서 실행시키면 된다.
패션,뷰티 카테고리 코드 실행 결과는 아래와 같다.

6

생각보다 코드를 빠르게 짜서 나도 놀랐다. 하지만 pandas 명령어가 막히는 비율이 너무 많다. 조금씩 줄여나가자.

자, 이제 위 데이터를 바탕으로 선형 회귀 분석을 하러 가볼까나!

SQL문 기본 문제 - 예제로 개념 다지기(정답 포함)

작성일 2018-07-14 | In Web&Server |

* SQL문 기본 문제 - 예제로 개념 다지기(정답 포함)

문제에 쓰이는 SQL 파일은 여기서 받아서 사용하자. World라는 이름을 가지고 있는 Database Set이다.

아직 쓰는 SQL 프로그램이 없다면 맥에서는 SequelPro를, Windows에서는 HeidiSQL을 써보자. 물론, WorkBench도 있지만, 문법을 익히는 용도로는 다소 무겁기 때문이다.

난이도 : ★(Very Easy)

사실 실무에서 쓰이는 SQL문은 몇 개 없다지만, 세상엔 언제나 만약에라는 것이 있다. 만약에 금융 관련 직군으로 면접을 보러 간다면? 아래와 같은 기본적인 SQL문을 달달 외우고 있어야 할지도 모른다. 그러기에 기본기를 닦기 좋은 SQL문제와 정답을 업로딩한다. 문법을 뒤적거리면서 푸는데 걸린 시간은 1시간 30분 정도이다.


* Quiz 1

  1. country 테이블에서 중복을 제거한 Continent를 조회하세요.

1

  1. 한국 도시중에 인구가 100만이 넘는 도시를 조회하여 인구순으로 내림차순하세요.

2

  1. city 테이블에서 population이 800만 ~ 1000만 사이인 도시 데이터를 인구수순으로 내림차순하세요.

3

  1. country 테이블에서 1940 ~ 1950년도 사이에 독립한 국가들을 조회하고 독립한 년도 순으로 오름차순하세요.

4

  1. contrylanguage 테이블에서 스페인어, 한국어, 영어를 95% 이상 사용하는 국가 코드를 Percentage로 내림차순하여 아래와 같이 조회하세요.

5

  1. country 테이블에서 Code가 A로 시작하고 GovernmentForm에 Republic이 포함되는 데이터를 아래와 같이 조회하세요.

6


다 풀었는가…?
그렇다면!


* Quiz 2 - group by & having

  1. country 테이블에서 몇개의 대륙이 있는지 조회하세요.

8

  1. country 테이블에서 Continent(대륙)별 몇개의 나라가 있는지 조회하세요.

9

  1. city 테이블에서 국가코드(CountryCode) 별로 총인구가 몇명인지 조회하고 총인구 순으로 내림차순하세요.

10

  1. countrylanguage 테이블에서 언어별 사용하는 국가수를 조회하고 많이 사용하는 언어를 5위에서 10위까지 조회하세요.

11

  1. countrylanguage 테이블에서 언어별 15개 국가 이상에서 사용되는 언어를 조회하고 언어별 국가수에 따라 내림차순하세요.

12

  1. country 테이블에서 대륙별 전체 표면적크기를 구하고 표면적 크기 순으로 내림차순하세요.

13


정말 고생했다!
정답은 아래와 같다.

* SQL문 기본 문제 정답

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
-- quiz 1

USE world;
SELECT *

-- 1. country 테이블에서 중복을 제거한 Continent를 조회하세요.
SELECT DISTINCT(Continent)
FROM country

-- 2. 한국 도시중에 인구가 100만이 넘는 도시를 조회하여 인구순으로 내림차순하세요.
SELECT name, population
FROM city
WHERE countrycode = "KOR" AND population >= 1000000
ORDER BY population DESC

-- 3. city 테이블에서 population이 800만 ~ 1000만 사이인 도시 데이터를 인구수순으로 내림차순하세요.
SELECT name, population
FROM city
WHERE population <= 10000000 AND population >= 8000000
ORDER BY population DESC

-- 4. country 테이블에서 1940 ~ 1950년도 사이에 독립한 국가들을 조회하고 독립한 년도 순으로 오름차순하세요.
SELECT code, CONCAT(name, "(", indepyear, ")") AS "Nameindep", continent, population
FROM country
WHERE indepyear >= 1940 AND indepyear <= 1950
ORDER BY indepyear

-- 5. contrylanguage 테이블에서 스페인어, 한국어, 영어를 95% 이상 사용하는 국가 코드를 Percentage로 내림차순하여 아래와 같이 조회하세요.
SELECT countrycode, language, percentage
FROM countrylanguage
WHERE (language = "english" OR language = "spanish" OR language = "korean") AND percentage >= 95
ORDER BY percentage DESC

-- 6. country 테이블에서 Code가 A로 시작하고 GovernmentForm에 Republic이 포함되는 데이터를 아래와 같이 조회하세요.
SELECT code, name, continent, governmentform, population
FROM country
WHERE governmentform LIKE "%Republic%" AND code LIKE "A%"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
-- quiz 2 - group by & having

USE world;
SELECT *

-- 1. country 테이블에서 몇개의 대륙이 있는지 조회하세요.
SELECT COUNT(DISTINCT(continent)) AS "count"
FROM country

-- 2. country 테이블에서 Continent(대륙)별 몇개의 나라가 있는지 조회하세요.
SELECT continent, COUNT(continent) AS "count"
FROM country
GROUP BY continent
ORDER BY COUNT DESC

-- 3. city 테이블에서 국가코드(CountryCode) 별로 총인구가 몇명인지 조회하고 총인구 순으로 내림차순하세요.
SELECT countrycode, SUM(population) as "Population"
FROM city
GROUP BY countrycode
ORDER BY population DESC

-- 4. countrylanguage 테이블에서 언어별 사용하는 국가수를 조회하고 많이 사용하는 언어를 5위에서 10위까지 조회하세요.
SELECT language, COUNT(countrycode) as "count"
FROM countrylanguage
GROUP BY language
ORDER BY count DESC
LIMIT 4, 6

-- 5. countrylanguage 테이블에서 언어별 15개 국가 이상에서 사용되는 언어를 조회하고 언어별 국가수에 따라 내림차순하세요.
SELECT language, COUNT(countrycode) as "count"
FROM countrylanguage
GROUP BY language
HAVING count >= 15
ORDER BY count DESC

-- 6. country 테이블에서 대륙별 전체 표면적크기를 구하고 표면적 크기 순으로 내림차순하세요.
SELECT continent, SUM(surfacearea) AS "SurfaceArea"
FROM country
GROUP BY continent
ORDER BY surfacearea DESC

SQL문은 타 문법보다 쉽지만, 명령어를 모두 대문자로 쳐줘야한다는 나름의 룰이 있다.(마치 C 문법의 {} 표현이나 HTML 문법의 <> 과 비슷한데, 똑같이 동작은 한다. 알아보기가 힘들 뿐) 그래서 손가락과 손목에 자꾸 힘이 들어가 터널증후군에 걸리기 쉽지 않을까? 라는 생각을 했다.. -_-

백준 6359번 - 만취한 상범 파이썬(Python) 풀이

작성일 2018-07-10 | Edited on 2018-07-11 | In Algorithm |

* 백준 6359번 - 만취한 상범 파이썬(Python) 풀이

문제 출처 : 백준 알고리즘 6359번 문제
난이도 별점 : ★★ (Easy)

* 문제

서강대학교 곤자가 기숙사의 지하에는 n개의 방이 일렬로 늘어선 감옥이 있다. 각 방에는 벌점을 많이 받은 학생들이 구금되어 있다.
그러던 어느 날, 감옥 간수인 상범이는 지루한 나머지 정신나간 게임을 하기로 결정했다. 게임의 첫 번째 라운드에서 상범이는 위스키를 한 잔 들이키고, 달려가며 감옥을 한 개씩 모두 연다. 그 다음 라운드에서는 2, 4, 6, … 번 방을 다시 잠그고, 세 번째 라운드에서는 3, 6, 9, … 번 방이 열려있으면 잠그고, 잠겨있다면 연다. 같은 방식으로 n번의 라운드를 진행한 이후, 상범이는 위스키의 마지막 병을 마시고 쓰러져 잠든다.
구금되어있는 몇 명(어쩌면 0명)의 학생들은 자신의 방을 잠그지 않은 채 상범이가 쓰러져버렸단 것을 깨닫고 즉시 도망친다.
방의 개수가 주어졌을 때, 몇 명의 학생들이 도주할 수 있는지 알아보자.

* 입력

입력의 첫 번째 줄에는 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄에 한 개씩 방의 개수 n(5≤n≤100)이 주어진다.

* 출력

한 줄에 한 개씩 각 테스트 케이스의 답, 즉 몇 명이 탈출할 수 있는지를 출력한다.

  • 예제 입력 1
1
2
3
2
5
100
  • 예제 출력 1
1
2
2
1

* 내가 짠 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
nlist = []
s = int(input())
for ss in range(s):
ss = int(input())
nlist.append(ss)

def Sangbeom(nlist):
for n in nlist:
list = [j for j in range(1, int(n)+1)]
for i in range(2, int(n)+1):
for j in range(1, int(n)+1):
if i*j > int(n):
break
elif i*j in list:
list.remove(i*j)
else:
list.append(i*j)
print(len(list))

Sangbeom(nlist)

* 풀이

문제를 고른 이유는 단순히 문제 제목에 내 이름이 들어가기 때문이다. 스터디원들과 협의해서 쉬운 난이도 문제로 낙점했다. 푸는데 걸린 시간은 입력 양식 맞추는데까지 약 1시간 반 정도.

image

갤럭시 탭 사서 이런데 쓰고 있다니.. 슬프당..

n=5라고 설정한다면, 술 한잔 걸친 상범은 5번에 걸쳐 모든 감옥의 방을 쭉 돈다.

1st : 감옥을 돌면서 모든 방을 연다.

  • 1부터 1씩 증가하면서 닫힌 감옥을 모두 연 것.

2nd : 2의 배수 방을 돈다.

  • 2, 4번이 열려 있으니깐 닫아준다.

3rd : 3의 배수 방을 돈다.

  • 3번이 열려 있으니깐 닫아준다.

4th : 4의 배수 방을 돈다.

  • 4번 방은 이미 닫혀있으니 다시 열어준다.

5th : 5의 배수 방을 돈다.

  • 5번이 열려 있으니깐 닫아준다.

6번째 : 방이 없음. 종료.

n번째까지 차있는 리스트(ex: n=5라면 [1, 2, 3, 4, 5])를 만들어 i번째에 문이 닫히면 remove로 지워주고, 문이 열리면 append로 다시 넣어준다.
마지막 for문이 돌아갔을 때, 열려있는 방들은 리스트 안에 들어가 있다. len 명령어로 숫자를 뽑아주면 된다.

딱 처음 생각만큼 쉬운 문제였다. 나 같은 초보자들에게 추천할만한 난이도의 문제!

1분이면 OK! AWS EC2 Key Pair 없이 대신 Password로 접속하기

작성일 2018-07-02 | In AWS |

AWS EC2 Key Pair 없이 대신 비밀번호로 접속하기

원래 AWS EC2 인스턴스를 만들고 터미널에서 접속하려면 기본 명령어는 ssh -i [KeyPairName].pem ubuntu@[인스턴스 IPv4 IP 주소] 이다.
하지만, 다양한 PC나 심지어 모바일에서 접속할 때 Key Pair를 가지고 있지 않다면 루트 사용자로 로그인조차 할 수 없다는 단점이 있다.
이를 해결하기 위해 Key Pair 없이 Password만으로 인스턴스 SSH에 접속할 수 있는 방법을 쉽게 써보려고 한다.

인스턴스 AMI는 EC2 Ubuntu 16.04.3 LTS 기준이다. 또한, 사용자 이름은 Default Setting인 ubuntu로 설명하겠다.

1

  1. 윈도우 기준으로 윈도우 키 + cmd 입력 + 명령 프롬프트 오른쪽 버튼 - 관리자 권한으로 실행로 터미널 실행 고고

2

  1. 우선 Key Pair 파일이 있는 폴더로 가서 Key Pair로 로그인

3

  1. sudo passwd ubuntu 입력(ubuntu가 아닌 다른 사용자 계정이라면 그 이름 입력) 후 Password 입력(입력이 되지 않는것처럼 나오겠지만 일부러 안보이게 처리된다.)

4

  1. sudo vi /etc/ssh/sshd_config 입력

5

  1. /PasswordAuth 입력

6
7
8

  1. i 눌러서 INSERT MODE로 바꾸고 PasswordAuthentication no에서 no를 yes로 바꿈

9

  1. 다시 i 누른 후 :wq 입력하고 나옴

  2. 나중에 Key Pair로 로그인 할 때를 위해 Key Pair를 복사하자.

    1
    2
    sudo mkdir /root/.ssh
    sudo cp /home/ubuntu/.ssh/authorized_keys /root/.ssh
  3. SSH를 다시 시작해주자.

    1
    sudo service ssh restart
  4. exit 입력해서 로그아웃을 해주고

10

11. ssh ubuntu@[인스턴스 IPv4 IP주소] 로 로그인을 해본다.

  1. 아까 설정한 Password를 입력해주면..

11

  1. 접속 완료!

이전과 비교해서 엄청나게 간단해졌당.

  • AWS KEY 없이도 어떤 Device에서도 접속 가능하다.
  • SSH 명령어가 매우 간소화되었다.

반대급부로 Password 뚫리면 그말싫.. 위험해진다..
비밀번호는 반드시 어려운걸로!
이제 행ㅋ복ㅋ EC2 인스턴스를 사용해보자.

R-Squared(결정계수)& F 검정 통계량(F-Statistic)은 어떤 관계?

작성일 2018-07-02 | In MATH |

R-Squared(결정계수) & F 검정 통계량(F-Statistic)은 어떤 관계?

여기에 관련 내용이 있긴 하다. 하지만 그냥 그래프만 보는게 이해가 더 쉬울 것 같아 가져와봤다!

그림 출처 : The Minitab Blog

flp_highvar

[R^2 값은 작고 ▼, F-Statistic 값은 크다 ▲]

해석은 다음과 같다.

  • 독립변수 X(Input)가 종속변수 Y(Output1)에 끼치는 영향은 의미가 없다.
  • 데이터들을 그래프에 뿌려 추정한 회귀식 신뢰도 또한 낮다. 각 데이터들의 분산이 너무 커 제대로 된 예측을 할 수 없기 때문이다.

flp_lowvar

[R^2 값은 크고 ▲, F-Statistic 값은 작다 ▼]

해석은 정확히 반대로 해주면 되겠다. 독립변수 X가 종속변수 Y에 미치는 영향도 크고, 추정 회귀식 신뢰도도 높다.

결론 :

R^2와 F-Statistic은 두 값 모두 추정한 모형이 적절한지 알려주지만,

R^2는 데이터들이 저 빨간 회귀 직선에서 각 각 얼마나 떨어져 있는지 분산을 더한 값들을 토대로 어떠한 계산을 한 결과가

  • 값이 크면 ☞ 예측 정확함
  • 값이 작으면 ☞ 예측 부정확함

F-Statistic은 데이터를 모아보니 선형이 잘 되는가? 를 따져보아

  • 값이 크면 ☞ 선형이 잘 안그려짐
  • 값이 작으면 ☞ 선형이 잘 그려짐

R^2는 0과 1사이의 값이고, F-Statistic은 0부터 양의 무한대 값이다.

123

twosb

I'm cutty sexy pretty elegant guy...

15 포스트
13 카테고리
62 태그
© 2018 twosb