【问题标题】:Python Download file with Pandas / Urllib使用 Pandas / Urllib 的 Python 下载文件
【发布时间】:2017-01-29 08:57:12
【问题描述】:

我正在尝试使用 Python 3.x 下载 CSV 文件 文件路径为:https://www.nseindia.com/content/fo/fo_mktlots.csv

我找到了三种方法来做到这一点。这三种方法中只有一种有效。我想知道为什么或我做错了什么。

  1. 方法一:(不成功)

    import pandas as pd
    
    mytable = pd.read_table("https://www.nseindia.com/content/fo/fo_mktlots.csv",sep=",")
    print(mytable)
    

    但我收到以下错误:

    - HTTPError: HTTP Error 403: Forbidden
    
  2. 方法二:(不成功)

    from urllib.request import Request, urlopen
    
    url='https://www.nseindia.com/content/fo/fo_mktlots.csv'
    
    url_request  = Request(url, headers={'User-Agent': 'Mozilla/5.0'})
    html = urlopen(url_request ).read()
    

    遇到和以前一样的错误:

     - HTTPError: HTTP Error 403: Forbidden
    
  3. 方法三:(成功)

    import requests
    import pandas as pd
    
    url = 'https://www.nseindia.com/content/fo/fo_mktlots.csv'
    
    r = requests.get(url)
    df = pd.read_csv(StringIO(r.text))
    

我还可以使用 Excel VBA 打开文件,如下所示:

Workbooks.Open Filename:="https://www.nseindia.com/content/fo/fo_mktlots.csv"

另外,有没有其他方法可以做到这一点?

【问题讨论】:

  • 使用第二个脚本时,使用wireshark 的嗅探请求指向“加密警报”。也许您必须在发出请求之前深入配置您的套接字。

标签: python python-3.x pandas python-requests urllib


【解决方案1】:

网站试图防止内容抓取。

问题不在于您做错了什么,而更多地在于 Web 服务器的配置方式以及它在各种情况下的行为方式。

但要克服抓取保护,创建定义良好的 http 请求标头,最好的方法是发送一套完整的 http 标头,真正的 Web 浏览器会这样做。

这里它适用于最小集合:

>>> myHeaders = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36', 'Referer': 'https://www.nseindia.com', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'}
>>> url_request  = Request(url, headers=myHeaders)
>>> html = urlopen(url_request ).read()
>>> len(html)
42864
>>> 

您可以将 urllib 传递给 pandas:

>>> import pandas as pd
...
>>> url_request  = Request(url, headers=myHeaders)
>>> data = urlopen(url_request )
>>> my_table = pd.read_table(data)
>>> len(my_table)
187

【讨论】:

  • 谢谢!那行得通。几个月后,当浏览器的版本发生变化时,我是否需要更新“myHeaders”?或者这也取决于 Web 服务器的配置方式?知道如何使用“方法 1”
  • 已编辑:将 urllib 传递给 pandas
  • 能否请您详细说明。我用谷歌搜索了很多关于如何将 urllib 传递给 pandas 的信息。在 pd.read_csv 中也找不到任何参数。对不起我的无知:(
  • docs ... '或任何带有 read() 方法的对象'
  • 哇哦!谢谢,明白了!我不知道“filepath_or_buffer”参数的这个属性。非常感谢您的快速响应。
【解决方案2】:

由于1.2pandas,可以通过将选项作为字典键添加到read_tablestorage_options 参数来调整使用的阅读器。所以通过调用它

import pandas as pd


url = ''
storage_options = {'User-Agent': 'Mozilla/5.0'}
df = pd.read_table(url, storage_options=storage_options)

该库将在请求中包含 User-Agent 标头,因此您不必在外部和调用 read_table 之前进行设置。

【讨论】:

    猜你喜欢
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多