파이썬 로그인 후 파일 다운받기

조회수 860회

유료사이트에 접속한뒤 유료자료들을 받으려고 합니다. 일일이 받기에는 너무 ...귀찮아서 파이썬으로 싹 받아보려고 하는데요.

외국의 어떤 사람이 하는 걸 따라해봤는데 막히는 부분이 있어서 질문드립니다.

아래 코드를 어떻게 수정해야 할까요?

from urllib import request
import requests
from bs4 import BeautifulSoup
import parser

myheaders = {'User-Agent': 'mozilla/5.0 (windows nt 10.0; win64; x64; rv:76.0) gecko/20100101 firefox/76.0'}

with requests.Session() as s:
    url = 'http://www.exam4you.com'
    r = s.get(url, headers =myheaders)
    soup = BeautifulSoup(r.content, 'html.parser')

    login_data['u1'] = soup.find('input', attrs = {'name': 'u1'})['value']   <--- 이부분이 좀 막힙니다. 

    login_data = {'userId': '?????',            <-- 로그인후 network에서 받은 값들인데 ts, 와 u1은 뭔지 모르                    
                                                                        겠습니다...
                  'passwd': '??????????',
                  'ts': '1589378756791'                
                   'u1': '08c8a162ba73af9e033d096b596463e1'
                  }



    r = s.post(url, data=login_data, headers = myheaders)
    print(r.content)

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 처음부터 다시 해보죠. 파일을 일괄적으로 받으려면 어떻게 해야 할까요?


    1. 만약 재수가 좋아서 파일명들이

    http://foo.com/files/1.zip
    http://foo.com/files/2.zip
    http://foo.com/files/3.zip
    ...
    

    형식으로 돼 있고, 그냥 접속하면 바로 다운로드된다고 할 때는, 그냥 저 숫자만 바꿔줘 가면서 받으면 됩니다. 왜냐면 저 파일 주소들을 얻을 수 있는 일관된 방법이, 숫자 바꾸기 뿐이니까요.


    2. 하지만 다음과 같다면 어떨까요?

    http://foo.com/files/ekrxfgbuiy.zip
    http://foo.com/files/q324597ybnzfkdj.zip
    http://foo.com/files/234.zip
    ...
    

    그러면 뭐... 저 파일 주소들을 얻을 수 있는 일관된 방법을 찾아야겠죠. 예컨대 이런 URL들이 있다고 합시다.

    http://foo.com/index.php?board=yourFile&id=1
    http://foo.com/index.php?board=yourFile&id=2
    http://foo.com/index.php?board=yourFile&id=3
    

    그리고 이 URL들에는 다 똑같이 이런 <button>이 있다고 해보죠.

    <button click="startDownload('ekrxfgbuiy')">다운로드</button>
    

    그러면 이때는 BeautifulSoup를 쓰면 될 거 같습니다. URL들은 숫자만 바꿔주면 되고, 각 URL의 내용을 뷰티풀수프로 우려내서, .find()를 돌려서, 어쨌든 startDownload() 안의 값만 얻으면 되는 거니까요.


    3. 하지만 저 URL 또는 파일 경로에 접속했더니 로그인 창으로 이동된다면 어떻게 해야 할까요? 2단계에서 장벽이 하나 더 생겼군요. 이 장벽을 제거하면 2단계와 똑같겠지요.

    정상적인 경로로 한번 해보는 겁니다. 정말로 로그인을 하는 거죠. 단, 이때 브라우저 개발자도구를 켜고, 네트워크로 뭐가 전송되는지, 어떤 인증 쿠키나 세션값이 사용되는지를 조사하는 겁니다. 예를 들어, 조사해 봤더니, 운 좋게 요청헤더의 token 값에 어떤 값이 들어만 있으면 무조건 로그인 성공한다고 치죠. 그러면 얘기는 어렵지 않습니다. .get(url, headers) 할 때 headers{token: "어떤값"}만 지정해 주면 나머지는 2단계와 똑같으니까요.


    코드 몇줄 고친다고 될 일이 아니고 사이트 자체를 분석하고 조사해서 뚫으셔야 합니다. exam4u.com 사이트는 제가 오늘 생전 처음 들어가 봅니다. 로그인 절차가 어떻게 되는지, 사용자 인증이 어떻게 되는지, 원하시는 파일들을 얻는 일관된 방법이 무엇일지 저는 잘 모르겠습니다. 아마 그런 부분은 질문자님이 더 잘 아실 겁니다.

    그런 의미에서, 처음부터 다시 해봅시다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)