12.1 7:39 pm
오늘은 크롤링쪽 python 함수들을 조져봐야겠다
일단 들어가기 쉽게 도메인 레코드를 할당해주려고 했는데 안된다
route53 에서 IPv4 는 무조건 80번 포트로만 접근이 되나 보다
포트포워딩을 해줄까도 생각했는데 이후 jenkins 컨테이너도 8080을 기본으로 사용하기 때문에
지금 있는 apache-server 컨테이너를 80번으로 바꿔주기로 했다
일단 이건 나중에 하고
파이썬 컨테이너에서 mysql 로 데이터를 insert 하는 부분을 해보자
이번 작업 하고, 크롤링 할때 인스타는 한시간에 1000장? 정도로 제한해놨다고 한다
이 그렇다고 한다
일단 개발환경에서 mysql 접속+insert 동작을 확인해보자
# __main__.py 일부
for mem in blackpink :
new_filenames=list()
new_rows=list()
dir_path=default_path+"/"+mem
new_filenames=pts.get_filename_ls(dir_path)
for i in new_filenames :
c1,c2,c3,c4,c5,c6,c7 = pts.imagefile_upload_to_s3(default_path+"/"+mem+"/"+i, i)
image_row=[c1,c2,c3,c4,c5,c6,c7]
new_rows.append(image_row)
ctl.delete_file(default_path+"/"+mem+"/"+i)
pts.insert_data_to_mysql(new_rows)
# _push_to_s3_n_oracle.py 일부
def imagefile_upload_to_s3(local_file_path, filename):
s3 = s3_connection()
try:
s3.upload_file(local_file_path, "blackpinkinyourarea.cyaninn.com", "images/"+filename, ExtraArgs={"ServerSideEncryption": "AES256"})
print("upload success : "+filename)
except Exception as e:
print(e)
#이미지파일 메타데이터 반환
if filename.count('_') == 3 :
f_date, f_time, n, f_filenum = filename.split('_')
num, h = f_filenum.split('.')
else :
f_date, f_time, f_name = filename.split('_')
n, h = f_name.split('.')
num=1
y, m, d = f_date.split('-')
url=id.s3_bucket_url+filename
dl=0
y=int(y); m=int(m); d=int(d); num=int(num)
return n, y, m, d, num, url, dl
위 처럼 _push_to_s3_n_mysql.py 의 imagefile_upload_to_s3() 함수의 반환값을
2차원 배열 형태 인자로 넘겨받게 될것이다.
코드는 이렇게 짜봤다
import pymysql
def insert_data_to_mysql(row_list) :
# mysql connection 연결
conn = pymysql.connect(host='localhost:3306',
user='root',
password=비밀번호,
db='blackpink',
charset='utf8')
cur=conn.cursor()
'''
for i in row_list:
d_name= i[0]
d_year= i[1]
d_month= i[2]
d_day= i[3]
d_filenum= i[4]
d_s3url= i[5]
d_download= i[6]
sql = "INSERT INTO user (DB_MEM_NAME, DB_YEAR, DB_MONTH, DB_DAY, DB_FILENUM, DB_S3URL, DB_DOWNLOAD) \
VALUES (%s, %s, %s, %s, %s, %s, %s)"
cur.execute(sql, (d_name, d_year, d_month, d_day, d_filenum, d_s3url, d_download))
'''
try :
for i in row_list:
d_name= i[0]
d_filenum= i[1]
sql = "INSERT INTO test_1 (usr_name, usr_no) \
VALUES (%s, %s)"
cur.execute(sql, (d_name, d_filenum))
print('cur excute success :',d_name,d_filenum)
except :
print('excute fail')
conn.commit()
conn.close()
sample_list=[['karina', 22], ['ningning', 20], ['winter', 21], ['giselle', 22]]
insert_data_to_mysql(sample_list)
위 localhost 로 안되서 그냥 instance ip:port 로 해줬다
pip install PyMySql 로 모듈 설치해주고
ubuntu@blackpinkinyourarea:~/instargram_crawler$ docker cp mysql_insert_test.py python-server:/home/
ubuntu@blackpinkinyourarea:~/instargram_crawler$
ubuntu@blackpinkinyourarea:~/instargram_crawler$ docker exec -it python-server bash
root@9af38f8cc47a:/#
root@9af38f8cc47a:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@9af38f8cc47a:/#
root@9af38f8cc47a:/# cd home
root@9af38f8cc47a:/home#
root@9af38f8cc47a:/home# ls
instargram_crawler mysql_insert_test.py
root@9af38f8cc47a:/home#
root@9af38f8cc47a:/home# python3 mysql_insert_test.py
테스트 실행 해봤는데
root@9af38f8cc47a:/home#
root@9af38f8cc47a:/home# python3 mysql_insert_test.py
Traceback (most recent call last):
File "/usr/local/lib/python3.11/site-packages/pymysql/connections.py", line 613, in connect
sock = socket.create_connection(
^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/socket.py", line 826, in create_connection
for res in getaddrinfo(host, port, 0, SOCK_STREAM):
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/socket.py", line 961, in getaddrinfo
for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
socket.gaierror: [Errno -2] Name or service not known
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/mysql_insert_test.py", line 47, in <module>
insert_data_to_mysql(sample_list)
File "/home/mysql_insert_test.py", line 6, in insert_data_to_mysql
conn = pymysql.connect(host='내 인스턴스 ip:port',
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/pymysql/connections.py", line 353, in __init__
self.connect()
File "/usr/local/lib/python3.11/site-packages/pymysql/connections.py", line 664, in connect
raise exc
pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on '내 인스턴스 ip:port' ([Errno -2] Name or service not known)")
root@9af38f8cc47a:/home#
위 처럼 에러가 났다
찾아보니까
host 는 ip 만 입력하고
포트를 따로 지정해줘야 하나보다
# mysql connection 연결
conn = pymysql.connect(host='내 인스턴스 ip',
port=3306,
user='root',
password='비밀번호',
db='blackpink',
charset='utf8')
위처럼 port 인자를 하나 더 넣어주고
실행해보니
try 부분이 잘 된것을 확인했다
db table 에서도 입력값을 확인했다.
코딩애플 - 인스타크롤링 제한
https://codingapple.com/forums/topic/%EC%9B%B9%ED%81%AC%EB%A1%A4%EB%A7%81-%EC%B0%A8%EB%8B%A8%EB%90%90%EC%96%B4%EC%9A%94-%E3%84%B1/
python에서 mysql 접속
http://bigdata.dongguk.ac.kr/lectures/DB/_book/python%EC%97%90%EC%84%9C-mysql%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%9D%98-%EC%A0%91%EA%B7%BC.html
python 으로 mysql 데이터 입력
https://codechacha.com/ko/python-mysql-insert-update-delete/
python with문
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=wideeyed&logNo=221653260516
python 코드 여러줄 나눠쓰기
https://hashcode.co.kr/questions/281/%EC%BD%94%EB%93%9C-%ED%95%9C-%EC%A4%84%EC%9D%84-%EC%97%AC%EB%9F%AC-%EC%A4%84%EB%A1%9C-%EB%82%98%EB%88%A0-%EC%93%B0%EA%B8%B0
python에서 mysql 접속 포트 지정
https://it-sunny-333.tistory.com/113
'Archive > [Infra+Web] fanpage:BLACKPINKINYOURAREA' 카테고리의 다른 글
[Web]BLACKPINK IN YOUR AREA-24-CI/CD 환경 구축 + 부분 문서화-2 (0) | 2022.12.07 |
---|---|
[Web]BLACKPINK IN YOUR AREA-23-CI/CD 환경 구축 + 부분 문서화 (0) | 2022.12.01 |
[Web]BLACKPINK IN YOUR AREA-21- php-ahache docker container에 mysqli 설치 + 적용 (0) | 2022.12.01 |
[Web]BLACKPINK IN YOUR AREA-20-Apache 가 포함된 PHP container 설치 (동작 실패) (0) | 2022.11.13 |
[Web]BLACKPINK IN YOUR AREA-19-python-mysql 함수 작성 - 엑셀 데이터 db로 마이그레이션 (0) | 2022.11.10 |