【问题标题】:Pandas read_csv from URL and include request headerPandas 从 URL 读取_csv 并包含请求标头
【发布时间】:2019-09-06 17:35:19
【问题描述】:

从 Pandas 0.19.2 开始,函数 read_csv() 可以传递 URL。例如,从这个answer:

import pandas as pd

url="https://raw.githubusercontent.com/cs109/2014_data/master/countries.csv"
c=pd.read_csv(url)

我想使用的网址是:https://moz.com/top500/domains/csv

使用上面的代码,这个URL返回一个错误:

urllib2.HTTPError: HTTP Error 403: Forbidden

基于this post,我可以通过传递请求头来获得有效的响应:

import urllib2,cookielib

site= "https://moz.com/top500/domains/csv"
hdr = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
       'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
       'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
       'Accept-Encoding': 'none',
       'Accept-Language': 'en-US,en;q=0.8',
       'Connection': 'keep-alive'}

req = urllib2.Request(site, headers=hdr)

try:
    page = urllib2.urlopen(req)
except urllib2.HTTPError, e:
    print (e.fp.read())

content = page.read()
print (content)

有什么方法可以使用 Pandas read_csv() 的 web URL 功能,同时还传递一个请求标头使请求通过?

【问题讨论】:

    标签: python pandas http-headers python-requests


    【解决方案1】:

    我建议您使用requests 和io 库来完成您的任务。以下代码应该可以完成这项工作:

    import pandas as pd
    import requests
    from io import StringIO
    
    url = "https://moz.com:443/top500/domains/csv"
    headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:66.0) Gecko/20100101 Firefox/66.0"}
    req = requests.get(url, headers=headers)
    data = StringIO(req.text)
    
    df = pd.read_csv(data)
    print(df)
    

    (如果要添加自定义标题只需修改headers 变量)

    希望对你有帮助

    【讨论】:

    • 谢谢 - 我之前不知道 IO 包。如果可能的话,您能否解释将req.text 放入StringIO 与直接使用df = pd.read_csv(url) 之类的pandas 读取url 的优势-实际上我看到您编辑了问题以反映新的pandas 版本-您认为这是更多有效的方法?
    • @thesimplevoodoo 嘿,我在这里使用 StringIO 的原因是 pd.read_csv() 期待一个文件路径,所以给它 url 或任何其他字符串,包括 (req.text) 会产生错误.通过拥有data = StringIO(req.text),我可以使用data 作为文件路径(请注意,StringIO 不会创建任何实际文件,但让您有机会将字符串作为文件读取和写入)
    • 这是一个不错的解决方案,尽管它可能不应该被接受。它没有回答 OP 的问题:“有什么方法可以使用 Pandas read_csv() 的 Web URL 功能,而且还传递一个请求标头以使请求通过?”我个人对这个问题更感兴趣,因为它与read_csv 和潜在的标头使用有关。
    猜你喜欢
    • 2020-05-06
    • 1970-01-01
    • 2016-03-04
    • 1970-01-01
    • 2021-10-07
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多