def main():

    ### 0. 연결할 DB 설정
    dt = data_util.DataUtil()
    process_list = []
    dao_ydns = dao.DAO(host='103.55.190.32',
                       port=3306,
                       user='******',
                       password='******',
                       db='crawl',
                       charset='utf8mb4')
    ### 1. 서버명을 정해준다.
    server = 'jykim'

    ### 2. 서버에 해당하는 프록시 정하기
    selected_proxy_rows = dao_ydns.select_sever_proxy(server=server)

    ### 3. 모든 프록시 개수 가져오기
    total_proxy_rows = dao_ydns.select_total_proxy()
    total_proxy_num = len(total_proxy_rows)
    proxy_id_list = []
    for proxy_row in selected_proxy_rows:
        proxy_id_list.append(proxy_row['id'])
    min_proxy_id = min(proxy_id_list)
    max_proxy_id = max(proxy_id_list)

    ### 4. 프록시에 해당하는 프로세스를 만들어준다.
    # 프록시는 자신의 고유 번호(id) 를 가진다.  ex) 1,2,3,4
    # 전체 프록시 길이로 task num 을  나누었을 때 나머지가 프로세스가 할당받은 아이디와 같은 task 만 처리한다
    # ex) 전체길이가 12 이고 process 가 할당받은 id 가 5라면 이 process가 처리하는 작업은 5, 17, 29, 41
    # 각각의 프로세스는 한번에 여러개의 task 를 처리할 수 있지만 프로세스 별로 task 가 중복될 수 없다.
    # 가령 id가 5인 process 는 항상 id가 6인 process 와 처리하는 작업이 다르다.
    for proxy_id in range(min_proxy_id, max_proxy_id + 1):
        dt = data_util.DataUtil()
        process = Process(
            target=dt.divide_process,
            args=(proxy_id, total_proxy_num),
        )  ##프로세스의 고유 id(proxy_id) 와 전체 길이를 넘겨준다.
        process_list.append(process)

    print("process시작")
    for process in process_list:
        process.start()
示例#2
0
def main() :
    tmp_proxy_list = []

    ##db 연결
    dao_ydns = dao.DAO(host='103.55.190.32', port=3306, user='******', password='******', db='crawl',
                       charset='utf8mb4')

    ##1. 사용가능한 프록시 갯수 확인하기 , 어떤 서버에서 가져올지 parameter 로 넘겨주기
    proxy_rows = dao_ydns.select_check_proxy(server='ydns')
    ##2. 사용가능한 프록시의 id를 list에 담아둔다.
    for proxy in proxy_rows:
        tmp_proxy_list.append(proxy)

    ##3. 요청 들어온 작업을 확인한다. 요청은 프록시 개수보다 작거나 같음.
    task_rows = dao_ydns.select_gr(len(proxy_rows))
    ##4. 다시 요청의 개수만큼 프록시 사이즈를 맞춰준다.
    proxy_list = tmp_proxy_list[:len(task_rows)]

    ####여기서 if 로 프록시 있으면 하고 없으면 하지말기로 체크하기

    print('---------------')

    if len(proxy_rows)>0:
        ##5. 사용하고 있는 프록시의 상태를 N 으로 변경해준다
        for proxy in proxy_list:
            id = proxy['id']
            dao_ydns.update_N_proxy(id)

        for task in task_rows:
            id = task['id']
            dao_ydns.update_gi(id)
            dao_ydns.update_gather_start(id)
        ##6. input_data 만들기
        input_data = []

        ##7. 요청된 테스크 가져오기
        for task in task_rows:
            dt = data_util.DataUtil()
            task_list = dt.data_process(task)
            input_data.append(task_list)

        ##8.proxy 형태 만들어주기
        ##make_proxy
        # input : proxy_list
        # return : req_proxy_list
        dt = data_util.DataUtil()
        req_proxy_list, proxy_id = dt.make_proxy(proxy_list)

        ##9. input_data 에 proxy 넣어주기
        for index, task_list in enumerate(input_data):
            task_list[0].append(req_proxy_list[index])
            task_list[0].append(proxy_id[index])

            task_list[1].append(req_proxy_list[index])
            task_list[1].append(proxy_id[index])

        for i in input_data:
            print(i)

        ##10. input 데이터를 이용해서 threading 하기
        # def multiprocessing
        num_process = len(proxy_list) * 2
        return num_process, input_data
