2012-04-23 7 views
3

광산과 유사한 문제를 논의하는 몇 가지 주제가 있음을 알리는 것으로 시작하겠습니다. 그러나 제안 된 해결책은 어떤 이유로 든 작동하지 않는 것으로 보입니다. . 또한 스크립트를 사용하여 인터넷에서 파일을 다운로드하는 것이 처음입니다. 지금까지 저는 주로 Python을 Matlab 대체품으로 사용했습니다 (numpy/scipy 사용). 그래서 내가 바보 같은 실수를 저 지르면 나랑 벗겨주세요.파이썬에서 웹에서 .csv 파일 다운로드 (리디렉션 포함)

내 목표 : python을 사용하여 인터넷 데이터베이스 (http://dna.korea.ac.kr/vhot/)에서 많은 .csv 파일을 자동으로 다운로드하고 싶습니다. 필자가 손으로 요구하는 1000 개 이상의 CSV 파일을 다운로드하는 것은 너무 성가기 때문에이 작업을 수행하려고합니다. 데이터베이스는 드롭 다운 메뉴에서 몇 가지 옵션을 선택해야만 UI를 사용하여 액세스 할 수 있습니다. 몇 가지 단계를 거쳐 최종적으로 .csv 파일에 대한 링크로 끝납니다. 드롭 다운 메뉴를 채우고 '검색'을 누르면 드롭 다운 메뉴의 모든 매개 변수가 포함 된 URL을 찾았습니다. 즉, 드롭 다운 메뉴를 사용하는 대신 해당 메뉴를 변경할 수 있습니다. 이는 많은 도움이됩니다. 하나의 예는 다음 URL로 저를 지시, URL1 = http://dna.korea.ac.kr/vhot/search.php?species=Human&selector=drop&mirname=&mirname_drop=hbv-miR-B2RC&pita=on&set=and&miranda_th=-5&rh_th=-10&ts_th=0&mt_th=7.3&pt_th=99999&gene=

를이 페이지에서 내가 5 CSV-파일을 선택할 수 있습니다

이 웹 사이트 URL의 예 (호출 URL1 수 있습니다)입니다 :

URL2 = http://dna.korea.ac.kr/vhot/download.php?mirname=hbv-miR-B2RC&species_filter=species_id+%3D+9606&set=and&gene_filter=&method=pita&m_th=-5&rh_th=-10&ts_th=0&mt_th=7.3&pt_th=99999&targetscan=&miranda=&rnahybrid=&microt=&pita=on

그러나이 직접 CSV 파일을 포함하지만, 나를 위해 '재'(새로운 용어로, 일 표시하지 않습니다 내가 googeling에 의해 발견되면, 내가 틀리면 나를 고쳐라.).

이상한 것. url2에 액세스 할 수 있기 전에 내 브라우저에서 url1을로드해야하는 것으로 보입니다. (같은 날인지, 아니면 시간인지는 모르겠습니다. url2가 오늘 나에게 효과가 없었으며 어제 않았다.) url1에 액세스 한 후에 만 다시 작동 했나요? ...). URL2보다 먼저 url1에 액세스하지 않으면 "결과가 없습니다" 브라우저에서 내 CSV 파일 대신. 아무도 여기서 무슨 일이 일어나는 지 알아?

그러나 내 주요 문제는 내가 파이썬에서 CSV 파일을 저장할 수 없다는 것입니다. 패키지 urllib, urllib2 요청을 사용해 보았습니다. 작동시키지 못했습니다. 내가 이해하고있는 것은 요청 패키지가 리디렉션을 처리해야하지만 제대로 작동하지 못했습니다. 다음 웹 페이지에서

솔루션은 나를 위해 일을 나타나지 않습니다 (또는 내가 엉망입니다) :

stackoverflow.com/questions/7603044/how-to-download-a-file-returned-을 간접적으로-에서-HTML 양식 - 제출 PYT

stackoverflow.com/questions/9419162/python-download-returned-zip-file-from-url

techniqal.com/blog/2008/07/ 31/python-file-read-write-urllib2/

제가 시도한 것들 중 일부는 다음과 같습니다 :

import urllib2 
import csv 
import sys 

url = 'http://dna.korea.ac.kr/vhot/download.php?mirname=hbv-miR-B2RC&species_filter=species_id+%3D+9606&set=or&gene_filter=&method=targetscan&m_th=-5&rh_th=-10&ts_th=0&mt_th=7.3&pt_th=-10&targetscan=on&miranda=&rnahybrid=&microt=&pita=' 

#1 
u = urllib2.urlopen(url) 
localFile = open('file.csv', 'w') 
localFile.write(u.read()) 
localFile.close() 

#2 
req = urllib2.Request(url) 
res = urllib2.urlopen(req) 
finalurl = res.geturl() 
pass 
# finalurl = 'http://dna.korea.ac.kr/vhot/download.php?mirname=hbv-miR-B2RC&species_filter=species_id+%3D+9606&set=or&gene_filter=&method=targetscan&m_th=-5&rh_th=-10&ts_th=0&mt_th=7.3&pt_th=-10&targetscan=on&miranda=&rnahybrid=&microt=&pita=' 

#3 
import requests 
r = requests.get(url) 
r.content 
pass 
#r.content = "< s c r i p t > location.replace('download_send.php?name=qgN9Th&type=targetscan'); </s c r i p t >" 

#4 
import requests 
r = requests.get(url, 
allow_redirects=True, 
data={'download_open': 'Download', 'format_open': '.csv'}) 
print r.content 
# r.content = " 

#5 
import urllib 
test1 = urllib.urlretrieve(url, "test.csv") 
test2 = urllib.urlopen(url) 
pass 

# 2, # 3 및 # 4의 경우 코드 뒤에 출력이 표시됩니다. # 1과 # 5에 대해 저는 그냥.csv 파일 </script>'

옵션 3은 내가 생각하기에 새로운 리디렉션을 제공합니다.이 기능이 도움이 될 수 있습니까?

아무도 내 문제를 도와 줄 수 있습니까?

답변

3

페이지가 HTTP Redirect으로 전송되지 않고 대신 JavaScript를 통해 리디렉션됩니다. urllibrequests은 자바 스크립트를 처리하지 않으므로 다운로드 URL을 따라갈 수 없습니다. 최종 다운로드 URL을 직접 추출한 다음 방법 중 하나를 사용하여 열어야합니다.

당신은 ch3ka의 응답을 바탕으로 r'location.replace\((.*?)\)'

+0

r'location.replace의 \ '에 대한 설명 ((. *?) \)''' –

+1

을 도움이 될 것이다. *'어떤 문자와 일치는'?'그것'비 greedy'하게, 그래서 그룹은 안쪽 괄호로 구분되며'location.replace'의 인수 괄호 안에있는 어떤 것과도 일치합니다 - 자바 스크립트가 리디렉션되는 URL 일 것입니다. – ch3ka

0

같은 정규식으로 re 모듈을 사용하여 URL을 추출 할 수있다, 나는 그것이 작동하는 거 같아요. 소스 코드에서 Java 리디렉션을 얻었고이 리디렉션에서 데이터를 가져올 수 있습니다.

#Find source code 
redirect = requests.get(url).content 

#Search for the java redirect (find it in the source code) 
# --> based on answer ch3ka 
m = re.search(r"location.replace\(\'(.*?)\'\)", redirect).group(1) 

# Now you need to create url from this redirect, and using this url get the data 
data = requests.get(new_url).content 
관련 문제