用python从web下载.csv文件(带有重定向)

2024-06-17 19:04:04 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我的目标: 我想用python从internet数据库(http://dna.korea.ac.kr/vhot/)自动下载很多.csv文件。我想这样做是因为下载1000+csv文件太麻烦了,我需要手动下载。只能使用用户界面访问数据库,在该界面中,您必须从下拉菜单中选择多个选项,才能在经过一些步骤后最终链接到.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文件,其中一个示例将指向以下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文件,而是一个“重定向”(对我来说是一个新的术语,我通过googleling找到,所以如果我错了,请纠正我)。

有件奇怪的事。我似乎必须先在浏览器中加载url1,然后才能访问url2(我不知道必须是同一天还是同一小时)。url2今天对我不起作用,昨天也起作用了。只有在访问url1之后,它才再次工作。如果在url2之前不访问url1,我将从浏览器中获取“no results”,而不是csv文件。有人知道这是怎么回事吗?

但是,我的主要问题是无法从python保存csv文件。 我试过使用包urllib、urllib2请求,但我无法让它工作。 据我所知,请求包应该负责重定向,但我还没能让它工作。

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

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只是给了我一个新的重定向,我想,这能帮到我吗?

有人能帮我解决问题吗?


Tags: 文件csvimporthttpurldownloadurllib2filter
2条回答

根据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

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

您可以使用带有类似于r'location.replace\((.*?)\)'的正则表达式的re模块提取URL

相关问题 更多 >