今日概要

  • 递归爬取解析多页页面数据
  • scrapy核心组件工作流程
  • scrapy的post请求发送

今日详情

1.递归爬取解析多页页面数据

- 需求:将糗事百科所有页码的作者和段子内容数据进行爬取切持久化存储

- 需求分析:每一个页面对应一个url,则scrapy工程需要对每一个页码对应的url依次发起请求,然后通过对应的解析方法进行作者和段子内容的解析。

实现方案:

1.将每一个页码对应的url存放到爬虫文件的起始url列表(start_urls)中。(不推荐)

2.使用Request方法手动发起请求。(推荐)

代码展示:

# -*- coding: utf-8 -*-
import scrapy
from qiushibaike.items import QiushibaikeItem
# scrapy.http import Request class QiushiSpider(scrapy.Spider): name = 'qiushi' allowed_domains = ['www.qiushibaike.com'] start_urls = ['https://www.qiushibaike.com/text/'] #爬取多页 pageNum = 1 #起始页码 url = 'https://www.qiushibaike.com/text/page/%s/' #每页的url def parse(self, response): div_list=response.xpath('//*[@id="content-left"]/div') for div in div_list: #//*[@id="qiushi_tag_120996995"]/div[1]/a[2]/h2 author=div.xpath('.//div[@class="author clearfix"]//h2/text()').extract_first() author=author.strip('\n') content=div.xpath('.//div[@class="content"]/span/text()').extract_first() content=content.strip('\n') item=QiushibaikeItem() item['author']=author item['content']=content yield item #提交item到管道进行持久化 #爬取所有页码数据 if self.pageNum <= 13: #一共爬取13页(共13页) self.pageNum += 1 url = format(self.url % self.pageNum) #递归爬取数据:callback参数的值为回调函数(将url请求后,得到的相应数据继续进行parse解析),递归调用parse函数 yield scrapy.Request(url=url,callback=self.parse)

2.五大核心组件工作流程:

  • 引擎(Scrapy)
    用来处理整个系统的数据流处理, 触发事务(框架核心)
  • 调度器(Scheduler)
    用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址
  • 下载器(Downloader)
    用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的)
  • 爬虫(Spiders)
    爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面
  • 项目管道(Pipeline)
    负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。

3.post请求发送

- 问题:在之前代码中,我们从来没有手动的对start_urls列表中存储的起始url进行过请求的发送,但是起始url的确是进行了请求的发送,那这是如何实现的呢?

- 解答:其实是因为爬虫文件中的爬虫类继承到了Spider父类中的start_requests(self)这个方法,该方法就可以对start_urls列表中的url发起请求:

  def start_requests(self):for u in self.start_urls: yield scrapy.Request(url=u,callback=self.parse)

【注意】该方法默认的实现,是对起始的url发起get请求,如果想发起post请求,则需要子类重写该方法。

  -方法: 重写start_requests方法,让其发起post请求:

def start_requests(self):#请求的url post_url = 'http://fanyi.baidu.com/sug' # post请求参数 formdata = { 'kw': 'wolf', } # 发送post请求 yield scrapy.FormRequest(url=post_url, formdata=formdata, callback=self.parse)

转载于:https://www.cnblogs.com/presleyren/p/10579741.html

