• python从入门到放弃自学笔记2-scrapy框架中的parse()方法工作机制及应用


    1. 因为使用的yield,而不是return。parse函数将会被当做一个生成器使用。scrapy会逐一获取parse方法中生成的结果,并判断该结果是一个什么样的类型;
    2. 如果是request则加入爬取队列,如果是item类型则使用pipeline处理,其他类型则返回错误信息。
    3. scrapy取到第一部分的request不会立马就去发送这个request,只是把这个request放到队列里,然后接着从生成器里获取;
    4. 取尽第一部分的request,然后再获取第二部分的item,取到item了,就会放到对应的pipeline里处理;
    5. parse()方法作为回调函数(callback)赋值给了Request,指定parse()方法来处理这些请求 scrapy.Request(url, callback=self.parse)
    6. Request对象经过调度,执行生成 scrapy.http.response()的响应对象,并送回给parse()方法,直到调度器中没有Request(递归的思路)
    7. 取尽之后,parse()工作结束,引擎再根据队列和pipelines中的内容去执行相应的操作;
    8. 程序在取得各个页面的items前,会先处理完之前所有的request队列里的请求,然后再提取items。

    下面是利用parse函数循环爬取多个页面的一个实例:

    继续上次的例子,上次的爬虫代码中只爬取了一个页面的内容,如果想要爬取多个链接的内容,可以在每个页面的下一页这个标签中来获取它的链接,并且在parse()函数中生成一个request,存入爬取队列,在通过得到的一个又一个的response对象来获取页面信息,生成item,再将item传给pipelines进行数据的储存。

    下面贴上爬虫的代码:

    # -*- coding: utf-8 -*-
    import scrapy
    
    from sc.items import ScItem
    
    
    class QsbkSpiderSpider(scrapy.Spider):
        name = 'qsbk_spider'
        #allowed_domains = ['http://www.lovehhy.net']
        start_urls = ['http://www.lovehhy.net/Default.aspx']
        baseUrl = "http://www.lovehhy.net"
    
        def parse(self, response):
            node_title_list = response.xpath("//div[@class='post_recommend_new']/h3/a/text()").extract()
            node_time_list = response.xpath("//div[@class='post_recommend_new']/div[@class='post_recommend_time']/text()").extract()
            items = []
            for i in range(len(node_title_list)):
                item = ScItem()
                title = node_title_list[i]
                time = node_time_list[i]
                item = ScItem(title=title, time=time)
                # 产生item
                yield item
    
            # 提取下一页的li标签
            next_url = response.xpath("//div[@id='dig_lcpage']/div[@id='ct_page']/ul/li[last()]/a/text()").extract()[0]
            # print("是否下一页的位置是%s" ,str(next_url))
            # 提取待拼接的分页部分字符串
            url_pae = response.xpath("//div[@id='dig_lcpage']/div[@id='ct_page']/ul/li[last()]/a/@href").extract()
            print(url_pae)
    
            if "下一页" in next_url:
                real_url = self.baseUrl + url_pae[0]
                print(real_url)
                yield scrapy.Request(real_url, callback=self.parse)
            else:
                return

    爬好的数据:

  • 相关阅读:
    linux安装kafka教程
    linux 系统java相关部署
    redies学习总结
    Sentinel自定义异常降级-新旧版本差异
    Android Bitmap压缩详解
    Head First之策略模式
    go测试
    go获取命令行参数
    JVM-垃圾收集算法基础
    Java代理模式
  • 原文地址:https://www.cnblogs.com/123456www/p/12354964.html
Copyright © 2020-2023  润新知