• scrapy框架3——请求传参


    当使用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":"(.*?)"',response.text,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,url = detail_url,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
    
  • 相关阅读:
    Prototype.doc in Netsuite
    中文编码问题(utf8转为中文)
    js 取得 Unix时间戳(Unix timestamp)
    关于'跳墙'
    webex js 判断是否是ie 以及兼容性代码
    VLOOKUP函数对查找内容列排序增加效率
    netsuite动态绑定事件
    netsuite filter的选择框 代码控制
    html js 跨域 p3p
    netsuite 记录类型 权限分配 use permissions
  • 原文地址:https://www.cnblogs.com/notfind/p/11637568.html
Copyright © 2020-2023  润新知