Python 使用 Pandas/Urllib 下载文件

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

我正在尝试使用 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"

请问还有其他方法可以做到吗?

最佳答案

该网站试图防止内容抓取。

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

但是要克服抓取保护,创建定义明确的 http 请求 header ,最好的方法是发送一个完整的 HTTP header 集,一个真正的网络浏览器会这样做。

这里它适用于最小集合:

>>> 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

关于Python 使用 Pandas/Urllib 下载文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41919181/

相关文章:

python - 如何对 Pandas 数据框中的不同行求和

python - 如何将 IP 转换为向量值

python - pip 轮和覆盖范围 : command not found error

python - 如何使用 Python 3.3 和 pyserial 向 arduino 发送一个 5 位数字(奇怪的错误)

Python 3 从已排序的大文件中加入数据

python - 为什么这些函数相同,但输出不同的值?

python - 计算 csv 中 "NaN"(不是零或空白)的数量

python - 无法识别 DataFrame 中的列。关键字错误: 'Date'

python - 如何让python将 "YYYY W##"识别为日期时间对象,然后填充添加小于某一周的时间对象

python - Zappa 初始化 -- Flask UnicodeDecodeError : 'charmap' codec can't decode byte 0x81 in position 301: character maps to <undefined>