zoukankan      html  css  js  c++  java
  • 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

    爬好的数据:

  • 相关阅读:
    Java实现 洛谷 P1060 开心的金明
    (Java实现) 洛谷 P1605 迷宫
    (Java实现) 洛谷 P1605 迷宫
    (Java实现)洛谷 P1093 奖学金
    (Java实现)洛谷 P1093 奖学金
    Java实现 洛谷 P1064 金明的预算方案
    Java实现 洛谷 P1064 金明的预算方案
    (Java实现) 洛谷 P1031 均分纸牌
    QT树莓派交叉编译环开发环境搭建(附多个exe工具下载链接)
    武则天红人对唐睿宗的桃色报复(如此缺少城府,注定了要在宫廷中过早地出局)
  • 原文地址:https://www.cnblogs.com/123456www/p/12354964.html
Copyright © 2011-2022 走看看