2012-04-23 16 views
3

私は、私のような問題について議論するいくつかのトピックがあることを知っていると言い始めるが、提案された解決策は何らかの理由で。 また、スクリプトを使用してインターネットからファイルをダウンロードするのも初めてです。今まで私はMatlabの代わりに(numpy/scipyを使って)Pythonを使っていました。だから私が愚かな間違いをするなら、私と一緒に裸をしてください。PythonでWebから.csvファイルをダウンロードする(リダイレクト付き)

私の目標: インターネットデータベース(http://dna.korea.ac.kr/vhot/)から多数の.csvファイルを自動的にpythonを使用してダウンロードしたいと考えています。私が手作業で必要とする1000以上のcsvファイルをダウンロードするのはあまりにも面倒なので、これを実行したいと思います。データベースは、ドロップダウンメニューから複数のオプションを選択して最終的にいくつかの手順を経て.csvファイルへのリンクを作成するUIを使用してのみアクセスできます。 ドロップダウンメニューに記入して「検索」を押すと、ドロップダウンメニューのすべてのパラメータが表示されます。つまり、ドロップダウンメニューを使用する代わりにそれらを変更することができます。

このウェブサイトのURL例にされ(URL1それを呼び出すことができます):このページで 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に私を指示します。

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は今日私のために働かなかったし、昨日でした。それは再び働いた...)。私がurl2の前にurl1にアクセスしないと、私のブラウザからの私のcsvファイルの代わりに "no results"が得られます。誰がここで何が起こっているのか知っていますか?

しかし、私の主な問題は、私はPythonからCSVファイルを保存することができないということです。 私はパッケージを使用しようとしました urllib、urllib2要求私はそれを動作させることはできません。 リクエストパッケージはリダイレクトを処理する必要がありますが、動作させることができませんでした。

次のWebページからのソリューションが私のために動作するように表示されない(または私はめちゃくちゃにしています):

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-with-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のために私はちょうどaを得る。csvファイル</script>'

オプション3は私に新しいリダイレクトを与えてくれると思いますが、これは私を助けますか?

誰かが私の問題を助けることができますか?

答えて

3

ページはHTTP Redirectを送信せず、代わりにJavaScript経由でリダイレクトされます。 urllibrequestsはjavascriptを処理しないので、ダウンロードURLに従うことはできません。 最終的なダウンロードURLを自分で抽出してから、いずれかの方法で開く必要があります。あなたはch3kaからの応答に基づいてr'location.replace\((.*?)\)'

+0

'r'location.replace \の説明((。*?)\) '' ' –

+1

に役立つだろうが。*' '、任意の文字に一致?' 'それ以外greedy'なりますので、グループは内側のかっこで区切られ、 'location.replace'の引数カッコ内のものと一致します。これは、javascriptの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 
関連する問題