3

私と同様の問題について議論しているトピックがいくつかあることは知っていますが、提案された解決策は何らかの理由でうまくいかないようです。また、スクリプトを使用してインターネットからファイルをダウンロードするのは初めてです。これまで、私は主に Python を Matlab の代替として使用してきました (numpy/scipy を使用)。

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

このウェブサイトの 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 ファイルを選択できます。1 つの例では、次の 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=ピタ&m_th=-5&rh_th=-10&ts_th=0&mt_th=7.3&pt_th =99999&targetscan=&miranda=&rnahybrid=µt=&pita=オン

ただし、これにはcsvファイルが直接含まれているわけではありませんが、「リダイレクト」のようです(グーグルで見つけた新しい用語なので、間違っている場合は修正してください)。

1つの奇妙なこと。url2 にアクセスする前に、ブラウザに url1 をロードする必要があるようです (同じ日か同じ時間かはわかりません。今日は url2 が機能せず、昨日は機能しました。url1 にアクセスした後でのみ)それは再び動作しました...)。url2 の前に url1 にアクセスしないと、ブラウザーからの csv ファイルの代わりに「結果がありません」と表示されます。ここで何が起こっているか知っている人はいますか?

ただし、私の主な問題は、python から csv ファイルを保存できないことです。パッケージurllib、urllib2requestを使用してみましたが、動作しません。私が理解していることから、Requestsパッケージはリダイレクトを処理する必要がありますが、機能させることができませんでした。

次の Web ページの解決策は、私にはうまくいかないようです (または、めちゃくちゃです)。

stackoverflow.com/questions/7603044/how-to-download-a-file-returned-indirectly-from-html-form-submission-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については、.csvファイルを取得するだけです</script>'

オプション #3 は新しいリダイレクトを提供するだけだと思いますが、これは役に立ちますか?

誰でも私の問題を解決できますか?

4

2 に答える 2

4

ページは を送信せずHTTP Redirect、代わりに JavaScript を介してリダイレクトが行われます。 urllibJavaScript を処理しrequestsないため、ダウンロード URL をたどることができません。最終的なダウンロード URL を自分で抽出し、いずれかの方法で開く必要があります。

re次のような正規表現を使用してモジュールを使用して URL を抽出できます。r'location.replace\((.*?)\)'

于 2012-04-23T16:21:44.243 に答える
1

ch3kaからの回答から、うまくいったと思います。ソースコードから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
于 2012-04-25T07:34:49.753 に答える