【问题标题】:Using range of dates to iterate through series of date stamped XHR requests使用日期范围遍历一系列带有日期标记的 XHR 请求
【发布时间】:2014-10-04 20:34:00
【问题描述】:

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

Cannot locate displayed data in source code when Scraping with 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) 如果没有固定装置,为什么此代码结构不返回当天的任何一个/或固定装置/null?

2)这个错误的原因是什么,为什么在执行过程中总是随机出现?

谢谢

【问题讨论】:

    标签: python xmlhttprequest scrapy


    【解决方案1】:

    您可以在使用literal_eval之前检查&lt;!DOCTYPE是否在行中

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

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

    您的代码成功完成,导致错误的唯一行是包含 &lt;!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'}
    

    如果您在更改日期只是年份和月份之前打印参数,我想您希望这些日子在一个月内获得不同的固定装置。

    【讨论】:

    • 你好。以上对于解决导致错误的代码问题非常有效,但我仍然遇到一个问题,即我在该月迭代的每一天都获得了整整一个月的固定装置。顺便说一句,我没有和你一样的禁止访问错误。
    • 我抓住了所有不可靠的线条并看了看,那里有一条奇怪的,我会看看其余的,我错过了那部分
    • 啊对...我们只要能看到固定装置我就很高兴看不到其他任何东西。对日期范围问题有什么想法吗?
    • 参数“d”值应该是什么样子?
    • 诚实的回答是我不知道。在我基于迭代版本的示例中,有问题的日期值被硬编码为:'date = datetime(year=2014, month=1, day=1)' 如果有帮助吗?谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    • 2017-09-25
    相关资源
    最近更新 更多