Python-从带有链接的网页下载CSV文件

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

我正试图通过python脚本从下载CSV文件

但当我试图通过浏览器中的链接直接访问CSV文件时,会显示一个协议表单。在我被允许下载文件之前,我必须同意这份表格

无法检索到csv文件的确切URL。它是一个发送到后端数据库的值,用于获取文件-例如
PERIOD\u ID=2013-0

我尝试了
urlib2.open()
urlib2.read()
,但它会导致协议表单的html内容,而不是文件内容


如何编写python代码来处理此重定向,然后获取CSV文件并将其保存到磁盘上?

您需要设置
ASP.NET_SessionId
cookie。您可以在上下文菜单中使用Chrome的Inspect元素选项,或者使用Firefox和扩展名来找到它

铬合金:

  • 右键单击网页(在您同意条款后)并选择Inspect element
  • 单击资源->Cookies
  • 选择列表中的唯一元素
  • 复制
    ASP.NET\u SessionId
    元素的值
  • 与Firebug:

  • 右键单击网页(在您同意条款后),然后单击*Inspect Element with Firebug
  • 单击Cookies
  • 复制
    ASP.NET\u SessionId
    元素的值
  • 在我的例子中,我得到了
    ihbjynwfcfvq4nzkncbviou
    -它可能对您有用,如果您不需要执行上述过程的话

    将cookie添加到您的请求中,并使用
    请求
    模块下载文件(基于by):


    您需要设置
    ASP.NET_SessionId
    cookie。您可以在上下文菜单中使用Chrome的Inspect元素选项,或者使用Firefox和扩展名来找到它

    铬合金:

  • 右键单击网页(在您同意条款后)并选择Inspect element
  • 单击资源->Cookies
  • 选择列表中的唯一元素
  • 复制
    ASP.NET\u SessionId
    元素的值
  • 与Firebug:

  • 右键单击网页(在您同意条款后),然后单击*Inspect Element with Firebug
  • 单击Cookies
  • 复制
    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()