当带有参数的post请求生效时,无法使用urllib从网站下载csv文件

2024-04-20 06:25:31 发布

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

我正在尝试使用urllib包从网页下载csv文件。要从该站点下载csv文件,必须发送带有适当参数的post请求

当我尝试使用请求模块时,我可以完美地下载文件。但是,当我尝试使用urllib包执行相同操作时,我也会得到一个csv文件,但这次该文件只包含标题。尸体不见了

以下是如何从该站点手动下载该文件:

Site address: https://www.nyiso.com/custom-reports?report=dam_lbmp_zonal
Zones: CAPITL, CENTRL
Version: Latest
Format: CSV
Hit `Generate Report` button

以下脚本仅下载csv文件中的标题:

import csv
import urllib.request
import urllib.parse

link = "http://dss.nyiso.com/dss_oasis/PublicReports"
params = {
    'reportKey': 'DAM_LBMP_ZONE',
    'startDate': '04/17/2021',
    'endDate': '04/17/2021',
    'version': 'L',
    'dataFormat': 'CSV',
    'filter': ['CAPITL','CENTRL'],
}

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36'
}
data = urllib.parse.urlencode(params).encode()
req = urllib.request.Request(link, data=data, headers=headers)
res = urllib.request.urlopen(req)
with open("output.csv","wb") as f:
    f.write(res.read())

How can I download a csv file using urllib package from a website?


Tags: 文件csvimportcom标题data站点parse
1条回答
网友
1楼 · 发布于 2024-04-20 06:25:31

代码中的一个小修改,比如在传递过滤器参数中的列表时,需要在urlencode方法中传递doseq=True,同时传递参数以正确编码数据

请参阅下面的代码以供参考

import urllib.request
import urllib.parse

link = "http://dss.nyiso.com/dss_oasis/PublicReports"
params = {
    'reportKey': 'DAM_LBMP_ZONE',
    'startDate': '04/17/2021',
    'endDate': '04/17/2021',
    'version': 'L',
    'dataFormat': 'CSV',
    'filter': ['CAPITL','CENTRL'],
}

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36'
}
data = urllib.parse.urlencode(params,doseq=True).encode()
req = urllib.request.Request(link, data=data, headers=headers)
res = urllib.request.urlopen(req)
with open("output.csv","wb") as f:
    f.write(res.read())

urlencode行中只需要少量修改

输出: Output

如果您有任何问题,请告诉我:)

相关问题 更多 >