공부하기싫어
article thumbnail

12.1 7:39 pm

오늘은 크롤링쪽 python 함수들을 조져봐야겠다

 

route53

일단 들어가기 쉽게 도메인 레코드를 할당해주려고 했는데 안된다

 

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 인자를 하나 더 넣어주고

실행해보니

 

success

try 부분이 잘 된것을 확인했다

 

sqldeveloper

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