示例#3
0
    pass
elif len(row_gr) == 0:
    print('요청작업이 없습니다')
#작업중인게 없고 요청들어온게 있으면
elif len(row_gr) > 0:
    try:
        print('요청된 작업을 처리합니다.')
        ##작업을 시작합니다.
        task = row_gr[0]

        ##작업 상태를 업데이트 시켜주기
        dao_ydns.update_gi(task['id'])
        dao_ydns.update_gather_start(task['id'])
        #task : dictionary 타입 keyword:'', channel: '', perioda=['',''] etc
        #task 를 처리하기 위해 data util 객체를 생성합니다.
        dt = data_util.DataUtil(task)

        #task 를 thread 처리 하기 위해 input_data 로 만들어줍니다.
        input_data = dt.data_process()

        #dt.to_crawl 입력받은 데이터를 크롤링 엔진으로 전달

        #threading 생성
        threads = [None] * len(input_data)
        results = [None] * len(input_data)

        #모든 스레드를 각각 시작한다.
        for index, input_list in enumerate(input_data):
            threads[index] = Thread(target=dt.to_crawl,
                                    args=(input_list, results, index))
            threads[index].start()
示例#4
0
        ##10. input 데이터를 이용해서 threading 하기
        # def multiprocessing
        num_process = len(proxy_list) * 2
        return num_process, input_data

if __name__ == '__main__':

        ##main 함수 시작
        num_process, input_data = main()

        ##멀티프로세싱 크롤링 시작
        freeze_support()
        processes = [None] * num_process
        manager = multiprocessing.Manager()
        results = manager.list(range(num_process))
        dt = data_util.DataUtil()
        # 모든 스레드를 각각 시작한다.
        for index, task_list in enumerate(input_data):
            for jindex, input_list in enumerate(task_list):
                print(input_list)
                processes[2 * index + jindex] = Process(target=dt.to_crawl,
                                                        args=(input_list, results, 2 * index + jindex))
                processes[2 * index + jindex].start()

        for i in range(len(processes)):
            processes[i].join()

        # 쓰레드 결과 값(TASK ID ) 워드클라우드 생성을 위해 전달
        for index, task_list in enumerate(input_data):
            for jindex, input_list in enumerate(task_list):
                input_list.append(results[2 * index + jindex])
示例#5
0
if __name__ == '__main__':
    conn = pymysql.connect(host='103.55.190.32',
                           user='******',
                           password='******',
                           db='crawl',
                           charset='utf8mb4')
    curs = conn.cursor(pymysql.cursors.DictCursor)

    sql = "select * from polls_breakdown where status=\'%s\' limit 5" % ('GR')
    curs.execute(sql)
    rows = curs.fetchall()
    input_data = []

    ###요청된 테스크 가져오기
    for row_gr in rows:
        dt = data_util.DataUtil(row_gr)
        task_list = dt.data_process()
        input_data.append(task_list)

    ###api 이용해서 사용가능한 개인 IP 가져오기(proxy 우회)
    input_data = make_proxy(input_data)

    Processes = [None] * len(rows) * 2
    manager = multiprocessing.Manager()
    results = manager.list(range(len(rows) * 2))

    #모든 스레드를 각각 시작한다.
    for index, task_list in enumerate(input_data):
        for jindex, input_list in enumerate(task_list):
            print(input_list)
            Processes[2 * index + jindex] = Process(target=to_crawl,