【问题标题】:Python access server urlopen() [closed]Python访问服务器urlopen()[关闭]
【发布时间】:2013-05-19 15:13:39
【问题描述】:

我想使用以下代码访问存储在站点中的数据:

import urllib
import re
import json

htmltext = urllib.urlopen("http://www.cmegroup.com/CmeWS/mvc/ProductSlate/V1/List/500/1?sortField=oi&sortAsc=false&venues=3&page=1&cleared=1&group=1&r=eSxQS2SI").read()

print htmltext

#data = json.load(htmltext)

我收到回复:

You don't have permission to access "http&#58;&#47;&#47;www&#46;cmegroup&#46;com&#47;CmeWS&#47;mvc&#47;ProductSlate&#47;V1&#47;List&#47;500&#47;1&#63;" on this server.<P>

有没有办法访问这些信息,或者有没有其他方法可以从提供的链接中提取信息?

【问题讨论】:

    标签: python url web


    【解决方案1】:

    由于可以从浏览器访问链接,因此服务器似乎不允许纯 HTML 请求(没有 User-Agent 标头)。我们可以使用urllib2模拟这样的请求

    import urllib2
    
    url = "http://www.cmegroup.com/CmeWS/mvc/ProductSlate/V1/List/500/1?sortField=oi&sortAsc=false&venues=3&page=1&cleared=1&group=1&r=eSxQS2SI"
    user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
    headers = { 'User-Agent' : user_agent }
    
    req = urllib2.Request(url, headers=headers)
    
    response = urllib2.urlopen(req)
    
    your_json = response.read()
    response.close()
    

    【讨论】:

    • 感谢工作就像一个魅力
    【解决方案2】:

    网络服务器似乎阻止了基于用户代理的请求。

    使用不同的 http 用户代理就可以了。

    此外,您应该使用 Python 的“请求”模块,为您提供更灵活的 控制您的请求数据。

    wget -U Mozilla "http://www.cmegroup.com/CmeWS/mvc/ProductSlate/V1/List/500/1?sortField=oi&sortAsc=false&venues=3&page=1&cleared=1&group=1&r=eSxQS2SI"
    
    --2013-05-19 17:24:54--  http://www.cmegroup.com/CmeWS/mvc/ProductSlate/V1/List/500/1?sortField=oi&sortAsc=false&venues=3&page=1&cleared=1&group=1&r=eSxQS2SI
    Resolving www.cmegroup.com (www.cmegroup.com)... 23.45.237.124
    Connecting to www.cmegroup.com (www.cmegroup.com)|23.45.237.124|:80... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 17349 (17K) [application/json]
    Saving to: ‘1?sortField=oi&sortAsc=false&venues=3&page=1&cleared=1&group=1&r=eSxQS2SI’
    

    【讨论】:

    • 所以 -U 标志会将其设置为用户代理?
    【解决方案3】:

    我也在使用 liburl2 来解决这个问题,这是我最终得到的答案,在能够在 chrome 中加载页面后,我意识到这是基于正在发送的标头的服务器阻塞,所以我想出了这个:

    import urllib2
    import re
    import json
    
    opener = urllib2.build_opener()
    opener.addheaders = [('User-agent', 'Mozilla/5.0')]
    response = opener.open('http://www.cmegroup.com/CmeWS/mvc/ProductSlate/V1/List/500/1?sortField=oi&sortAsc=false&venues=3&page=1&cleared=1&group=1&r=eSxQS2SI')
    data = json.load(response)
    print data
    

    这就像一种享受。

    【讨论】:

      猜你喜欢
      • 2011-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-26
      • 2012-01-11
      • 2014-08-19
      相关资源
      最近更新 更多