繁体   English   中英

在python中从Web(带重定向)下载.csv文件

[英]Downloading a .csv file from the web (with redirects) in python

首先我要说的是,我知道有一些主题可以讨论与我类似的问题,但建议的解决方案似乎并不适用于某些原因。 此外,我是新手使用脚本从互联网上下载文件。 到目前为止,我主要使用python作为Matlab的替代品(使用numpy / scipy)。

我的目标:我想使用python自动从互联网数据库( http://dna.korea.ac.kr/vhot/ )下载大量.csv文件。 我想这样做是因为下载我需要的1000+ csv文件太麻烦了。 只能使用UI访问数据库,您必须从下拉菜单中选择几个选项,最后在一些步骤后最终得到.csv文件的链接。 我已经知道填写下拉菜单并按“搜索”后得到的网址包含下拉菜单的所有参数。 这意味着我可以更改这些而不是使用下拉菜单,这有很大帮助。

这个网站的一个示例网址是(我们称之为url1 ): url1 = http://dna.korea.ac.kr/vhot/search.php?species=Human&selector=drop&mirname=&mirname_drop=hbv-miR-B2RC&pita=on&set=和&miranda_th = -5 rh_th = -10 ts_th = 0&mt_th = 7.3&pt_th = 99999&基因=

在这个页面上,我可以选择5个csv文件,一个例子将我引导到以下网址:

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 =&米兰达=&rnahybrid =&microt =&皮塔=上

但是,这不直接包含csv文件,但似乎是一个'重定向'(对我而言是一个新术语,我通过googeling发现,如果我错了,请纠正我)。

一件奇怪的事。 在我可以访问url2之前,我似乎必须在我的浏览器中加载url1(我不知道它是否必须是同一天,或者是小时。在今天,url2对我不起作用而且昨天也没有。仅在访问url1之后它再次起作用了......)。 instead of my csv file from my browser. 如果我在url2之前没有访问url1,那么我的浏览器会得到而不是我的csv文件。 有谁知道这里发生了什么?

但是,我的主要问题是我无法从python中保存csv文件。 and but I cannot get it to work. 我已经尝试使用包但我无法让它工作。 package should take care of redirects, but I haven't been able to make it work. 根据我的理解, 包应该处理重定向,但我无法使其工作。

来自以下网页的解决方案似乎对我不起作用(或者我搞砸了):

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,我只获得带有</script>'的.csv文件

选项#3只是给了我一个新的重定向,我想,这可以帮助我吗?

有人能解决我的问题吗?

该页面不发送HTTP Redirect ,而是通过JavaScript完成重定向。 urllibrequests不处理javascript,因此他们无法关注下载URL。 您必须自己提取最终下载URL,然后使用任何方法打开它。

您可以使用re模块提取URL,其中包含r'location.replace\\((.*?)\\)'等正则表达式

基于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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM