• 목록
  • 아래로
  • 위로

안녕하세요?


제가 예전에 저희 동문들의 싸이월드 미니홈피 크롤링 작업에 대해 질문을 드렸고


이에 대해 humit 님께서 상세한 답변을 해주셨습니다 ^^


https://studyforus.com/help/591303


그런데 javascript로 처리되는 부분이 의외로 많고, iframe과 관련된 처리도 해야 되어서 


부득이하게 requests만 사용하는 것은 포기하고 selenium을 사용하고 있네요 ㄷㄷ



머지 않아 싸이월드 도메인이 만료된다고 하여서


일단 jpg, gif 등 일반적인 이미지 파일을 모두 다운로드 받는 것까지는 날림으로 구현을 했습니다.


selenium으로 이미지 파일의 url을 알아낸 후에 urllib.request.urlretrieve으로 다운받는 다소 무식한 방법을 사용했네요 ^^;

('더보기'에 대한 자바스크립트를 반복 실행한 후에, 이미지를 여는 자바스크립트를 숫자만 바꿔서 실행하는 방식으로 구현했네요.)



다만 swf 파일의 다운로드와 관련하여 막히는 부분이 있는데요 ㅠㅠ


저번에는 공인인 박주영 선수 홈페이지를 예로 들어 질문 드렸는데, 이번에는 배우 김희선을 예시로 하겠습니다 ^^

(swf 파일의 예시를 찾기가 어려웠네요.)


https://cy.cyworld.com/home/23452603


첫번째 사진을 클릭하면 swf 파일이 뜨는데, 해당 swf 파일과 관련된 요소는 다음과 같습니다.


<dd class="thum">
<object data="http://cyimg36.cyworld.com/common/file_down.asp?redirect=%2F360025%2F2011%2F10%2F18%2F26%2F20111018030324_23452603_0580x0435.swf" id="" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="663" height="377">
    <param name="movie" value="http://cyimg36.cyworld.com/common/file_down.asp?redirect=%2F360025%2F2011%2F10%2F18%2F26%2F20111018030324_23452603_0580x0435.swf">
    <!--[if !IE]>-->
    <object type="application/x-shockwave-flash" data="http://cyimg36.cyworld.com/common/file_down.asp?redirect=%2F360025%2F2011%2F10%2F18%2F26%2F20111018030324_23452603_0580x0435.swf" width="663" height="377">
    <!--<![endif]-->
    <div>
        <!--h1>Alternative content</h1-->
        <!-- <img src="http://cythumb.cyworld.com/100x100/cyimg36.cyworld.com/common/file_down_swf.asp?redirect=%2F360025%2F2011%2F10%2F18%2F26%2F20111018030324_23452603_0580x0435.swf" alt="플래시 파일입니다" /> -->
        <img src="http://nthumb.cyworld.com/thumb?width=100&height=100&url=http%3A%2F%2Fcyimg36.cyworld.com%2Fcommon%2Ffile_down_swf.asp%3Fredirect%3D%252F360025%252F2011%252F10%252F18%252F26%252F20111018030324_23452603_0580x0435.swf" alt="플래시 파일입니다">
    </div>
    <!--[if !IE]>-->
    </object>
    <!--<![endif]-->
</object>
</dd>



미니홈피에 접속한 상태에서 object 태그의 data 속성에 있는 url을 크롬 최신버전에서 열면 저절로 swf 파일이 다운로드 됩니다.


그런데 파이어폭스에서는 다운로드가 되지 않고, 로그인하라는 창이 뜨더군요 ㅠㅠ


아쉽게도 제 계정은 이미 삭제되었는지 로그인이 안 되고, 신규 회원가입도 막혀있네요 ㄷㄷ

(전화 또는 이메일 인증이 안 되네요)



그런데 urllib.request.urlretrieve을 이용하거나, selenium의 크롬 또는 파이어폭스에서 webdriver.get을 하여도


swf 파일을 다운받을 수는 없고, 로그인하라는 창으로 연결되더군요 ㅜㅜ


참고로 플래시가 설치된 PC에서 IE로 미니홈피에 접속해보니 플래시가 아무런 문제가 없이 잘 재생되네요.



미니홈피에서 어떤 방식으로 유저가 swf 파일에 접근하는 것을 차단하는지, 


저의 허접한 수준에서 swf 파일을 다운받을 수 있는 방법은 없는지 여쭤봅니다.


구글링을 해보니 브라우저에 캐싱된 파일을 복사하라고 하던데 이 방법 이외에 파이썬으로 구현할 수 있는 다른 방법을 찾고 있네요 ^^


그럼 일교차가 큰데 감기 조심하시고, 답변 달아주실 분들께 미리 감사드립니다!


작성자
이니스프리 119 Lv. (0%) 1876250/115200000EXP

당분간 일신상의 사정으로 쪽지나 댓글로 답변을 드리기 어렵습니다. 죄송합니다.

 

CSVpuymXAAAVVpd.jpg

댓글 6

