backend/데이터분석

project02.까페알바

seul chan 2016. 11. 20. 18:28


*구현하고자 하는 기능

-알바천국, 알바몬

-조건; 사이트/블로그 등재 (날짜순)

-특정 조건; 주2-3회, 위치, 일하는 시간 12-18시간;

-위치; 이대, 신촌, 서울대입구, 봉천동, 서강대, 대흥, 아현 일대


-11/20~

알바천국, 알바몬 각각 URL 따고 제목/url 따기; 현재 함수 이전까지 완료/ 

-for문 활용해서 함수로 만들고

-각 url로 들어가서 일하는 시간 뽑아내기 => 시간을 기준으로 12-18시간? 

-제목/url/시간/위치 => 웹페이지 or mail로

+웹페이지 활용하면 네이버지도 api- 집에서의 거리까지 분석

 

*그냥 페이지 말고 모바일 페이지의 api를 따올 수는 없을까?


-12/3 기준

본문 + url을 뽑아서 txt 파일로 만들어주고, txt 파일을 읽어서 없는 내용만 따로 추가. 메일로 전송하는 기능까지 완료하였다.


생각보다 어려운 프로젝트... 이제 본문 텍스트의 정규표현식 말고 중복된 ip에 대한 필터링도 해결해야 할 문제로 남아있다. 


-추후 해야할것

본문 텍스트를 분석해서 시간/날짜별로 걸러주는것도 필요할듯...


현재까지의 코드

=----------------

import requests

from bs4 import BeautifulSoup

import datetime

import re

from selenium import webdriver

from IPython.display import Image, IFrame, Javascript


title_li = []

sub_text_li = []

filepath_title = int(input("만들 파일 제목:"))

filepath_write = "./cafe_{filepath_write}.txt".format(filepath_write=filepath_title)

filepath = "./cafe_{filepath}.txt".format(filepath=int(filepath_title)-1)

#os로 파일이 없으면 만들어라



n = int(input("찾고자 하는 페이지:"))

mail_title_plus = str(input("메일제목:"))

sth_to_tell = str(input("말하고자 하는것:"))

title_li_mon = []

title_li_heaven = []


now = datetime.datetime.now()

nowdate_time = now.strftime("%m-%d %H:%M")

nowdate_day = now.strftime("%m_%d")


URL_PAGE_heaven = "http://www.alba.co.kr/job/area/MainLocal.asp?page={page_num}&pagesize=20&viewtype=L&sidocd=02&gugun=%BC%AD%B4%EB%B9%AE%B1%B8,%BC%AD%B4%EB%B9%AE%B1%B8,%B8%B6%C6%F7%B1%B8,%B8%B6%C6%F7%B1%B8,%B8%B6%C6%F7%B1%B8,&dong=%B4%EB%C8%EF%B5%BF,%20%BE%C6%C7%F6%B5%BF,%20%C3%A2%C0%FC%B5%BF&d_area=&d_areacd=&strAreaMulti=02%7C%7C%BC%AD%B4%EB%B9%AE%B1%B8%7C%7C%B4%EB%C7%F6%B5%BF%2C02%7C%7C%BC%AD%B4%EB%B9%AE%B1%B8%7C%7C%C3%A2%C3%B5%B5%BF%2C02%7C%7C%B8%B6%C6%F7%B1%B8%7C%7C%B4%EB%C8%EF%B5%BF%2C02%7C%7C%B8%B6%C6%F7%B1%B8%7C%7C%BE%C6%C7%F6%B5%BF%2C02%7C%7C%B8%B6%C6%F7%B1%B8%7C%7C%C3%A2%C0%FC%B5%BF%2C&hidJobKind=&hidJobKindMulti=06210000%2C06020000%2C06220000&WorkTime=&searchterm=&AcceptMethod=&ElecContract=&HireTypeCD=&CareerCD=&CareercdUnRelated=&LastSchoolCD=&LastSchoolcdUnRelated=&GenderCD=&GenderUnRelated=&AgeLimit=0&AgeUnRelated=&PayCD=I01&PayStart=&WelfareCD=&Special=&WorkWeekCD=&hidSortCnt=20&hidSortOrder=&hidSortDate=&WorkPeriodCD=&hidSort=FREEORDER&hidSortFilter=Y&hidListView=LIST&WsSrchKeywordWord=&hidWsearchInOut=&hidSchContainText="


URL_PAGE = "http://www.albamon.com/list/gi/mon_subway_list.asp?page={page_num}&ssf=&uppsubway1=102&uppsubway2=102&uppsubway3=102&codsubway1=10239&codsubway2=10238&codsubway3=10237&aorder=,0,1,2&sbline1=M2&sbline2=M2&sbline3=M2&mapview=&ps=20&ob=6&lvtype=1&rpcd=,1060,1070,1080&partExc=&paycd=A000&paycd_a=&rWDate=1&Empmnt_Type="

driver = webdriver.Firefox()


