XMLHttpRequest模仿脚本可以在一个网页上运行,但不能在另一个网页上运行

时间:2014-08-16 20:22:00

标签: python json xmlhttprequest

我在Windows 8 64位上使用Python.org版本2.7 64位。我有一些代码可以迭代一系列XHR请求,从网站上下载足总杯数据。字典'year_tournament_map'中的每个值代表每个赛季的足总杯的ID代码,这些代码将依次进行解析。

以下代码如下:

import json
import requests
import time

from datetime import date, timedelta

year_tournament_map = {
    2013: 8273,
    2012: 6978,
    2011: 5861,
    2010: 4940,
    2009: 3419,
    2008: 2689,
    2007: 2175,
    2006: 1645,
    2005: 1291,
    2004: 903,
    2003: 579,
    2002: 421,
    2001: 243,
    2000: 114,
    1999: 26,
}

years = sorted(year_tournament_map.keys())
url = 'http://www.whoscored.com/tournamentsfeed/%s/Fixtures/'
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36'}

for year in years:
    start_date = date(year, 11, 1)
    end_date = date(year + 1, 5, 31)
    delta = end_date - start_date

    for days  in range(delta.days + 1):
        time.sleep(0.5) 

        test_date = start_date + timedelta(days=days)

        params = {'d': str(test_date).replace('-', ''), 'isAggregate': 'false'}
        response = requests.get(url % year_tournament_map[year], params=params, headers=headers)

        try:
            json_data = response.content.replace("'", '"').replace(',,', ',null,')
            fixtures = json.loads(json_data)

        except ValueError:
            print "Error!!!"

        else:

            if fixtures:  # If there are fixtures
                print ",\n".join([", ".join(str(x) for x in fixture) for fixture in fixtures])  # `fixtures` is a nested list

            else:
               print "No Fixtures Today: %s" %  test_date

这很有效,所以我决定尝试在其他比赛中使用这种方法,例如英超联赛。我用以下字典替换了上面的字典,其中包含英超联赛的ID代码而不是足总杯:

year_tournament_map = {
 1999: 2,
 2000: 85,
 2001: 191,
 2002: 299,
 2003: 429,
 2004: 594,
 2005: 836,
 2006: 667,
 2007: 1256,
 2008: 1539,
 2009: 1849,
 2010: 2458,
 2011: 2935,
 2012: 3389,
 2013: 3853,
 2014: 4311, }

然而,当运行时,这不会按预期工作。第二季制作国际赛场,以及芬兰联赛或杯赛的第四个赛季。然后它会出现错误,说我正在尝试打印以屏蔽无ASCII / Unicode字符。

我被告知使用我的浏览器开发工具可以观察到项目“url ='http://www.whoscored.com/tournamentsfeed/%s/Fixtures/'”,但我无法找到它。

我想知道的是:

1)我是否在英超联赛数据中使用了正确的XHR网址 2)在sourcve代码中可以找到对上述URL的引用 3)为什么我的代码返回与我正在浏览的页面here相关的不相关/不正确的数据。

由于

1 个答案:

答案 0 :(得分:0)

一旦我掌握了谷歌Chrome开发工具,我们最终解决了这个问题。在'控制台' Dev工具的选项卡,如果右键单击,您将获得打开XMLHTTPRequests的选项。完成此操作后,当您更改日历上的日期时,您会看到XHR提交到' tournamentsdfeed'。由于某些原因,在英超联赛数据中,数字季节标识符与页面顶部地址栏中显示的数字季节标识符不同。凭借足总杯数据,情况并非如此。

用于此的词典应为:

year_tournament_map = {
 1999: 2,
 2000: 89,
 2001: 213,
 2002: 359,
 2003: 542,
 2004: 803,
 2005: 1208,
 2006: 937,
 2007: 2025,
 2008: 2539,
 2009: 3115,
 2010: 4345,
 2011: 5476,
 2012: 6531,
 2013: 7794,
 2014: 9155, }

由于