이니스프리 작성자
profile image
count = 0
while True:
    try:
        driver.execute_script("viewDetail(" + str(count) + ",'Y');") # 게시글로 이동합니다.
        time.sleep(waiting_time)
        frame = driver.find_element_by_xpath('/html/body/div[1]/article[2]/iframe')
        driver.switch_to.frame(frame) # 게시글의 프레임으로 이동합니다.
        time.sleep(1)
        html = driver.page_source
        soup = BeautifulSoup(html, 'html.parser')
        date = soup.select_one('div.view1 p') # 태그에 작성일이 들어있습니다.
        unwanted = date.find('strong')
        unwanted.extract() # p 태그 내부의 strong 태그(글 작성자)를 제거합니다.

        image = soup.select_one('div.webPage object param')
        extension = '.' + image['value'].split('.')[-1] # 확장자를 추출합니다.
        print(image['value'])
        filename = date.text.replace('\n', '').split()[0].replace('.', '-')
        # 게시글을 작성한 날짜를 추출하여 파일명으로 지정합니다.
        full_filename = filename + extension
        add_number = 1
        while os.path.isfile(full_filename) == True: # 파일명이 중복되는 경우를 처리합니다.
            full_filename = filename + '-' + str(add_number) + extension
            add_number += 1
        driver.switch_to.default_content() # 원래의 프레임으로 돌아갑니다.
        driver.get(image['value'])
        time.sleep(1)
        count += 1
    except:
        break


급히 작성해서 두서가 없는데 문제가 되는 부분은 위와 같습니다 ^^;


driver.get()으로 swf 파일에 접근할 수가 없고, 로그인하라는 페이지로 연결되네요.


selenium이 아닌 일반 크롬과 IE에서는 swf 파일에 접근할 수 있는데 말이죠 ㅠㅠ


제가 테스트한 바로는 적어도 user agent의 문제는 아닌 것 같네요.


그럼 굿밤 되세요!

comment menu
2019.11.05. 01:31

신고

"이니스프리님의 댓글"

이 댓글을 신고 하시겠습니까?

이니스프리 작성자
profile image

어젠 너무 졸려서 못 올렸는데 보시기 편하게 전체 스크립트 중에 질문의 요지가 되는 스크립트만 정리해서 올리면 다음과 같습니다.


from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time, os

options = webdriver.ChromeOptions()
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
options.add_argument("user-agent=Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko")
preferences = {"safebrowsing.enabled": True }
options.add_experimental_option("prefs", preferences)

driver = webdriver.Chrome(executable_path='chromedriver', chrome_options=options)
driver.implicitly_wait(15)
waiting_time = 3 # time.sleep()의 대기시간을 지정합니다.

url = 'http://cy.cyworld.com/home/23452603'
driver.get(url)
time.sleep(waiting_time)

count = 0
while True:
    driver.execute_script("viewDetail(" + str(count) + ",'Y');") # 게시글로 이동합니다.
    time.sleep(waiting_time)
    frame = driver.find_element_by_xpath('/html/body/div[1]/article[2]/iframe')
    driver.switch_to.frame(frame) # 게시글의 프레임으로 이동합니다.
    time.sleep(1)
    html = driver.page_source
    soup = BeautifulSoup(html, 'html.parser')
    date = soup.select_one('div.view1 p') # 태그에 작성일이 들어있습니다.
    unwanted = date.find('strong')
    unwanted.extract() # p 태그 내부의 strong 태그(글 작성자)를 제거합니다.
    image = soup.select_one('div.webPage object param')
    extension = '.' + image['value'].split('.')[-1] # 확장자를 추출합니다.
    print(image['value'])
    filename = date.text.replace('\n', '').split()[0].replace('.', '-')
    # 게시글을 작성한 날짜를 추출하여 파일명으로 지정합니다.
    full_filename = filename + extension
    add_number = 1
    while os.path.isfile(full_filename) == True: # 파일명이 중복되는 경우를 처리합니다.
        full_filename = filename + '-' + str(add_number) + extension
        add_number += 1
    driver.switch_to.default_content() # 원래의 프레임으로 돌아갑니다.
    driver.get(image['value'])
    #driver.execute_script("window.open('" + image["value"] + "');") # 이 방식도 안 되네요.
    time.sleep(1)
    count += 1
driver.quit()



결과적으로 이런 창이 뜨네요 ㅠㅠ



comment menu
2019.11.05. 10:28

신고

"이니스프리님의 댓글"

이 댓글을 신고 하시겠습니까?

title: 황금 서버 (30일)humit
profile image
+1

header에 Referer로 https://cy.cyworld.com/home/23452603 와 같이 줘서 요청을 해보시기 바랍니다.

comment menu
2019.11.06. 16:34

신고

"humit님의 댓글"

이 댓글을 신고 하시겠습니까?

이니스프리 작성자 → humit
profile image
+1

오오~ humit 님께서도 요새 바쁘실텐데 답글 달아주셔서 정말 감사합니다!


