Python 使用 Pandas / Urllib 下载文件
Python Download file with Pandas / Urllib
我正在尝试使用 Python 3.x 下载 CSV 文件
文件的路径为:https://www.nseindia.com/content/fo/fo_mktlots.csv
我找到了三种方法。在这三种方法中,只有一种方法有效。我想知道为什么或我做错了什么。
方法一:(不成功)
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
方法二:(失败)
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
方法三:(成功)
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"
另外,请问还有其他方法可以做到吗?
该网站试图阻止内容抓取。
问题不在于您做错了什么,而在于 Web 服务器的配置方式以及它在各种情况下的行为方式。
但是要克服抓取保护,创建定义良好的 http 请求 headers,最好的方法是发送完整的 http headers 一组真正的网络浏览器。
这里它适用于最小集合:
>>> 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
从 pandas
的 1.2
开始,可以通过将选项作为字典键添加到 read_table
的 storage_options
参数来调整使用的 reader .所以通过
调用它
import pandas as pd
url = ''
storage_options = {'User-Agent': 'Mozilla/5.0'}
df = pd.read_table(url, storage_options=storage_options)
库将在请求中包含 User-Agent
header,因此您不必在调用 read_table
.[=17= 之前在外部进行设置]
我正在尝试使用 Python 3.x 下载 CSV 文件 文件的路径为:https://www.nseindia.com/content/fo/fo_mktlots.csv
我找到了三种方法。在这三种方法中,只有一种方法有效。我想知道为什么或我做错了什么。
方法一:(不成功)
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
方法二:(失败)
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
方法三:(成功)
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"
另外,请问还有其他方法可以做到吗?
该网站试图阻止内容抓取。
问题不在于您做错了什么,而在于 Web 服务器的配置方式以及它在各种情况下的行为方式。
但是要克服抓取保护,创建定义良好的 http 请求 headers,最好的方法是发送完整的 http headers 一组真正的网络浏览器。
这里它适用于最小集合:
>>> 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
从 pandas
的 1.2
开始,可以通过将选项作为字典键添加到 read_table
的 storage_options
参数来调整使用的 reader .所以通过
import pandas as pd
url = ''
storage_options = {'User-Agent': 'Mozilla/5.0'}
df = pd.read_table(url, storage_options=storage_options)
库将在请求中包含 User-Agent
header,因此您不必在调用 read_table
.[=17= 之前在外部进行设置]