【问题标题】:XMLHttpRequest mimicking script works on one web page, but not anotherXMLHttpRequest 模仿脚本适用于一个网页,但不能在另一个网页上运行
【发布时间】:2014-08-16 20:22:00
【问题描述】:

我在 Windows 8 64 位上使用 Python.org 版本 2.7 64 位。我有一些代码可以遍历一系列 XHR 请求,以从网站上下载 FA Cup 数据。字典'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 URL 2)在源代码引用上述URL的地方可以找到 3) 为什么我的代码返回与我正在浏览的页面上的内容无关/不正确的数据here

谢谢

【问题讨论】:

  • 您没有提及您的浏览器,但对于大多数浏览器,F12 会打开工具。
  • @JeremyJStarcher 我很好地找到了开发工具,我只是无法在页面源代码中找到对“锦标赛源”提交的任何地方的引用。我可以看到 Javascript 是日历选择日期的权力所在,但看不到此提交的去向。谢谢。

标签: python json xmlhttprequest


【解决方案1】:

一旦我进一步掌握了 Google Chrome 开发工具,这个问题最终得到了解决。在开发工具的“控制台”选项卡上,如果您右键单击,您将获得一个打开 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, }

谢谢

【讨论】:

    猜你喜欢
    • 2019-03-07
    • 1970-01-01
    • 2023-01-20
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    • 2012-08-22
    • 2012-03-14
    • 1970-01-01
    相关资源
    最近更新 更多