繁体   English   中英

使用日期范围遍历一系列带日期戳的XHR请求

[英]Using range of dates to iterate through series of date stamped XHR requests

我在Windows Vista 64位上使用Python.org版本2.7 64位。 我有一些代码是我在这里提出的问题的答案的发展:

使用Scrapy抓取时无法在源代码中找到显示的数据

我对此答案的开发是遍历一个范围内的一系列日期,并获取每个日期对应的我要的数据(想法是,如果该日期没有数据,则将返回空白)。

代码如下:

from datetime import date, timedelta as td
from ast import literal_eval
from datetime import datetime
import requests

d1 = date(2013,11,01)
d2 = date(2014,5,31)

delta = d2 - d1


for i in range(delta.days + 1):
    time1 =  str(d1 + td(days=i))
    time2 = time1.split("-", 1)[0]
    time3 = time1.split("-", -1)[1]
    time4 = time1.rsplit("-", 1)[-1]

    time2 = int(time2)
    time3 = int(time3)
    time4 = int(time4)

    date = datetime(year=time2, month=time3, day=time4)
    print date

    url = 'http://www.whoscored.com/tournamentsfeed/8273/Fixtures/'

    params = {'d': date.strftime('%Y%m'), 'isAggregate': 'false'}
    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'}

    response = requests.get(url, params=params, headers=headers)

    fixtures = literal_eval(response.content)
    print fixtures

该代码不是给我每天的固定装置,而是给我该日期所在的整个月的固定装置。

然后,代码在迭代过程中继续落入随机点,并引发以下错误:

Traceback (most recent call last):
  File "C:\Python27\newtets\newtets\spiders\test3.py", line 32, in <module>
    fixtures = literal_eval(response.content)
  File "C:\Python27\lib\ast.py", line 49, in literal_eval
    node_or_string = parse(node_or_string, mode='eval')
  File "C:\Python27\lib\ast.py", line 37, in parse
    return compile(expr, filename, mode, PyCF_ONLY_AST)
  File "<unknown>", line 1
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    ^
SyntaxError: invalid syntax

我想知道的是:

1)如果没有固定装置,为什么此代码结构从那天/空开始不返回一个或多个固定装置?

2)此错误的原因是什么,为什么在执行过程中它总是在随机点发生?

谢谢

您可以在使用literal_eval之前检查<!DOCTYPE是否在该行中

fixtures = (response.content)
if not "<!DOCTYPE " in fixtures:
    fixtures = literal_eval(response.content)

使用try/except捕获特定异常可能更好。

您的代码成功完成了,导致错误的唯一几行是包含<!DOCTYPE ,我想这与您尝试执行的操作无关,当打印时为html。

类似于以下内容的东西应该起作用:

try:
    fixtures = literal_eval(response.content)
except SyntaxError:
    pass
print fixtures

输出中有一个有趣的部分:

<h2>403 - Forbidden: Access is denied.</h2>
  <h3>You do not have permission to view this directory or page using the credentials that you supplied.

您必须抓取某些部分,这需要某种形式的自动处理。

您可能还需要过%d这一天:

params = {'d': date.strftime('%Y%m%d'), 'isAggregate': 'false'}

如果您在更改日期仅是年份和月份之前打印参数,我想您希望这些天在月份中获得不同的配置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM