有什么方法可以使用Python从“网站按钮单击”中下载csv文件吗?

时间:2019-04-30 09:55:57

标签: javascript python url

我想从该网站自动下载CSV文件“ Projects.csv”:

https://www.vcsprojectdatabase.org/#/projects/st_/c_/ss_0/so_/di_/np_

可以通过单击CSV图标手动下载CSV,但是我不确定如何在python中自动执行此下载并将CSV文件本地存储在驱动器中。

到目前为止,我已经尝试通过chrome开发者控制台检查按钮元素,以便在“网络”标签中找到正确的网址,如下所示:

'https://www.vcsprojectdatabase.org/services/publicViewServices/fetchProjectsExport'

但是我不确定此URL是否应在文件末尾包含这样的文件名:

'https://www.vcsprojectdatabase.org/services/publicViewServices/fetchProjectsExport/Projects.csv'

这是我尝试过的方法,但是它只写一个空白文件:


import requests

url = 'https://www.vcsprojectdatabase.org/services/publicViewServices/fetchProjectsExport/Projects.csv'

r = requests.get(url)
with open('a.csv', 'wb') as f:
    f.write(r.content) 

如何获取CSV文件以正确下载并保存?

2 个答案:

答案 0 :(得分:1)

首先,您应该了解基于requests的HTTP协议。 JavaScript执行的最终结果将形成HTTP请求,该请求使服务器以文件内容作为响应。您需要“反转”网页,找到如何创建适当的请求并像执行操作一样重复该请求。

因此,让我们尝试逐步进行此操作:

  1. 在执行下载的元素上单击鼠标右键,然后按“检查元素” enter image description here
  2. 在源代码中,您可以看到此元素执行的JavaScript函数的名称 enter image description here
  3. 在控制台中键入函数名称(不带括号),然后单击应该在控制台返回位置附近出现的按钮(此按钮将在源代码中打开此JavaScript函数) enter image description here
  4. 在源代码中,我们看到函数在ID为frmDownload的HTML元素上执行Submit。因此,返回“检查器”选项卡,然后在搜索框中键入此ID。 enter image description here
  5. 现在,我们发现此元素是HTML form。此表单将POST请求与下一个数据一起发送到URL https://www.vcsprojectdatabase.org/services/publicViewServices/fetchProjectsExport

    searchTerm=
    country=
    sectoral_scope=0
    recentProjects=
    sort=projectId
    dir=DESC
    formatType=csv
    

    此信息足以尝试在Python中重复此请求。

让我们编写一个小的脚本,该脚本形成并发送相同的请求并将结果保存到.csv文件中:

import requests

data = {
    "searchTerm": "",
    "country": "",
    "sectoral_scope": "0",
    "recentProjects": "",
    "sort": "projectId",
    "dir": "DESC",
    "formatType": "csv"
}

file = requests.post("https://www.vcsprojectdatabase.org/services/publicViewServices/fetchProjectsExport", data)

with open("res.csv", "wb+") as f:
    f.write(file.content)

启动它并...起作用。 res.csv包含正确的结果。

还不是全部。通常,一切都不那么容易。为了使我们的请求看起来与浏览器发送的请求相同,我们应该看一下request headers。要从浏览器捕获HTTP请求,我们可以打开“网络”标签:

enter image description here

现在让我们按网页上的下载按钮并下载csv文件。现在,在请求表中,我们可以看到我们的发布请求。单击它,然后在“请求标头”部分的“标头”标签上查看。

enter image description here

Cookie头,大多数情况下,诸如请求之类的头并不重要,可以忽略。但是,如果您对请求有一些问题,则应查看以前的请求,在服务器响应中找到带有Set-Cookie标头的请求,然后重复该请求。

让我们改进脚本并复制重要的(主机,Content-Length,我们不包含的Connection,因为Python请求模块将自动添加它们;根本不需要DNT和Upgrade-Insecure-Requests)< / em>来自浏览器的标头。

import requests

data = {
    "searchTerm": "",
    "country": "",
    "sectoral_scope": "0",
    "recentProjects": "",
    "sort": "projectId",
    "dir": "DESC",
    "formatType": "csv"
}

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Language":  "en-US,en;q=0.5",
    "Accept-Encoding": "gzip, deflate, br",
    "Referer": "https://www.vcsprojectdatabase.org/",
    "Content-Type": "application/x-www-form-urlencoded"
}

file = requests.post("https://www.vcsprojectdatabase.org/services/publicViewServices/fetchProjectsExport", data,
                     headers=headers)

with open("res.csv", "wb+") as f:
    f.write(file.content)

PS (别忘了向网站所有者征求许可)

答案 1 :(得分:-1)

请求类型为POST,您需要指定相应的标头,您可以在开发人员控制台中看到这些标头。另外,您将不提供表单数据。下面的代码有效。

import requests

url = 'https://www.vcsprojectdatabase.org/services/publicViewServices/fetchProjectsExport?searchTerm=&country=&sectoral_scope=0&recentProjects=&sort=projectId&dir=DESC&formatType=csv'
headers = {'Content-Type': 'application/x-www-form-urlencoded','Accept': 'text/csv'}

r = requests.post(url,headers=headers)
with open('a.csv', 'wb') as f:
    f.write(r.content)