Python-从带有链接的网页下载CSV文件
我正试图通过python脚本从下载CSV文件 但当我试图通过浏览器中的链接直接访问CSV文件时,会显示一个协议表单。在我被允许下载文件之前,我必须同意这份表格 无法检索到csv文件的确切URL。它是一个发送到后端数据库的值,用于获取文件-例如Python-从带有链接的网页下载CSV文件,python,csv,web,download,session-cookies,Python,Csv,Web,Download,Session Cookies,我正试图通过python脚本从下载CSV文件 但当我试图通过浏览器中的链接直接访问CSV文件时,会显示一个协议表单。在我被允许下载文件之前,我必须同意这份表格 无法检索到csv文件的确切URL。它是一个发送到后端数据库的值,用于获取文件-例如PERIOD\u ID=2013-0: 我尝试了urlib2.open()和urlib2.read(),但它会导致协议表单的html内容,而不是文件内容 如何编写python代码来处理此重定向,然后获取CSV文件并将其保存到磁盘上?您需要设置ASP.NET
PERIOD\u ID=2013-0
:
我尝试了urlib2.open()
和urlib2.read()
,但它会导致协议表单的html内容,而不是文件内容
如何编写python代码来处理此重定向,然后获取CSV文件并将其保存到磁盘上?您需要设置
ASP.NET_SessionId
cookie。您可以在上下文菜单中使用Chrome的Inspect元素选项,或者使用Firefox和扩展名来找到它
铬合金:
ASP.NET\u SessionId
元素的值ASP.NET\u SessionId
元素的值ihbjynwfcfvq4nzkncbviou
-它可能对您有用,如果您不需要执行上述过程的话
将cookie添加到您的请求中,并使用请求
模块下载文件(基于by):
您需要设置
ASP.NET_SessionId
cookie。您可以在上下文菜单中使用Chrome的Inspect元素选项,或者使用Firefox和扩展名来找到它
铬合金:
ASP.NET\u SessionId
元素的值ASP.NET\u SessionId
元素的值ihbjynwfcfvq4nzkncbviou
-它可能对您有用,如果您不需要执行上述过程的话
将cookie添加到您的请求中,并使用请求
模块下载文件(基于by):
我的建议是,自动应用服务器cookie,基本上模仿标准的客户端会话行为 (无耻地受到@pope回答的启发。) 祝你好运 [编辑]
关于原因,我认为@Steinar Lima要求会话cookie是正确的。尽管除非您已经访问了
协议.aspx
页面并通过提供商网站提交了响应,否则您从浏览器的web inspector复制的cookie只会导致另一个重定向到PA DEP油气报告网站欢迎页面。这当然消除了让Python脚本为您完成任务的全部意义。我的建议是,自动应用服务器cookie,基本上模仿标准的客户端会话行为
(无耻地受到@pope回答的启发。)
祝你好运
[编辑]
关于原因,我认为@Steinar Lima要求会话cookie是正确的。尽管除非您已经访问了
协议.aspx
页面并通过提供商网站提交了响应,否则您从浏览器的web inspector复制的cookie只会导致另一个重定向到PA DEP油气报告网站欢迎页面。这当然消除了让Python脚本为您完成任务的全部意义。这是一个不错的解决方案!当会话超时时,无需访问站点,这确实有效。谢谢!完美的冰溶液!当会话超时时,无需访问站点,这确实有效。谢谢!工作完美设置ASP cookie检索页面HTML内容,而不是CSV下载输出。@user3602491这确实有效,但您可能需要找到自己的cookie值。我自己也尝试过,csv下载没有任何麻烦。设置ASP cookie将检索页面HTML内容,而不是csv下载输出。@user3602491这确实有效,但您可能需要找到自己的cookie值。我自己也试过了,csv下载得很顺利。
import requests
cookies = {'ASP.NET_SessionId': 'ihbjzynwfcfvq4nzkncbviou'}
r = requests.get(
url=('https://www.paoilandgasreporting.state.pa.us/publicreports/Modules/'
'DataExports/ExportProductionData.aspx?PERIOD_ID=2013-0'),
cookies=cookies
)
with open('2013-0.csv', 'wb') as ofile:
for chunk in r.iter_content(chunk_size=1024):
ofile.write(chunk)
ofile.flush()
import urllib2
import urllib
from lxml import etree
_TARGET_URL = 'https://www.paoilandgasreporting.state.pa.us/publicreports/Modules/DataExports/ExportProductionData.aspx?PERIOD_ID=2013-0'
_AGREEMENT_URL = 'https://www.paoilandgasreporting.state.pa.us/publicreports/Modules/Welcome/Agreement.aspx'
_CSV_OUTPUT = 'urllib2_ProdExport2013-0.csv'
class _MyHTTPRedirectHandler(urllib2.HTTPRedirectHandler):
def http_error_302(self, req, fp, code, msg, headers):
print 'Follow redirect...' # Any cookie manipulation in-between redirects should be implemented here.
return urllib2.HTTPRedirectHandler.http_error_302(self, req, fp, code, msg, headers)
http_error_301 = http_error_303 = http_error_307 = http_error_302
cookie_processor = urllib2.HTTPCookieProcessor()
opener = urllib2.build_opener(_MyHTTPRedirectHandler, cookie_processor)
urllib2.install_opener(opener)
response_html = urllib2.urlopen(_TARGET_URL).read()
print 'Cookies collected:', cookie_processor.cookiejar
page_node, submit_form = etree.HTML(response_html), {} # ElementTree node + dict for storing hidden input fields.
for input_name in ['ctl00$MainContent$AgreeButton', '__EVENTVALIDATION', '__VIEWSTATE']: # Form `input` fields used on the ``Agreement.aspx`` page.
submit_form[input_name] = page_node.xpath('//input[@name="%s"][1]' % input_name)[0].attrib['value']
print 'Form input \'%s\' found (value: \'%s\')' % (input_name, submit_form[input_name])
# Submits the agreement form back to ``_AGREEMENT_URL``, which redirects to the CSV download at ``_TARGET_URL``.
csv_output = opener.open(_AGREEMENT_URL, data=urllib.urlencode(submit_form)).read()
print csv_output
with file(_CSV_OUTPUT, 'wb') as f: # Dumps the CSV output to ``_CSV_OUTPUT``.
f.write(csv_output)
f.close()