scrapy框架之递归解析和post请求
今日概要
- 递归爬取解析多页页面数据
- 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请求相关推荐
- 使用scrapy 框架来抓取100部美剧的信息
在开始爬取之前,必须创建一个新的 Scrapy 项目.进入自定义的项目目录中,运行下列命令: 创建项目命令 scrapy startproject 项目名称 切换到项目下 cd 项目名称目录 同时找到 ...
- 什么是递归解析?一文读懂!
为了更好的控制解析过程,网站管理员常通过设置权威DNS的配置,达到控制解析端.排除不可控用户端的目的.但操作之后往往发现,解析路径中还存在一个影响因子,即本地递归DNS. 递归解析均由各线路的运营商提 ...
- Scrapy框架流程图解析
今日语:心空,望望远方的高楼:心属,依然停留 接下来就放一张scrapy的架构图喽~(绿线是数据流向) 简单叙述一下每层图的含义吧: Spiders(爬虫):它负责处理所有Responses,从中分析 ...
- python爬虫之Scrapy框架的post请求和核心组件的工作 流程
python爬虫之Scrapy框架的post请求和核心组件的工作 流程 一 Scrapy的post请求的实现 在爬虫文件中的爬虫类继承了Spider父类中的start_urls,该方法就可以对star ...
- request设置请求头_收藏 Scrapy框架各组件详细设置
今天说一下Scrapy框架各组件的详细设置. 关于Scrapy Scrapy是纯Python语言实现的爬虫框架,简单.易用.拓展性高是其主要特点.这里不过多介绍Scrapy的基本知识点,主要针对其高拓 ...
- 16-爬虫之scrapy框架手动请求发送实现全站数据爬取03
scrapy的手动请求发送实现全站数据爬取 yield scrapy.Reques(url,callback) 发起的get请求 callback指定解析函数用于解析数据 yield scrapy.F ...
- python scrapy爬虫视频_python爬虫scrapy框架的梨视频案例解析
之前我们使用lxml对梨视频网站中的视频进行了下载 下面我用scrapy框架对梨视频网站中的视频标题和视频页中对视频的描述进行爬取 分析:我们要爬取的内容并不在同一个页面,视频描述内容需要我们点开视频 ...
- 网络爬虫框架——Scrapy框架解析
一.为什么使用Scrapy框架? Scrapy是一个快速.高层次的屏幕抓取和web抓取的框架,可用于数据挖掘.监测和自动化检测,任何人都可以根据需要去进行修改. 二.Scrapy框架每个组件介绍 1. ...
- 解析python网络爬虫pdf 黑马程序员_正版 解析Python网络爬虫 核心技术 Scrapy框架 分布式爬虫 黑马程序员 Python应用编程丛书 中国铁道出版社...
商品参数 书名:Python应用编程丛书:解析Python网络爬虫:核心技术.Scrapy框架.分布式爬虫 定价:52.00元 作者:[中国]黑马程序员 出版社:中国铁道出版社 出版日期:2018-0 ...
最新文章
- 好书速递 | FPGA原理和结构
- python colormap(颜色映射)
- JPA中实现双向一对一的关联关系
- 红外传感器_基于红外避障传感器控制无人机
- 服务器实际显示内存,服务器实际显示内存大小
- windows清理剪切板
- C#Convert.ToInt32(byte)方法-将字节值转换为int
- 【Python】Matplotlib在直方图中添加概率密度曲线和数学表达式
- 原F1000Prime推荐:ACE2泛癌分析图谱(TCGA数据库挖掘)
- android bmob获取数据,Android基于bmob后端云实现数据读取
- vscode ---- 插件
- 从网络营销辞职转行软件测试,100天的心酸拿到9K,过程都是自己在苦撑,只因我...
- IOUtils工具类简介及应用
- Failure obtaining db row lock: No row exists in table QRTZ_LOCKS for lock named
- 初中英语语法(003)-be动词和一般动词的一般过去式
- 百度地图LV1.5实践项目开发工具类bmap.util.jsV1.1
- C语言做的猜数字小游戏
- 两化融合给企业带来的实际意义
- Linux:限制网络带宽
- dmesgprintk的工作原理
热门文章
- [机器学习] 数据特征 标准化和归一化
- TensorFlow学习笔记(1):variable与get_variable, name_scope()和variable_scope()
- 小波阈值图像去噪的实现步骤
- 基于ZooKeeper的分布式Session实现
- PHP(一)——概述及服务器配置
- 贷款必看:如何信审电话才能提高贷款通过率?
- 云计算与 OpenStack - 每天5分钟玩转 OpenStack(14)
- 不安和怀疑,美丽而又危险:看两位80后女艺术家的展览
- 将MATLAB中的图像信息用到Vivado中
- mysql 中文字段名_MySQL全文索引怎么做?| 教程分享