https://hoonstudio.tistory.com/303?category=882469 

 

[파이썬] 인스타그램 좋아요 봇 따라해보기

아래 출처에서 인스타그램 좋아요 봇 파이썬 코딩을 보고 따라해보았다 주의해야할 점은  - 인스타그램 2차 비밀번호 인증 해제  - 페이스북으로 로그인 하였다면, 인스타그램 비밀번호도 설정

hoonstudio.tistory.com

기존에 인스타 좋아요 봇을 어느정도 만들었는데, 노트북을 SSD로 교체하면서 기존 파일 백업이 제대로 안되었나보다.

그래서 HDD를 다시 꽂아서 복사하기 보다는 기존 내 포스팅을 참고해서 다시 코딩을 해보려고 한다.

어차피 파이썬도 안쓰는 동안 많이 잊어서 공부하는 겸사겸사 하려고 한다. (속으로는 백업의 중요성을 다시 깨달았다)

 

pycharm에서 pip도 실행할 수 있도록 pip를 설치하였다.

 

노란색 코멘트는 pip 21.3.1 버전 사용가능하다는 레코멘드.

chromedriver는 직접 더블클릭으로 설치가 아닌 selenium에서 바라보는 경로를 지정해주어야 한다.

그렇지 않으면 아래와 같이 에러가 나온다.

D:\05.Lab\02.python\20211214_insta_like_bot\main.py:24: DeprecationWarning: executable_path has been deprecated, please pass in a Service object
  driver = webdriver.Chrome(driver_path, options=options)
