Scrapy爬取IMDB站点时for循环内print函数无输出问题求助
Scrapy无输出问题修复方案
现存问题梳理
- 变量作用域错误:
parse_front方法中使用的url变量是start_requests方法内的局部变量,无法跨方法调用,运行时会抛出NameError导致程序终止 - CSS选择器匹配错误:你提供的HTML结构中,Fan favorites对应的a标签父级不存在
fan-picks类,原选择器匹配结果为空,for循环不会执行,因此print无输出 - 回调方法引用错误:
parse_2中调用回调函数时没有加self.前缀,且你未定义parse_3方法,运行到此处会抛出异常 - 反爬拦截:IMDB会拦截无合法User-Agent的请求,直接请求会返回403状态码,无法拿到正常页面内容
修复后代码
import scrapy from scrapy.crawler import CrawlerProcess class imdb_favorites(scrapy.Spider): name = "imdB Favorites" # 全局基础URL,所有方法可调用 base_url = "https://www.imdb.com" # 配置请求头,避免反爬拦截 custom_settings = { 'USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' } def start_requests(self): yield scrapy.Request( url=self.base_url, callback=self.parse_front ) def parse_front(self, response): # 修正选择器,匹配包含Fan favorites文字的a标签的href属性 fan_favorites = response.css('a.ipc-title-link-wrapper:has(h3.ipc-title__text:contains("Fan favorites"))::attr(href)').extract() link_to_follow = fan_favorites for i in link_to_follow: url2 = self.base_url + i print("跳转链接:", url2) yield response.follow( url=url2, callback=self.parse_2 ) def parse_2(self, response): # 匹配电影详情页链接 what_to_watch = response.css('a.ipc-poster-card__title::attr(href)').extract() for a in what_to_watch: url3 = self.base_url + a print("电影详情链接:", url3) # 后续如果要解析详情页可以自己实现parse_3方法后放开注释 # yield response.follow(url=url3, callback=self.parse_3) # 后续需要解析详情页再放开实现 # def parse_3(self, response): # pass if __name__ == "__main__": process = CrawlerProcess() process.crawl(imdb_favorites) process.start()
调试技巧
如果后续还有匹配问题,可以先在对应解析方法中打印response.status确认请求是否成功(正常应为200),也可以打印response.text[:1000]查看返回的页面内容是否符合预期。
内容的提问来源于stack exchange,提问作者Yekta Aktaş
相关产品推荐
相关产品推荐

