Python Scrapy - start_url 中的多个变量

Python Scrapy - multiple variables in start_url

我想让我的 start_url 比现在更动态一点,但我调整后的代码似乎不起作用。

为了让它更动态,我又添加了 2 个变量(月和日),并改为使用 start_requests 方法而不是 start_urls,但是,抓取工具现在 returns 零个项目:

import scrapy

class SuhbaSpider(scrapy.Spider):
    name = "suhbaDate"
# old working line of code 
#    start_urls = ["http://saltanat.org/videos.php?date={yyyy}-06-15".format(yyyy=yyyy) for yyyy in range(2013,2020)]

# new block of code (replaced start_urls with start_requests), not working
    def start_requests(self):
        for yyyy in range(2013,2020):
            for mm in range(12,12):
                for dd in range(14,15):
                    url = "http://saltanat.org/videos.php?date={yyyy}-{mm}-{dd}".format(yyyy=yyyy,mm=mm,dd=dd) 
                    yield Request(url, meta={'start_url':url}, callback=self.parse)
                    print(yyyy,mm,dd,url)

    def parse(self, response):
        for video in response.xpath("//tr[@class='video-doclet-row']"):
            item = dict()
            item["video"] = video.xpath(".//span[@class='download make-cursor']/a/@href").extract_first()

            videoid = video.xpath(".//span[@class='media-info make-cursor']/@onclick").extract_first()
            url = "http://saltanat.org/ajax_transcription.php?vid=" + videoid[21:-2]
            request = scrapy.Request(url, callback=self.parse_transcript)
            request.meta['item'] = item
            yield request

    def parse_transcript(self, response):
        item = response.meta['item']
        item["transcript"] = response.xpath("//a[contains(@href,'english')]/@href").extract_first()
        yield item

如有任何帮助,我们将不胜感激

所以上面的代码有几个问题

  1. 查看Traceback输出发现实际问题是这样的: NameError: global name 'Request' is not defined 这似乎是一个错误

  2. 有问题的 url 需要 mmdd 变量的前导零

解决方法

  1. 在脚本顶部包含此行 from scrapy.http.request import Request

  2. 用 itertools 和 zfill 重写了 start_requests 循环:

def start_requests(self):
    for yyyy,mm,dd in itertools.product(range(2013,2020),range(6,7),range(14,22)):
        mm = str(mm).zfill(2)
        dd = str(dd).zfill(2)
        url = "http://saltanat.org/videos.php?date={0}-{1}-{2}".format(yyyy,mm,dd) 
        yield Request(url, meta={'start_url':url}, callback=self.parse)

*忽略实际日期,那些是为了测试