Traceback (most recent call last):
  File "D:\05.Lab\02.python\20211214_insta_like_bot\venv\lib\site-packages\selenium\webdriver\common\service.py", line 71, in start
    self.process = subprocess.Popen(cmd, env=self.env,
  File "C:\Users\move_\AppData\Local\Programs\Python\Python39\lib\subprocess.py", line 947, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "C:\Users\move_\AppData\Local\Programs\Python\Python39\lib\subprocess.py", line 1416, in _execute_child
    hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
FileNotFoundError: [WinError 2] 지정된 파일을 찾을 수 없습니다

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "D:\05.Lab\02.python\20211214_insta_like_bot\main.py", line 81, in <module>
    bot()
  File "D:\05.Lab\02.python\20211214_insta_like_bot\main.py", line 24, in bot
    driver = webdriver.Chrome(driver_path, options=options)
  File "D:\05.Lab\02.python\20211214_insta_like_bot\venv\lib\site-packages\selenium\webdriver\chrome\webdriver.py", line 70, in __init__
    super(WebDriver, self).__init__(DesiredCapabilities.CHROME['browserName'], "goog",
  File "D:\05.Lab\02.python\20211214_insta_like_bot\venv\lib\site-packages\selenium\webdriver\chromium\webdriver.py", line 90, in __init__
    self.service.start()
  File "D:\05.Lab\02.python\20211214_insta_like_bot\venv\lib\site-packages\selenium\webdriver\common\service.py", line 81, in start
    raise WebDriverException(
selenium.common.exceptions.WebDriverException: Message: 'chromedriver.exe' executable needs to be in PATH. Please see https://chromedriver.chromium.org/home


Process finished with exit code 1

나의 경우에는 main.py 파일이 있는 동일 경로에 chromedriver 파일을 복사해두었다.

그랬더니 예전에는 보지 못하였던 새로운 에러가 떨어졌다.

D:\05.Lab\02.python\20211214_insta_like_bot\main.py:24: DeprecationWarning: executable_path has been deprecated, please pass in a Service object
  driver = webdriver.Chrome(driver_path, options=options)
로그인중....
D:\05.Lab\02.python\20211214_insta_like_bot\main.py:35: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead
  id_input = driver.find_element_by_xpath('//*[@id="loginForm"]/div/div[1]/div/label')
D:\05.Lab\02.python\20211214_insta_like_bot\main.py:40: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead
  pw_input = driver.find_element_by_xpath('//*[@id="loginForm"]/div/div[2]/div/label')
D:\05.Lab\02.python\20211214_insta_like_bot\main.py:45: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead
  login_btn = driver.find_element_by_xpath('//*[@id="loginForm"]/div/div[3]/button')
D:\05.Lab\02.python\20211214_insta_like_bot\main.py:56: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead
  first_feed = driver.find_element_by_xpath('//*[@id="react-root"]/section/main/article/div[1]/div/div/div[1]/div[1]/a/div/div[2]')
Traceback (most recent call last):
  File "D:\05.Lab\02.python\20211214_insta_like_bot\main.py", line 81, in <module>
    bot()
  File "D:\05.Lab\02.python\20211214_insta_like_bot\main.py", line 56, in bot
    first_feed = driver.find_element_by_xpath('//*[@id="react-root"]/section/main/article/div[1]/div/div/div[1]/div[1]/a/div/div[2]')
  File "D:\05.Lab\02.python\20211214_insta_like_bot\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 520, in find_element_by_xpath
    return self.find_element(by=By.XPATH, value=xpath)
  File "D:\05.Lab\02.python\20211214_insta_like_bot\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 1244, in find_element
    return self.execute(Command.FIND_ELEMENT, {
  File "D:\05.Lab\02.python\20211214_insta_like_bot\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 422, in execute
    response = self.command_executor.execute(driver_command, params)
  File "D:\05.Lab\02.python\20211214_insta_like_bot\venv\lib\site-packages\selenium\webdriver\remote\remote_connection.py", line 421, in execute
    return self._request(command_info[0], url, body=data)
  File "D:\05.Lab\02.python\20211214_insta_like_bot\venv\lib\site-packages\selenium\webdriver\remote\remote_connection.py", line 443, in _request
    resp = self._conn.request(method, url, body=body, headers=headers)
  File "D:\05.Lab\02.python\20211214_insta_like_bot\venv\lib\site-packages\urllib3\request.py", line 78, in request
    return self.request_encode_body(
  File "D:\05.Lab\02.python\20211214_insta_like_bot\venv\lib\site-packages\urllib3\request.py", line 170, in request_encode_body
    return self.urlopen(method, url, **extra_kw)
  File "D:\05.Lab\02.python\20211214_insta_like_bot\venv\lib\site-packages\urllib3\poolmanager.py", line 375, in urlopen
    response = conn.urlopen(method, u.request_uri, **kw)
  File "D:\05.Lab\02.python\20211214_insta_like_bot\venv\lib\site-packages\urllib3\connectionpool.py", line 699, in urlopen
    httplib_response = self._make_request(
  File "D:\05.Lab\02.python\20211214_insta_like_bot\venv\lib\site-packages\urllib3\connectionpool.py", line 445, in _make_request
    six.raise_from(e, None)
  File "<string>", line 3, in raise_from
  File "D:\05.Lab\02.python\20211214_insta_like_bot\venv\lib\site-packages\urllib3\connectionpool.py", line 440, in _make_request
    httplib_response = conn.getresponse()
  File "C:\Users\move_\AppData\Local\Programs\Python\Python39\lib\http\client.py", line 1347, in getresponse
    response.begin()
  File "C:\Users\move_\AppData\Local\Programs\Python\Python39\lib\http\client.py", line 307, in begin
    version, status, reason = self._read_status()
  File "C:\Users\move_\AppData\Local\Programs\Python\Python39\lib\http\client.py", line 268, in _read_status
    line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
  File "C:\Users\move_\AppData\Local\Programs\Python\Python39\lib\socket.py", line 704, in readinto
    return self._sock.recv_into(b)
KeyboardInterrupt

Process finished with exit code -1073741510 (0xC000013A: interrupted by Ctrl+C)

 

https://velog.io/@sangyeon217/deprecation-warning-executablepath-has-been-deprecated

 

DeprecationWarning: executable_path has been deprecated 해결하기

DeprecationWarning: executable_path has been deprecated 해결 방법에 대한 포스팅 입니다.

velog.io

 

아래처럼 취소선이 왜 생겼는지 보니 selenium 버전이 4버전이 되면서 라이브러리가 변경되서 warning도 뜨고 한다고 함. 그래서 기존대로 3버전으로 낮추는 작업을 진행함.

 

PS D:\05.Lab\02.python\20211214_insta_like_bot> pip uninstall selenium
Found existing installation: selenium 4.1.0
Uninstalling selenium-4.1.0:
  Would remove:
    d:\05.lab\02.python\20211214_insta_like_bot\venv\lib\site-packages\selenium-4.1.0.dist-info\*
    d:\05.lab\02.python\20211214_insta_like_bot\venv\lib\site-packages\selenium\*

pip를 3버젼대로 설치하고나니 취소선이 다시 없어짐

PS D:\05.Lab\02.python\20211214_insta_like_bot> pip3 install selenium=3.141
ERROR: Invalid requirement: 'selenium=3.141'
Hint: = is not a valid operator. Did you mean == ?
WARNING: You are using pip version 21.1.2; however, version 21.3.1 is available.
Collecting selenium==3.141
  Downloading selenium-3.141.0-py2.py3-none-any.whl (904 kB)
     |████████████████████████████████| 904 kB 6.4 MB/s
Requirement already satisfied: urllib3 in d:\05.lab\02.python\20211214_insta_like_bot\venv\lib\site-packages (from 
selenium==3.141) (1.26.7)
Installing collected packages: selenium
Successfully installed selenium-3.141.0
WARNING: You are using pip version 21.1.2; however, version 21.3.1 is available.
You should consider upgrading via the 'D:\05.Lab\02.python\20211214_insta_like_bot\venv\Scripts\python.exe -m pip i
nstall --upgrade pip' command.

너무 길어져서 다음 포스팅으로 이어서 진행하겠다.

Posted by 유영훈
,

fsatify : 웹 프레임워크

https://www.fastify.io/docs/latest/Getting-Started/

 

Getting-Started

Fast and low overhead web framework, for Node.js

www.fastify.io

강의안과 다르게 cmd창에 npm을 치면 명령어가 없다고 나온다.

node.js를 설치해주면 cmd에 npm 치면 옵션들이 쭉 나온다. 설치완료된 것이다.

* npm은 node package manager의 뜻으로 노드 패키지 관리자 역할을 한다.

 

https://nodejs.org/ko/download/

 

다운로드 | Node.js

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.

nodejs.org

 

fastify 라이브러리 패키지 설치

npm i fastify --save

브라우져에 접속하면 app.js 파일로 만들어놓은 페이지가 잘 출력된다.

이를 도커 이미지로 빌드하는데 시간이 꽤 걸렸다. 796.8s 이니깐 대략 13분 좀 넘게 소요되었네

빌드한 이미지를 실행하려고 했는데, 오류가 나서 살펴보민

Error에 module이 없다는 것인데, VSCode로 보니 오타가 있었다. 뒤에 QQ를 빼고 다시 실행해주니 잘 실행되고, 웹접속도 성공하였다.

D:\05.Lab\01.test\web>docker run -p 3000:3000 web
internal/modules/cjs/loader.js:638
    throw err;
    ^

Error: Cannot find module '/usr/src/app/app.jsQQ'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:636:15)
    at Function.Module._load (internal/modules/cjs/loader.js:562:25)
    at Function.Module.runMain (internal/modules/cjs/loader.js:831:12)
    at startup (internal/bootstrap/node.js:283:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:623:3)

D:\05.Lab\01.test\web>docker images

D:\05.Lab\01.test\web>
D:\05.Lab\01.test\web>
D:\05.Lab\01.test\web>
D:\05.Lab\01.test\web>docker run -p 3000:3000 web
{"level":30,"time":1638947532214,"pid":8,"hostname":"1a97ede7f0a9","msg":"Server listening at http://0.0.0.0:3000"}
{"level":30,"time":1638947532215,"pid":8,"hostname":"1a97ede7f0a9","msg":"server listening on http://0.0.0.0:3000"}
{"level":30,"time":1638947532503,"pid":8,"hostname":"1a97ede7f0a9","reqId":"req-1","req":{"method":"GET","url":"/","hostname":"127.0.0.1:3000","remoteAddress":"172.17.0.1","remotePort":52382},"msg":"incoming request"}
{"level":30,"time":1638947532535,"pid":8,"hostname":"1a97ede7f0a9","reqId":"req-1","res":{"statusCode":200},"responseTime":20.34059999883175,"msg":"request completed"}

기존 테스트 중지를 안하니 오류가 발생

C:\Users\move_>docker run -p 3001:3000 web
docker: Error response from daemon: driver failed programming external connectivity on endpoint hungry_satoshi (3220b1383366fafc9092bc9f3d1743ca9d080e512f7b739826f4b760d22405c8): Bind for 0.0.0.0:3001 failed: port is already allocated.

그런데 기존 테스트때문이 아니었음

껐음에도 동일한 오류가 발생해서 혹시 내가 할당하는 포트의 충돌인가 싶어서 3002번으로 변경하였더니

웹도 잘 출력되고 cmd창에 로그도 잘 찍혔다.

C:\Users\move_>docker run -p 3001:3000 web
docker: Error response from daemon: driver failed programming external connectivity on endpoint beautiful_tereshkova (b6841b2541526d8a4f92368b738311a6d6420946329b1e45892756d068f414f9): Bind for 0.0.0.0:3001 failed: port is already allocated.

C:\Users\move_>docker run -p 3002:3000 web
{"level":30,"time":1638948253156,"pid":8,"hostname":"cfbf8a5cf3c6","msg":"Server listening at http://0.0.0.0:3000"}
{"level":30,"time":1638948253158,"pid":8,"hostname":"cfbf8a5cf3c6","msg":"server listening on http://0.0.0.0:3000"}
{"level":30,"time":1638948263812,"pid":8,"hostname":"cfbf8a5cf3c6","reqId":"req-1","req":{"method":"GET","url":"/","hostname":"127.0.0.1:3002","remoteAddress":"172.17.0.1","remotePort":49984},"msg":"incoming request"}
{"level":30,"time":1638948263832,"pid":8,"hostname":"cfbf8a5cf3c6","reqId":"req-1","res":{"statusCode":200},"responseTime":18.8648000061512,"msg":"request completed"}
{"level":30,"time":1638948264280,"pid":8,"hostname":"cfbf8a5cf3c6","reqId":"req-2","req":{"method":"GET","url":"/favicon.ico","hostname":"127.0.0.1:3002","remoteAddress":"172.17.0.1","remotePort":49984},"msg":"incoming request"}
{"level":30,"time":1638948264281,"pid":8,"hostname":"cfbf8a5cf3c6","reqId":"req-2","msg":"Route GET:/favicon.ico not found"}
{"level":30,"time":1638948264283,"pid":8,"hostname":"cfbf8a5cf3c6","reqId":"req-2","res":{"statusCode":404},"responseTime":2.851500004529953,"msg":"request completed"}

정리 : 이미지 만들 때, dockerfile을 가지고 만든다

 

Posted by 유영훈
,

docker compose

docker-compose의 version부터 확인하면서 이번 포스팅 시작

 

yml [야믈] 이란 것이 띄어쓰기를 통해 데이터를 표현하는 방식

 

이렇게 docker명령어를 하나씩 쳐볼수도 있지만, 실무에서는 대부분 yml 파일을 만들어서 진행

도커 : 레이어드 파일 시스템 기반

AUFS, BTRFS, Overlayfs ...

이미지 : 프로세스가 실행되는 파일들의 집합(환경)

프로세스는 환경을 변경할 수 있음

이 환경을 저장해서 새로운 이미지 생성

 

docker build -t 이름/이미지이름:태그 .

docker build -t hoon/ubuntu:git1 .

 

TDD : 파란불이 뜰때까지 많은 실패할 것이고, 성공하더라도 리팩토링을 통해 최적화를 해야함

 

dockerfile로 관리를 하면 다른 사람들이 보아도 어떤 히스토리로 서버가 설치되었는지 확인이 가능하다

(기존에는 히스토리 관리가 안되었다)

Posted by 유영훈
,

https://hoonstudio.tistory.com/323?category=948751 

 

[도커] -v 옵션으로 mysql 삭제후 재설치해도 데이터 남기기

[예시 명령어] docker run -d -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true --network=app-network --name mysql -v D:\01.test\mysql:/var/lib/mysql mysql:5.7 이렇게 내 로컬 디렉토리와 컨테이너 디렉토..

hoonstudio.tistory.com

역시 포스팅을 하길 잘했다..

지난번 포스팅에도 회사 시험으로 흐름이 끊겨서 다시한다고 써놓았는데

오늘도 한달만에 그 맥을 또 이어보려고 한다

 

한가지 칭찬할점은 한달에 한번정도 잊혀질만 하면 공부해야되는 것 실행하는 나의모습

보완해야할 점은 너무 일을 많이 벌리지 말자.. 이것저것 챙기느라 몰입을 못하는 듯 싶다

 

docker: error during connect: This error may indicate that the docker 

아무리 명령어 입력해도 동일한 에러가 나왔다

생각해보니 도커를 시작프로그램에서 중지했었는데 (SAA 시험보느라) 그 영향인 것 같아 실행하고 진행하였더니 잘 된다.

 

Posted by 유영훈
,

레드햇 글이 잘 정리되어 있어서 공유한다.

 

1. 데이터 레이크와 데이터 웨어하우스 공통점 : 빅데이터 위한 데이터 스토리지 리포지토리

 

2. 데이터 레이크와 데이터 웨어하우스 차이점

 - 데이터 웨어하우스 : 보고를 위해 설계된 구조화된 데이터 모델 제공

 - 데이터 레이크 : 정의된 목적 없는 비정형 원시 데이터 저장

 

https://www.redhat.com/ko/topics/data-storage/what-is-a-data-lake

 

데이터 레이크(Data Lake)란? 정의, 분석 및 솔루션

데이터 레이크(Data lake)는 대규모의 원시 데이터 세트를 기본 형식으로 저장하는 리포지토리를 뜻하며, 플랫 아키텍처로 확장성을 제공하여 비용 절감이 가능합니다.

www.redhat.com

 

Posted by 유영훈
,

#20211112 #서울나들이

오랜만에 회사 새벽작업으로 본사가서 일하고 점심먹고 퇴근하는중
점심 운동은 못했지만, 간만에 회사가니 재밌었던 것 같고, 사원증 거니 내가 직장인이었지 라는 느낌도 들었다
비록 밤은 세었지만 리플래쉬했다고 생각하고
다시한번 재택하는 기간을 소중하게 잘 보내야겠다


#점심시간 #점심운동 #홈트 #홈트레이닝 #눈바디 #인바디 #유산소운동 #운동인증 #헬스장 #피트니스 #피트니스센터 #운동하는직장인 #헬스타그램 #운동스타그램 #직장인 #회사원 #직장인스타그램 #운동일지 #운동일기 #fitness #health

Posted by 유영훈
,

[예시 명령어]

docker run -d -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true --network=app-network --name mysql -v D:\01.test\mysql:/var/lib/mysql mysql:5.7

 

이렇게 내 로컬 디렉토리와 컨테이너 디렉토리를 연결하면, 컨테이너에 mysql 삭제해도 동일하게 연결하면 로컬의 데이터를 가져와서 보여준다.

Posted by 유영훈
,

도커에 워드프레스 띄우기가 너무 쉬워서 놀랬다.

저장과 동시에 데이터베이스를 조회해보면 실제 입력한 값이 당연하게도 조회가 된다.

온프레미스에서 왜이리 어렵게 워드프레스를 설치했던 것이었지? 란 생각이 들었다.

워드프레스와 mysql을 연결하고, mysql을 삭제했을 때 테스트

그래서 이번에는 내 로컬 디렉토리와 도커에 띄운 컨테이너의 디렉토리를 서로 연결해서 데이터를 저장해보도록 한다.

우선 연결만으로도 이렇게 WSL을 통해서 filesharing이 되었다고 팝업이 뜬다.

실제 내 로컬 디렉토리에도 mysql관련 파일들이 생성되어 있다.

Posted by 유영훈
,

기존 도커 공부를 위해 유튜브에서 재즐보프님 영상으로 진행하려고 하였으나, 이런저런 사유로 진행못하였다.

https://hoonstudio.tistory.com/category/IT%20Studio/Docker%20_kubenetes

 

'IT Studio/Docker _kubenetes' 카테고리의 글 목록

IT와 음악을 기록하고 공유하는 블로그입니다.

hoonstudio.tistory.com

그래서 인프런 강의를 회사지원으로 시작하게 되었다.

그래서 선택한 강의가 '초보를 위한 도커 안내서'이다.

윈도우 환경에서 도커를 설치하고 진행해야하는데, 자세한 설치내용은 생략하고 강의가 넘어가서 갓대희님 블로그를 통해서 진행하였다.

https://goddaehee.tistory.com/251

 

[Docker (1)] window10 Docker 설치하기(윈도우 10 도커 설치)

[Docker (1)] window10 Docker 설치하기(윈도우 10 도커 설치) 안녕하세요. 갓대희 입니다. 이번 포스팅은 [ Window10 도커 설치 ] 입니다. : ) 도커 설치하기 ▶ 1. 도커란? 도커 설치와 관련된 포스팅 이기.

goddaehee.tistory.com

 

중간에 WSL 2 관련 미설치 내용이 나왔는데, 갓대희님께서 말씀주신 것과 같이 업데이트를 진행하니 설치가 완료되었다.

설치 URL은 위 링크를 클릭해도 된다.

https://docs.microsoft.com/ko-kr/windows/wsl/install-manual#step-4---download-the-linux-kernel-update-package

 

이전 버전 WSL의 수동 설치 단계

wsl install 명령을 사용하지 않고 이전 버전의 Windows에 WSL을 수동으로 설치하는 방법에 대한 단계별 지침입니다.

docs.microsoft.com

그렇게 해서 도커까지 설치완료하였다.

사실 회사 노트북에 이미 설치하고 컴포즈 테스트까지는 하였는데, 개인 노트북에 설치하느라 다시 보게 되었고

회사 시험때문에 도커 공부가 끊겨서 처음부터 맥을 이어나가기 위해 진행하는 차원도 있다.

Posted by 유영훈
,

코딩은 하는 것 같은데, 아직 비효율적인 코딩이 나오는 것 같다.

숫자가 커질수록 연산과정이 많아져서 '이거 루프 도는 건가?'라고 생각할때 즈음 결과값이 나오는 것을 보았다.

그렇다면 어떻게 개선해야하는 것인가?

 - 알고리즘을 생각하고 개선 포인트를 찾자

 - for문이 3번 들어가기 때문에 for문 번수 * for문 번수 * for문 번수 이기 때문에 for문을 1개만 줄여도 '마지막 for문 번수'만큼을 안 곱해도 된다. 

 

[피타고라스 삼조 코딩 - 비효율적]

for a in range(1, 400):
    a2 = a * a
    for b in range(1, 400):
        b2 = b * b
        for c in range(1, 400):
            c2 = c * c
            if a2 + b2 == c2:
                if a + b+ c == 400:
                    #print(a, b, c)
                    print(a*b*c)

 

[피타고라스 삼조 코딩 - 효율적으로 개선]

 - for문을 1개 없애서 결과값 속도가 훨씬 빨라졌다.

 'c = 400 - a - b'와 같이 표현할 수 있다는 것을 배웠다.

for a in range(1, 400):
    for b in range(1, 400):
        c = 400 - a - b
        if a*a + b*b == c*c:
            if a + b + c == 400 and a < b < c:
                print(a, b, c)
                print(a*b*c)

** 이 문제는 a + b + c 가 400이면서 피타고라스 삼조를 만족시키는 샘플 문제에 대한 코딩이다.

 

Posted by 유영훈
,