为了账号安全,请及时绑定邮箱和手机立即绑定

网络爬虫框架Scrapy详解之Request

标签:
Python

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

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

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

584

Scrapy架构图

二、Scrapy

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

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

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

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

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

2.基本流程

433


3.创建项目

382


296

工程目录


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

618


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会将爬取到的数据输出到控制台

700


将数据存到数据库:

700


存到csv:

700


存到Excel:

700


三、Request介绍:

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

Spring中获取request的几种方法

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

620


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

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

619


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

618


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


492

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

553


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

619



作者:python晓雯
链接:https://www.jianshu.com/p/a6cb0cb152a8


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消