def parse(self, response):
"""
提取出html页面中的所有url 并跟踪这些url进行一步爬取
如果提取的url中格式为 /question/xxx 就下载之后直接进入解析函数
"""
all_urls = response.css("a::attr(href)").extract()
all_urls = [parse.urljoin(response.url, url) for url in all_urls]
all_urls = filter(lambda x:True if x.startswith("https") else False, all_urls)
match_obj = re.match("(.*zhihu.com/question/(\d+))(/|$).*", url)
if match_obj:
#如果提取到question相关的页面则下载后交由提取函数进行提取
request_url = match_obj.group(1)
yield scrapy.Request(request_url, headers=self.headers, callback=self.parse_question)
else:
#如果不是question页面则直接进一步跟踪
yield scrapy.Request(url, headers=self.headers, callback=self.parse)
解决办法:
将 :all_urls = [parse.urljoin(response.url, url) for url in all_urls]
他过滤后值是,所以过滤url失败
修改成:all_urls = list(filter(lambda x: True if x.startswith("https") else False, all_urls))
注:老师的这行代码,视频上用没有出问题,还搞不明白是不是语法错误,知道的同学,可以补充下。