Javascript 有没有办法使用Python从“网站按钮点击”下载csv文件?

Javascript 有没有办法使用Python从“网站按钮点击”下载csv文件?,javascript,python,url,Javascript,Python,Url,我想从此网站自动下载CSV文件Projects.CSV: https://www.vcsprojectdatabase.org//projects/st_/c_/ss_0/so_/di_/np_ 可以通过单击CSV图标手动下载CSV,但我不确定如何在python中自动下载并将CSV文件本地存储在我的驱动器上 到目前为止,我已经尝试通过chrome开发者控制台检查按钮元素,以便在网络选项卡中找到正确的url,就像这样 https://www.vcsprojectdatabase.org/servi

我想从此网站自动下载CSV文件Projects.CSV:

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

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

到目前为止,我已经尝试通过chrome开发者控制台检查按钮元素,以便在网络选项卡中找到正确的url,就像这样

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文件?

请求类型为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)

请求类型是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)

首先,您应该了解HTTP协议的基础。JavaScript执行的最终结果将形成HTTP请求,让服务器用文件内容响应。您需要反转网页,找到如何创建正确的请求,并尽可能重复它

那么,让我们试着一步一步地做:

在执行下载的元素上单击鼠标右键,然后按Inspect element 在源代码中,您可以看到该元素执行的JavaScript函数的名称 在控制台中键入不带括号的函数名,然后单击应出现在控制台附近的按钮返回此按钮将在源代码中打开此JavaScript函数 在源代码中,我们看到函数在id为frmDownload的HTML元素上执行submit。所以,返回到Inspector选项卡并在搜索框中键入此id。 现在我们发现这个元素是HTML。此表单将请求发送到URLhttps://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包含正确的结果

但这还不是全部。通常情况下,一切都不是那么容易。为了让我们的请求看起来与浏览器发送的请求相同,我们应该查看。要从浏览器捕获HTTP请求,我们可以打开“网络”选项卡:

现在,让我们按下网页上的下载按钮并下载csv文件。在请求表中,现在我们可以看到我们的post请求。单击它,并查看“标题”选项卡上的“请求标题”部分

有一个标题,它主要在一些情况下,比如请求,并不重要,可能会被忽略。但若您对请求有一些问题,您应该查看以前的请求,在服务器响应中找到带有Set Cookie头的请求并重复它

让我们改进脚本并复制重要的主机、内容长度、我们不包括的连接,因为Python请求模块将自动添加它们;DNT和升级不安全请求在浏览器的所有头上都不是必需的

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)

另外,别忘了向网站所有者请求许可首先,你应该了解HTTP协议基于。JavaScript执行的最终结果将形成HTTP请求,让服务器用文件内容响应。您需要反转网页,找到如何创建正确的请求,并尽可能重复它

那么,让我们试着一步一步地做:

在执行下载的元素上单击鼠标右键,然后按Inspect element 在源代码中,您可以看到该元素执行的JavaScript函数的名称 在控制台中键入不带括号的函数名,然后单击应出现在控制台附近的按钮返回此按钮将在源代码中打开此JavaScript函数 在源代码中,我们看到函数在id为frmDownload的HTML元素上执行submit。所以,返回到Inspector选项卡并在搜索框中键入此id。 现在我们发现这个元素是HTML。此表单将请求发送到URLhttps://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包含正确的结果

但这还不是全部。通常情况下,一切都不是那么容易。为了让我们的请求看起来与浏览器发送的请求相同,我们应该查看。要从浏览器捕获HTTP请求,我们可以打开“网络”选项卡:

现在让我们来看看p 网页上的ress下载按钮和下载csv文件。在请求表中,现在我们可以看到我们的post请求。单击它,并查看“标题”选项卡上的“请求标题”部分

有一个标题,它主要在一些情况下,比如请求,并不重要,可能会被忽略。但若您对请求有一些问题,您应该查看以前的请求,在服务器响应中找到带有Set Cookie头的请求并重复它

让我们改进脚本并复制重要的主机、内容长度、我们不包括的连接,因为Python请求模块将自动添加它们;DNT和升级不安全请求在浏览器的所有头上都不是必需的

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)

另外,别忘了向网站所有者申请许可。在POST请求中以GET请求参数发送数据是非常糟糕的做法。是的,它可以在这个请求中工作,但是你肯定很快就会遇到问题。在POST请求中以get请求参数的形式发送数据是非常糟糕的做法。是的,它在这个请求中起作用,但是你肯定会很快遇到问题。非常感谢!这非常有效,你的逐步过程也帮助我更好地理解它。我现在需要去提高我的JavaScript知识@JackDoyle,如果需要,请随时问我。顺便说一句,如果你觉得我的答案有用的话,我会告诉你。@OlvinRoght-如果你能帮我解决类似的问题,我会非常感激你的回答。非常感谢!这非常有效,你的逐步过程也帮助我更好地理解它。我现在需要去提高我的JavaScript知识@JackDoyle,如果需要,请随时问我。顺便说一句,如果你觉得我的答案有用的话,我会告诉你。@OlvinRoght-如果你能帮我解决类似的问题,我会非常感激你的回答。