加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

scrapy框架3——请求传参

发布时间:2020-12-20 10:22:20 所属栏目:Python 来源:网络整理
导读:当使用scrapy爬取的数据不在同一张页面中(一次请求与数据后解析无法获得想要的全部数据),需要请求传参,在第一次解析时实例化item,将item传递,再次将请求到的数据解析后,封装在item中。 关键点 yield scrapy.Request(callback=self.parse_detail,url =

当使用scrapy爬取的数据不在同一张页面中(一次请求与数据后解析无法获得想要的全部数据),需要请求传参,在第一次解析时实例化item,将item传递,再次将请求到的数据解析后,封装在item中。

关键点

yield scrapy.Request(callback=self.parse_detail,url = detail_url,meta={'item':item})

例如在豆瓣中,电影封面页获取电影名称,在详情页获取电影简介:

? 先从起始网页解析出电影名称和详情页的url

? 将得到的电影名称封装在item中

? 将解析到的url作为下一次请求的参数,同时将item作为参数传递,作为下一次解析结果的容器

? 最后将含有一组完整数据的item提交

import scrapy
import re
from douban.items import DoubanItem
class DbspiderSpider(scrapy.Spider):
    name = 'dbspider'
    start_urls = ['https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&page_limit=50&page_start=0/']
    def parse(self,response):
       title = re.findall('title":"(.*?)"',response.text,re.S,)
       url_list = re.findall('url":"(.*?)"',re.S)
       for name,url in zip(title,url_list):
            detail_url = url.replace('','')
            item = DoubanItem()
            item['name'] = name
            yield scrapy.Request(callback=self.parse_detail,meta={'item':item})
        #如果解析第2、3、4...页的数据,再次递归。。。
        
    def parse_detail(self,response):
        item = response.meta['item']
        #name = response.xpath('//*[@id="content"]/h1/span[1]/text()').exrtact_fist()
        instr = response.xpath('//*[@id="link-report"]/span[1]/text()').extract_first()
        item['instr'] = instr
        yield item

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读