有没有办法使用Python从“网站按钮点击”下载CSV文件? [英] Is there any way to download csv file from “website button click” using Python?

查看:29
本文介绍了有没有办法使用Python从“网站按钮点击”下载CSV文件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想自动从以下网站下载CSV文件"Projects.csv"

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

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

到目前为止,我已经尝试通过Chrome开发人员控制台检查按钮元素,以便在Network选项卡中找到正确的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文件?

首先,您应该了解基于requests推荐答案协议。脚本执行的最终结果将形成HTTP请求,该请求让服务器使用文件内容进行响应。您需要"反转"网页,找出如何创建正确的请求,并尽可能地重复它。

因此,让我们尝试一步一步地完成此操作:

  1. 在执行下载的元素上单击鼠标右键并按"检查元素"
  2. 在源代码中,您可以看到此元素执行的JavaScript函数的名称
  3. 在控制台中输入函数的名称,不带括号,然后单击应该出现在控制台返回旁边的按钮(该按钮将在源代码中打开此JavaScript函数)
  4. 在源代码中,我们可以看到该函数对ID为frmDownloadHTML元素执行提交。所以,回到"Inspector"选项卡,在搜索框中输入这个id。
  5. 现在我们发现这个元素是HTMLform。此表单将POST请求发送到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包含正确的结果。

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

现在,让我们按网页上的下载按钮,下载CSV文件。在请求表中,我们现在可以看到我们的POST请求。点击并查看"Headers"选项卡中的"RequestHeader"部分。

Cookie头,在这样的请求中,它大多不重要,可能会被忽略。但如果您对请求有一些问题,您应该查看之前的请求,在服务器响应中找到带有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)

P.S.不要忘记向网站所有者请求权限😉

这篇关于有没有办法使用Python从“网站按钮点击”下载CSV文件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