在某些情况下,我们爬取的数据不在同一个页面中,例如,我们爬取一个电影网站,电影的名称,评分在一级页面,而要爬取的其他电影详情在其二级子页面中。
这时我们就需要用到请求传参。
请求传参的使用场景
当我们使用爬虫爬取的数据没有存在于同一张页面的时候,则必须使用请求传参。(深度爬取)
示例:爬取boss的岗位名称,岗位描述
# -*- coding: utf-8 -*- import scrapy from bossPro.items import BossproItem class BossproSpider(scrapy.Spider): name = ‘bosspro‘ # allowed_domains = [‘www.xxx.com‘] start_urls = [‘https://www.zhipin.com/c100010000-p100109/?ka=search_100109‘] url = ‘https://www.zhipin.com/c100010000-p100109/?page=%s&ka=page-%s‘ page_num = 2 def detail_parse(self,response): job_desc = response.xpath(‘//*[@id="main"]/div[3]/div/div[2]/div[2]/div[1]/div//text()‘).extract() job_desc = ‘‘.join(job_desc) item = response.meta.get(‘item‘) item[‘job_desc‘] = job_desc print(job_desc) yield item def parse(self, response): print(response.text) li_list = response.xpath(‘//*[@id="main"]/div/div[2]/ul/li‘) print(li_list) for li in li_list: item = BossproItem() job_name = li.xpath(‘.//div[@class="job-title"]/span[1]/a/text()‘).extract_first() detail_url = ‘https://www.zhipin.com‘+li.xpath(‘.//div[@class="job-title"]/span[1]/a/@href‘).extract_first() print(detail_url) print(job_name) item[‘job_name‘] = job_name # meta可以将参数 传递给回调的函数 yield scrapy.Request(url=detail_url,callback=self.detail_parse,meta={‘item‘:item}) # 请求传参就是将不同页面请求到的数据封装到item中 存储在管道 可通过meta参数传递item if self.page_num <=5: new_url = format(self.url % (self.page_num,self.page_num)) self.page_num+=1 yield scrapy.Request(url=new_url,callback=self.parse)
原文:https://www.cnblogs.com/sxy-blog/p/13215810.html