with open(filepath_write, "a") as fp:

    fp.write("알바몬 추가 항목"+nowdate_time+"\n")

    for i in range(1, n+1):

        response = requests.get(URL_PAGE.format(page_num=i))

        # 그래서 먼저 decode 하고 dom을 뽑아보기

        r = response.content

        r = r.decode('cp949')

        dom = BeautifulSoup(r, "html.parser")

        # selector; 목록의 본문

        css_selector = "div.subWrap p.cName "

        css_selector_body = "div.subWrap p.cTit "

        css_selector_url = 'div.gListWrap tbody tr td div p.cName a'

        # 1, 3, 5, 7 홀수로 뽑아내면 됨 (중간에 필터링 위해서)-알바천국과 달리 class네임이 있으므로 그걸 적용

        # 이렇게 뽑으면 albamon.com 뒤의 주소만 나옴

        for i in range(len(dom.select(css_selector))):

            title_text_print = dom.select(css_selector)[i].text

            title_body_text = dom.select(css_selector_body)[i].text

            f = open(filepath, "r")

            data = f.read()

            if title_text_print in data:

                pass

                print("ho~")

            elif title_text_print in title_li_mon:

                pass

                print("hey~")

            else:

                title_li_mon.append(title_text_print)

                # 본문 중에서 url만 뽑아내기

                get_herf = dom.select(css_selector_url)[i].get("href")

                albamon_com = "http://www.albamon.com"

                # 전체 url 구하기 (sub_url ; 해당 글의 링크)

                sub_url = albamon_com + get_herf

                b = i+1

                fp.writelines(str(b)+"\n"+title_text_print+"\n"+title_body_text+"\n"+sub_url+"\n")

                #fp.write(str(i+1)+title_text_print+sub_url+"\n")


    fp.write("\n"+"알바천국 추가 항목"+nowdate_time+"\n")

    for i in range(1, n+1):

        response = requests.get(URL_PAGE_heaven.format(page_num=i))

        # 그래서 먼저 decode 하고 dom을 뽑아보기

        r = response.content

        r = r.decode('cp949')

        dom = BeautifulSoup(r, "html.parser")

        # selector; 목록의 본문

        css_selector = "table tbody tr td.title a span.company"

        css_selector_body = "table tbody tr td.title a span.title"

        css_selector_url = "table tbody tr td.title a "


        for i in range(len(dom.select(css_selector))):

            title_text_print = dom.select(css_selector)[i].text

            title_body_text = dom.select(css_selector_body)[i].text

            f = open(filepath, "r")

            data = f.read()

            if title_text_print in data:

                pass

                print("in_data")

            elif title_text_print in title_li_heaven:

                pass

                print("in_list")

            else:

                title_li_heaven.append(title_text_print)

                # 본문 중에서 url만 뽑아내기. 1, 5, 9 순서로 뽑아냄

                a = i*4

                get_herf = dom.select(css_selector_url)[a].get("href")

                albamon_com = "http://www.alba.co.kr"

                # 전체 url 구하기 (sub_url ; 해당 글의 링크)

                sub_url = albamon_com + get_herf

                b = i+1

                fp.write(str(b)+"\n"+title_text_print+"\n"+title_body_text+"\n"+sub_url+"\n")                

                

    fp.write(sth_to_tell)

                

print("END")

driver.quit()


import smtplib

from email.header import Header

from email.mime.base import MIMEBase

from email.mime.text import MIMEText

from email.mime.multipart import MIMEMultipart

 

from email import utils

from email import encoders

import os

receiver = ["bartkim0426@gmail.com"]

Ccuser = ["bartkim0426@gmail.com"]

mail_title = "신촌알바({time}){mail_title_plus}".format(time=nowdate_time, mail_title_plus = mail_title_plus)


ToUser = receiver

# CcUser = ['참조할 사람 메일 주소1', '참조할 사람 메일 주소2']

 

FromUser = 'bartkim0426@gmail.com'

Passwd = 'tmfcks47'

Server= 'smtp.gmail.com'

Port = 587

 

Subject = "{mail_title}".format(mail_title = mail_title)

 

def send_email(from_user, to_user, cc_users, subject, textfile, attach): 

    COMMASPACE = ', '

    msg = MIMEMultipart('alternative')

    msg['FROM'] = from_user

    msg['To'] = COMMASPACE.join(to_user)

    msg['Cc'] = COMMASPACE.join(cc_users)

    msg['Subject'] = Header(s=subject, charset='utf-8')

    msg['Date'] = utils.formatdate(localtime = 1)

     

    fp = open(filepath_write, 'rb')

    msg.attach(MIMEText(fp.read().decode('utf8', 'ignore')))

    fp.close()

 

    if (attach != None):

        part = MIMEBase('application', 'octet-stream')

        part.set_payload(open(attach, 'rb').read())

        encoders.encode_base64(part)

        filename = os.path.basename(attach)

        part.add_header('Content-Disposition', 'attachment', filename=filename)

        msg.attach(part)

 

    #print(Server + ":" + str(Port) + " connecting...")

    try:

        smtp = smtplib.SMTP(Server, Port)

        #smtp.set_debuglevel(1)

        try:

            #smtpserver.ehlo()

            smtp.starttls()

            smtp.login(FromUser, Passwd)

            smtp.sendmail(from_user, cc_users, msg.as_string())

            print("[OK] send mail")

        except:

            print("[Error] Fail to send mail")

        finally:

            #smtp.close()

            smtp.quit()

    except:

        #debug('sendmail', traceback.format_exc().splitlines()[-1])

        print("[Error] could no connect")

        return False

 

send_email(FromUser, ToUser, Ccuser, Subject, 'contents.txt', None)

------------------