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
如有任何帮助,我们将不胜感激
所以上面的代码有几个问题
查看Traceback输出发现实际问题是这样的:
NameError: global name 'Request' is not defined
这似乎是一个错误
有问题的 url 需要 mm
和 dd
变量的前导零
解决方法
在脚本顶部包含此行 from scrapy.http.request import Request
用 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)
*忽略实际日期,那些是为了测试
我想让我的 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
如有任何帮助,我们将不胜感激
所以上面的代码有几个问题
查看Traceback输出发现实际问题是这样的:
NameError: global name 'Request' is not defined
这似乎是一个错误有问题的 url 需要
mm
和dd
变量的前导零
解决方法
在脚本顶部包含此行
from scrapy.http.request import Request
用 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)
*忽略实际日期,那些是为了测试