概要
请求传参实现的深度爬取
深度爬取:爬取的数据没有在同一张页面中(首页数据+详情页数据)
在scrapy中如果没有请求传参我们是无法持久化存储数据,也就是无法通过管道存储数据 【持久化存储:管道】
实现方式:scrapy.Request(url,callback,meta)
- meta是一个字典,可以将meta传递给callback
callback取出meta:
-response.meta['item']
需求和实现
- 需求
电影狗-电影详情页
爬取电影的
标题
和详情介绍
-
标题
-
详情页介绍
-
实现
-
spider.py
import scrapy
from firstBlood.items import FirstbloodItem # items.py中的类
class DainyingSpider(scrapy.Spider):
name = 'dainying'
# allowed_domains = ['www.xxx.com']
start_urls = ['https://dygou.tv/index.php/vodshow/6-----------.html'] # 首页
def parse(self, response):
movies = response.xpath('//*[@id="show_page"]/div[2]/div/div[2]/ul[1]/li') # 浏览器解析即可
for movie in movies:
title = movie.xpath('./a/@title').extract_first() # 同理
url = 'https://dygou.tv/' + movie.xpath('./a/@href').extract_first()
item = FirstbloodItem()
item['title'] = title
# 对详情页界面发起请求
yield scrapy.Request(url=url, callback=self.parse_detail,meta={'item':item}) # 传递item对象
# 在Scrapy中,meta 是一个字典,它允许你在请求之间传递数据。meta 可以包含任何你需要在爬虫的不同阶段之间共享的信息
# 自定义 解析方法 去获得详情页的数据
def parse_detail(self,response):
item = response.meta['item'] # 获取item
detail = response.xpath('/html/body/div[3]/div[1]/div[1]/div/div/section[1]/div[1]/span').extract_first()
item['detail'] = detail # 请求传参在这种详情页面的信息挖掘 方面起到了作用
yield item # 提交给管道
-
参数
-
items.py
import scrapy
class FirstbloodItem(scrapy.Item):
title = scrapy.Field()
detail = scrapy.Field()
pass
名词解释
深度爬取
请求传参
传参 传递的是
meta中的item
对象
yield scrapy.Request(url=url, callback=self.parse_detail,meta={'item':item}) # 传递item对象
...
item = response.meta['item'] # 获取item
item['detail'] = detail # 请求传参在这种详情页面的信息挖掘 方面起到了作用
yield item # 提交给管道