파이썬 selenium 라이브러리에 referer 처리와 관련된 자체적인 명령어가 없길래


저는 selenium에서는 referer를 별도로 지정하지 않더라도 일반적인 브라우저를 사용할 때처럼 문제없이 돌아갈 줄 알았는데 아닌가 보네요 ㅠㅠ


말씀해주신대로 referer를 이용하여 아래와 같은 방법으로 해결했습니다!


    req = urllib.request.Request(image['value'])
    req.add_header('Referer', 'http://cy.cyworld.com/home/23452603')
    sourcecode = urllib.request.urlopen(req).read()
    with open("temp.swf","wb") as f:
        f.write(sourcecode)


humit 님 덕분에 싸이월드 도메인이 만료되기 전에 미니홈피 백업 잘 하겠습니다~


다른 분들께서도 필요하실 것 같아서 스크립트를 완성하면 스포어에 올릴게요.


그럼 humit 님께서도 편안한 저녁 되시고, 다시 한 번 감사드립니다! ^-^

comment menu
2019.11.06. 18:49

신고

"이니스프리님의 댓글"

이 댓글을 신고 하시겠습니까?

연우빠
profile image

기대하겠습니다.

comment menu
2019.11.08. 00:27

신고

"연우빠님의 댓글"

이 댓글을 신고 하시겠습니까?

이니스프리 작성자 → 연우빠
profile image

감사합니다!

일단 그럭저럭 제대로 작동하는 스크립트는 올렸습니다~

https://studyforus.com/share/621104

윈도우용 GUI 버전은 주말에 시간이 되는대로 올릴게요 ^^

그럼 굿밤 되세요!

comment menu
2019.11.08. 00:39

신고

"이니스프리님의 댓글"

이 댓글을 신고 하시겠습니까?

권한이 없습니다.
번호 제목 글쓴이 날짜 조회 수
공지 [작업 완료] 설 명절 맞이 서버 업데이트 안내 3 마스터 24.02.11.17:21 377
공지 [중요] 호스팅 만료와 관련하여 일부 수칙이 변경됩니다. 4 마스터 23.01.14.02:23 4061
공지 [필독] 질문하는 방법 17 마스터 18.02.23.03:09 4464
922 계속 사용중이던 네트워크 공유 폴더가 갑자기 액세스 불가라고 뜹니다. 6 image 장윤서 18.06.07.16:55 34331
921 팀뷰어 대체할 원격 제어 프로그램 추천 부탁드립니다 16 이니스프리 17.11.30.15:38 32325
920 엑셀 그래프의 축 간격 조절 문제입니다. 2 image 국내산라이츄 17.08.10.11:06 12483
919 아이폰/아이패드 충전기 발열 관련 질문 드립니다 9 image 이니스프리 19.05.02.22:52 11105
918 에러 523 해결법 4 입체그림 20.02.21.16:48 6690
917 PyQt 실행시 프리징 현상 관련하여 질문 드립니다! ㅠㅠ 3 이니스프리 19.07.06.03:37 6685
916 프린터가 지 맘대로 프린트를 하네요. 3 곰도리푸 18.04.04.18:20 6016
915 윈도우용 메일 클라이언트가 필요합니다. 9 네모 18.01.11.20:15 5867
914 크롬에서 특정 사이트 접속 문제 관련하여 질문 드립니다 9 이니스프리 17.03.27.18:03 5309
913 오라클 클라우드 프리티어 가입이 안 되네요 ㅠㅠ 20 이니스프리 20.06.26.21:31 4827
912 파이썬 에디터로 어떤 것이 좋나요? 14 NoYeah 20.01.08.21:08 4525
911 라떼판다와 라즈베리 파이 중 어느 쪽을 사는 게 나을까요? 9 제르엘 18.10.14.19:25 3827
910 나무 위키의 수익구조는 무엇일까요? 2 NoYeah 18.03.18.15:56 3808
909 파티션 복구 프로그램 TestDisk 잘 아시는 분 계시나요? 29 이니스프리 17.11.10.14:53 3745
908 IE11에서 이미지가 깨지는 현상을 해결할 수 있을까요? 2 이니스프리 19.08.02.00:01 3702
907 파일질라로 연결하니까 보안되지 않은 서버입니다. TLS를 통한 FTP를 지원하지 않습니다. 이렇게떠요 해결방안좀 1 마카오 16.09.11.00:57 3654
906 자바스크립트 FormData와 관련된 메서드의 IE 호환성과 관련하여 질문 드립니다 ^^ 6 image 이니스프리 19.08.05.14:22 3426
905 선택약정 안 되는 중고폰의 경우에는 어떤 단점이 있는 것인가요?? 6 이니스프리 20.01.21.14:30 3099
904 집에서 시놀로지 NAS로 워드프레스나 미디어위키 돌리면 느릴까요? 10 이니스프리 17.01.16.20:56 2979
903 [Requests] multipart/form-data의 전송에 대해 질문 드립니다 ^^ 4 이니스프리 19.12.18.22:00 2902