scrapy框架之递归解析和post请求相关推荐

  1. 使用scrapy 框架来抓取100部美剧的信息

    在开始爬取之前,必须创建一个新的 Scrapy 项目.进入自定义的项目目录中,运行下列命令: 创建项目命令 scrapy startproject 项目名称 切换到项目下 cd 项目名称目录 同时找到 ...

  2. 什么是递归解析?一文读懂!

    为了更好的控制解析过程,网站管理员常通过设置权威DNS的配置,达到控制解析端.排除不可控用户端的目的.但操作之后往往发现,解析路径中还存在一个影响因子,即本地递归DNS. 递归解析均由各线路的运营商提 ...

  3. Scrapy框架流程图解析

    今日语:心空,望望远方的高楼:心属,依然停留 接下来就放一张scrapy的架构图喽~(绿线是数据流向) 简单叙述一下每层图的含义吧: Spiders(爬虫):它负责处理所有Responses,从中分析 ...

  4. python爬虫之Scrapy框架的post请求和核心组件的工作 流程

    python爬虫之Scrapy框架的post请求和核心组件的工作 流程 一 Scrapy的post请求的实现 在爬虫文件中的爬虫类继承了Spider父类中的start_urls,该方法就可以对star ...

  5. request设置请求头_收藏 Scrapy框架各组件详细设置

    今天说一下Scrapy框架各组件的详细设置. 关于Scrapy Scrapy是纯Python语言实现的爬虫框架,简单.易用.拓展性高是其主要特点.这里不过多介绍Scrapy的基本知识点,主要针对其高拓 ...

  6. 16-爬虫之scrapy框架手动请求发送实现全站数据爬取03

    scrapy的手动请求发送实现全站数据爬取 yield scrapy.Reques(url,callback) 发起的get请求 callback指定解析函数用于解析数据 yield scrapy.F ...

  7. python scrapy爬虫视频_python爬虫scrapy框架的梨视频案例解析

    之前我们使用lxml对梨视频网站中的视频进行了下载 下面我用scrapy框架对梨视频网站中的视频标题和视频页中对视频的描述进行爬取 分析:我们要爬取的内容并不在同一个页面,视频描述内容需要我们点开视频 ...

  8. 网络爬虫框架——Scrapy框架解析

    一.为什么使用Scrapy框架? Scrapy是一个快速.高层次的屏幕抓取和web抓取的框架,可用于数据挖掘.监测和自动化检测,任何人都可以根据需要去进行修改. 二.Scrapy框架每个组件介绍 1. ...

  9. 解析python网络爬虫pdf 黑马程序员_正版 解析Python网络爬虫 核心技术 Scrapy框架 分布式爬虫 黑马程序员 Python应用编程丛书 中国铁道出版社...

    商品参数 书名:Python应用编程丛书:解析Python网络爬虫:核心技术.Scrapy框架.分布式爬虫 定价:52.00元 作者:[中国]黑马程序员 出版社:中国铁道出版社 出版日期:2018-0 ...

最新文章

  1. 好书速递 | FPGA原理和结构
  2. python colormap(颜色映射)
  3. JPA中实现双向一对一的关联关系
  4. 红外传感器_基于红外避障传感器控制无人机
  5. 服务器实际显示内存,服务器实际显示内存大小
  6. windows清理剪切板
  7. C#Convert.ToInt32(byte)方法-将字节值转换为int
  8. 【Python】Matplotlib在直方图中添加概率密度曲线和数学表达式
  9. 原F1000Prime推荐:ACE2泛癌分析图谱(TCGA数据库挖掘)
  10. android bmob获取数据,Android基于bmob后端云实现数据读取
  11. vscode ---- 插件
  12. 从网络营销辞职转行软件测试,100天的心酸拿到9K,过程都是自己在苦撑,只因我...
  13. IOUtils工具类简介及应用
  14. Failure obtaining db row lock: No row exists in table QRTZ_LOCKS for lock named
  15. 初中英语语法(003)-be动词和一般动词的一般过去式
  16. 百度地图LV1.5实践项目开发工具类bmap.util.jsV1.1
  17. C语言做的猜数字小游戏
  18. 两化融合给企业带来的实际意义
  19. Linux:限制网络带宽
  20. dmesgprintk的工作原理

热门文章

  1. [机器学习] 数据特征 标准化和归一化
  2. TensorFlow学习笔记(1):variable与get_variable, name_scope()和variable_scope()
  3. 小波阈值图像去噪的实现步骤
  4. 基于ZooKeeper的分布式Session实现
  5. PHP(一)——概述及服务器配置
  6. 贷款必看:如何信审电话才能提高贷款通过率?
  7. 云计算与 OpenStack - 每天5分钟玩转 OpenStack(14)
  8. 不安和怀疑,美丽而又危险:看两位80后女艺术家的展览
  9. 将MATLAB中的图像信息用到Vivado中
  10. mysql 中文字段名_MySQL全文索引怎么做?| 教程分享