爬虫学习12.scrapy框架之递归解析和post请求(代码片段)

bky20061005 bky20061005     2023-04-27     631

关键词:

爬虫学习 12.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('
')
            content=div.xpath('.//div[@class="content"]/span/text()').extract_first()
            content=content.strip('
')
            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)

技术图片技术图片

scrapy框架之递归解析和post请求

...析。实现方案:  1.将每一个页码对应的url存放到爬虫文件的起始url列表(start_urls)中。(不推荐)  2.使用Request方法手动发起请求。(推荐)代码展示:#-*-coding:utf-8-*-importscrapyfromqiushibaike.itemsimportQiushibaikeItem#scra... 查看详情

文章索引

爬虫相关随笔爬虫开发之get和post请求seleniumalertJS弹窗问题处理Selenium爬取元素定位爬虫开发13.UA池和代理池在scrapy中的应用爬虫开发14.scrapy框架之分布式操作爬虫开发12.selenium在scrapy中的应用爬虫开发11.scrapy框架之CrawlSpider操作爬... 查看详情

12.scrapy框架(代码片段)

...量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非常之方便。Scrapy使用了Twisted‘tw?st?d异步网络框架来处理网络通讯,可以加快我们的下载速度,不用自己去实现异步框架,并且... 查看详情

python爬虫之真实世界中的网页解析

Request和ResponseRequest是我们平常浏览网页,向网站所在的服务器发起请求,而服务器收到请求后,返回给我们的回应就是Response,这种行为就称为HTTP协议,也就是客户端(浏览器)和服务器的对话方式。Request方法在HTTP1.1的背景下... 查看详情

12.scrapy框架持续化存储

一、基于终端指令的持久化存储保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过终端指令的形式写入指定格式的文件中进行持久化操作 执行输出指定格式进行存储:将爬取到的数... 查看详情

python爬虫之scrapy框架系列(12)——实战zh小说的爬取来深入学习crawlspider

目录:1.CrawlSpider的引入:(1)首先:观察之前创建spider爬虫文件时(2)然后:通过命令scrapygenspider获取帮助:(3)最后:使用模板crawl创建一个爬虫文件:2.CrawlSpider的正式讲解2.1我们通过爬取ZH小说来深入了解它!规划我们的... 查看详情

python爬虫之scrapy框架系列(12)——实战zh小说的爬取来深入学习crawlspider

目录:1.CrawlSpider的引入:(1)首先:观察之前创建spider爬虫文件时(2)然后:通过命令scrapygenspider获取帮助:(3)最后:使用模板crawl创建一个爬虫文件:2.CrawlSpider的正式讲解2.1我们通过爬取ZH小说来深入了解它!规划我们的... 查看详情

python网络爬虫之scrapy框架(crawlspider)(代码片段)

目录Python网络爬虫之Scrapy框架(CrawlSpider)CrawlSpider使用爬取糗事百科糗图板块的所有页码数据Python网络爬虫之Scrapy框架(CrawlSpider)提问:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法?方法一... 查看详情

爬虫系列之scrapy框架(代码片段)

...I所返回的数据(例如AmazonAssociatesWebServices)或者通用的网络爬虫。Scrapy是基于twisted框架开发而来,twisted是一个流行的事件驱动的python网络框架。因此Scrapy使用了一种非阻塞(又名异步)的代码来实现并发。整体架构大致如下:'... 查看详情

如何学习python

...、Flask框架学习、Tornado框架学习、RestfulAPI等。阶段五:爬虫开发Python全栈开发与人工智能之爬虫开发学习内容包括:爬虫开发实战。阶段六:全栈项目实战Python全栈开发与人工智能之全栈项目实战学习内容包括:企业应用工具... 查看详情

scrapy框架之(crawlspider)(代码片段)

一.CrawlSpider简介如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法?方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法)。方法二:基于CrawlSpider的自动爬取进... 查看详情

18python网路爬虫之scrapy框架中的crawlspider详解(代码片段)

CrawlSpider的引入:    提问:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法?  方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法)。  方法二:基于Craw... 查看详情

python要哪些要点要学习

...、Flask框架学习、Tornado框架学习、RestfulAPI等。阶段五:爬虫开发Python全栈开发与人工智能之爬虫开发学习内容包括:爬虫开发实战。阶段六:全栈项目实战Python全栈开发与人工智能之全栈项目实战学习内容包括:企业应用工具... 查看详情

爬虫学习:urllib教程与实践

...urlib,思考万分,还是要补一下这个教程。我们来学一下爬虫之祖urlib,不管你什么模块都是起源于该模块。url 查看详情

python需要学习的知识多吗?

...、Flask框架学习、Tornado框架学习、RestfulAPI等。阶段五:爬虫开发Python全栈开发与人工智能之爬虫开发学习内容包括:爬虫开发实战。阶段六:全栈项目实战Python全栈开发与人工智能之全栈项目实战学习内容包括:企业应用工具... 查看详情

python基础有哪些内容呢?

...、Flask框架学习、Tornado框架学习、RestfulAPI等。阶段五:爬虫开发Python全栈开发与人工智能之爬虫开发学习内容包括:爬虫开发实战。阶段六:全栈项目实战Python全栈开发与人工智能之全栈项目实战学习内容包括:企业应用工具... 查看详情

python需要学习啥内容,好学吗?

...、Flask框架学习、Tornado框架学习、RestfulAPI等。阶段五:爬虫开发Python全栈开发与人工智能之爬虫开发学习内容包括:爬虫开发实战。阶段六:全栈项目实战Python全栈开发与人工智能之全栈项目实战学习内容包括:企业应用工具... 查看详情

python爬虫之scrapy框架环境安装(代码片段)

文章目录前言一.scrapy框架环境安装二.创建一个scrapy工程前言为什么要学习scrapy框架?框架是一个集成了很多功能,并且具有很强通用性的一个项目模板。scrapy框架就具有许多强大的功能,例如高性能的持久化存储操... 查看详情