网络爬虫框架Scrapy详解之Request

作者: 编程新视野 | 来源:发表于2018-08-08 15:51 被阅读132次

    Scrapy,Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试

    Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。Scrapy可以说是目前Python爬虫框架中最成熟最稳定的框架之一,所以我们使用Scrapy框架来做爬虫开发可以说是好钢用在刀刃上。

    一、Scrapy主要包括了以下组件:

    Scrapy架构图

    二、Scrapy

    1.Scrapy的五大模块:
    *引擎(Scrapy):用来处理整个系统的数据流处理, 触发事务(框架核心)

    *调度器(Scheduler):调度器接受引擎传来的数据,维护需要爬取的网页URL队列,并通过规定的调度机制将URL创建为下载请求。

    *下载器(Downloader):用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的)

    *管道(Item Pipeline):将爬取到的内容转换为实体对象,并对实体对象做有效性验证、持久化等等自定义的操作。

    *爬虫(Spiders):在爬虫中,定义爬取URL的规则和网页信息的提取规则。

    2.基本流程

    3.创建项目


    工程目录

    4.爬取伯乐在线IT标签的所有文章的信息
    1、分析
    网址:http://blog.jobbole.com/category/it-tech/
    2、在items文件的类中创建所需字段

    3、在spiders文件夹中创建一个scrapy.Spider的子类,并重写其中的name、start_urls、parse()

    name = "list_spider"
    start_urls = ["http://blog.jobbole.com/all-posts/"]
        def parse(self, response):
            result = dict()
            print("++++++"*50)
            container = response.xpath("//div[@class='post floated-thumb']")
            curr_page = int(response.xpath("//span[@class='page-numbers current']/text()").extract_first())
            # print(type(container))
            list_index = 1
            for item in container:
                # print(item)
                result["thumb_url"] = item.xpath("./div[@class='post-thumb']//img/@src").extract_first()
                content_container = item.xpath(".//div[@class='post-meta']")
                result["date"] = ""
                date_b = content_container.xpath("./p/text()").extract()
                match = re.findall("(\d{4}/\d{2}/\d{2})", str(date_b))
                if len(match):
                    result["date"] = match[0]
                result["title"] = content_container.xpath("./p/a[@class='archive-title']/text()").extract_first()
                result["tag"] = content_container.xpath("./p/a[@rel]/text()").extract_first()
                result["summary"] = content_container.xpath("./span[@class='excerpt']/p/text()").extract_first()
                result["detail_url"] = content_container.xpath(".//span[@class='read-more']/a/@href").extract_first()
                result["curr_index"] = (curr_page-1) * 20 + list_index
                yield result
                list_index += 1
            next_page = response.xpath("//a[@class='next page-numbers']/@href").extract_first()
            if next_page:
                yield scrapy.Request(url=next_page, callback=self.parse)
    
    

    提取标签信息用的是xpath,可以参考http://www.w3school.com.cn/xpath/index.asp
    4、这时候所有数据都已经爬取到了,scrapy会将爬取到的数据输出到控制台


    将数据存到数据库:
    存到csv:

    存到Excel:

    三、Request介绍:

    Request类是一个http请求的类,对于爬虫而言是一个很重要的类。通常在Spider中创建这样的一个请求,在Downloader中执行这样的一个请求。
    同时也有一个子类FormRequest继承于它,用于post请求。

    Spring中获取request的几种方法

    方法1:Controller中加参数
    代码示例:

    该方法实现的原理是,在Controller方法开始处理请求时,Spring会将request对象赋值到方法参数中。Controller中获取request对象后,如果要在其他方法中(如service方法、工具类方法等)使用request对象,需要在调用这些方法时将request对象作为参数传入。

    方法2:自动注入
    代码示例:

    方法3:基类中自动注入
    与方法2相比,将注入部分代码放入到了基类中。
    代码示例:
    基类代码:

    Controller代码如下;这里列举了BaseController的两个派生类,由于此时测试代码会有所不同,因此服务端测试代码没有省略;客户端也需要进行相应的修改(同时向2个url发送大量并发请求)。


    方法4:手动调用
    代码示例:

    方法5:@ModelAttribute方法
    下面这种方法及其变种(变种:将request和bindRequest放在子类中)在网上经常见到:
    代码示例:


    还有很多包括视频我就不一一截图了,需要这些资料的可以先关注小编,转发评论,私信小编 晓雯

    相关文章

      网友评论

      本文标题:网络爬虫框架Scrapy详解之Request

      本文链接:https://www.haomeiwen.com/subject/nqqzvftx.html