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

    爬好的数据:

  • 相关阅读:
    剑指Offer-30.连续子数组的最大和(C++/Java)
    剑指Offer-29.最小的K个数(C++/Java)
    UVA 1616 Caravan Robbers 商队抢劫者(二分)
    UVA 10570 Meeting with Aliens 外星人聚会
    UVA 11093 Just Finish it up 环形跑道 (贪心)
    UVA 12673 Erratic Expansion 奇怪的气球膨胀 (递推)
    UVA 10954 Add All 全部相加 (Huffman编码)
    UVA 714 Copying Books 抄书 (二分)
    UVALive 3523 Knights of the Round Table 圆桌骑士 (无向图点双连通分量)
    codeforecs Gym 100286B Blind Walk
  • 原文地址:https://www.cnblogs.com/123456www/p/12354964.html
Copyright © 2011-2022 走看看