2014-10-20 3 views
0

[예시 URL을 열려면 Shazam에 로그인해야합니다.]Python : 메모리에 웹 파일을 다운로드하는 방법은 무엇입니까?

그래서 Shazam 내역을 다운로드하는 스크립트를 작성하여 다른 서비스에 재생 목록을 작성하도록 조작 할 수 있습니다. 어쨌든, http://www.shazam.com/myshazam에서 역사를 직접 파싱 할 수는 없습니다. JavaScript를 다시로드하는 작업이 많이 있고 그 문제를 해결하기가 더 어려울 것이기 때문입니다. 그래서 여기에서 찾을 수있는 다운로드 할 수있는 파일을 조작하고 싶습니다. http://www.shazam.com/myshazam/download-history

나는이 방법을 찾기 위해 노력하고 있지만 여기에 몇 가지 문제가 있습니다.

내가

import urllib 
urllib.urlretrieve ("http://www.shazam.com/myshazam/download-history, "myshazam-history.html") 

urlretrieve 사용할 계획했지만, 난 내가 그 파일을 다운로드 할 때 http://www.shazam.com/myshazam/download-history/myshazam-history.html 같은 실제 URL 경로 (즉, 제공이 없기 때문에이 전혀 작동 것조차 확실하지 않다 1 404 오류). 대신 해당 URL을 누르면 즉시 http://www.shazam.com으로 리디렉션되고 브라우저의 다운로드 창이 표시됩니다.

두 번째 문제는 여전히 세션의 쿠키를 보유해야하며 작동하는지 테스트하기 위해 urlretrieve로 전달하는 방법을 모르겠다는 것입니다. 아래에 로그인하여 세션을 유지 한 다음 웹 페이지를 구문 분석하는 테스트 코드가 있습니다.

def LoginFB(username,password): 
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookielib.CookieJar())) 
    url = "https://www.facebook.com/login.php?skip_api_lo....allthe_loginshazam_stuff)" 
    data = "&email="+username+"&pass="+password 
    socket = opener.open(url) 
    return socket, opener 

def shazamParse(opener): 
    url = "http://www.shazam.com/myshazam/" 
    content = opener.open(url).read() 
    soup = BeautifulSoup(content) 
    finalParse = soup.prettify() 
    return finalParse.encode("utf-8") 

(socket, opener) = LoginFB("email","password") 

shazamParse(opener)  

내가 로그온 한 사용자로 다운로드 URL (세션 쿠키를 잡고), 메모리에 파일을 다운로드 문자열로 파일의 내용을 넣고 BeautifulSoup로 그것을 구문 분석을 명중하고 싶은 . 내 shazamParse 함수와 정확히 같은 접근법은 myshazam-history.html 파일의 내용으로 문자열에서 읽는 것입니다.

어떻게하면 좋을까요?

+0

파이썬에는이 작업을 자동화 할 여러 라이브러리가 있습니다. 능 직물이 제일 좋아. – Claris

답변

0

직접 대답을 드리겠습니다.이 유형의 작업을보다 명확하고 유지 보수하기 쉬운 방식으로 수행 할 수있는 여러 라이브러리가 있습니다. 그들은 다음과 같습니다 :

  1. Scrapy - 인증을 처리하는 웹 스파이더. 그것은 큰 도구이지만, 많은 긁적 거리는 일을하면 잘 작동합니다.
  2. requests 라이브러리 - urllib2가 있어야하는 라이브러리입니다. 이 직업에 적극 권장됩니다! 그 urllib2가 초기 인증 요청에 설정된 세션 쿠키 변수에 보유 할 수있는 기회를 갖도록

urllib2으로이 작업을 수행하려면, 당신은 CookieJar 라이브러리를 사용해야합니다.

import urllib2 
from cookielib import CookieJar 

cj = CookieJar() 
# Creates a custom page opener, which is cookie aware 
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) 

# Make the actual url request from the server 
data = {} # Any optional data to add to the headers. 
response = opener.open("http://www.example.com/page/page2", data) 
page_data = response.read() 

# Look at the HTML from the response 
print page_data[0:200] 

당신를 셋업 CookieJar와 urllib2 opener되면,이 오프너에서 앞으로 모든 요청은 이전 요청에서 쿠키 설정에 액세스 할 수 있습니다.

facebook auth를 사용하여 사이트에 액세스하는 것과 관련하여 또 다른 문제가있을 수 있습니다.하지만 그 문제는 가능한 한 새로운 질문으로 게시해야합니다.

희망 하시겠습니까?

+0

감사합니다. 따라서 방금 게시 한 동일한 구현으로 쿠키 문제를 해결했다고 생각합니다. 내 문제는 쿠키를 .urlretrieve() 메서드로 전달하는 방법이 아니므로 해당 메서드를 사용하여 파일을 다운로드 할 수 있습니다. – whoisjuan

+0

@ user3381594 : 내 대답을 편집하여 페이지의 HTML 데이터를 검색하는 방법을 볼 수 있습니다. 'urlretrieve'는 드라이브에 저장하기 때문에 사용할 필요가 없습니다. 우리는 그것을 모두 기억할 수 있습니다. – VooDooNOFX

+0

고마워요. 당신의 방법으로 시도했지만 작동하지 않습니다. HTTP 오류 401이 발생합니다. 그 문제는 구문 분석하려고하는 URL이 HTML을 전혀 렌더링하지 않는다는 것입니다. HTML 파일을 다운로드하라는 메시지를 표시합니다. 그것은 당신의 Shazam 역사입니다. 내가 성취하고자하는 것은 그 파일을 메모리에 다운로드하고 일단 정상적인 HTML로 파싱하는 것입니다. 하지만이 URL은 HTML이 아니라 렌더링 된 것을 반복하고 싶습니다. 대신 다운로드 할 HTML 파일을 제공합니다. 2 주 전 그들은 PDF로 목록을 제공했지만 며칠 전에 HTML 파일로 변경되었습니다. 어떤 힌트? – whoisjuan

관련 문제