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/fmgao-technology/p/10141603.html

时间: 2024-07-30 15:57:58

scrapy框架之递归解析和post请求的相关文章

爬虫学习 12.scrapy框架之递归解析和post请求

爬虫学习 12.scrapy框架之递归解析和post请求 今日概要 递归爬取解析多页页面数据 scrapy核心组件工作流程 scrapy的post请求发送 今日详情 1.递归爬取解析多页页面数据 - 需求:将糗事百科所有页码的作者和段子内容数据进行爬取切持久化存储 - 需求分析:每一个页面对应一个url,则scrapy工程需要对每一个页码对应的url依次发起请求,然后通过对应的解析方法进行作者和段子内容的解析. 实现方案: 1.将每一个页码对应的url存放到爬虫文件的起始url列表(start_

Scrapy框架之如何给你的请求添加代理

首先做好准备工作,创建一个Scrapy项目,目录结构如下: 注:spiders目录下多了3个文件,db.py,default.init和items.json.db.py是我简单封装的一个数据库访问的lib文件,default.init是我的数据库和代理相关的配置文件,items.json是最后的输出文件. 给请求添加代理有2种方式,第一种是重写你的爬虫类的start_request方法,第二种是添加download中间件.下面会分别介绍这2种方式. 重写start_request方法 我在我的爬

11-scrapy(递归解析,post请求,日志等级,请求传参)

一.递归解析: 需求:将投诉_阳光热线问政平台中的投诉标题和状态网友以及时间爬取下来永久储存在数据库中 url:http://wz.sun0769.com/index.php/question/questionType?type=4&page= 需求分析:每一个页面对应的是一个url,scrapy框架发起请求对一个url进行解析,解析完后又对另一个url发起请求进行解析. 实现方案: 1.可以将每一个页面的url放在爬虫程序中的start_urls中请求.(不推荐,累死人) 2.另一种请求使用R

Scrapy框架的执行流程解析

这里主要介绍七个大类Command->CrawlerProcess->Crawler->ExecutionEngine->sceduler另外还有两个类:Request和HttpRessponse 1.首先通过Command类中的run方法 (1).创建开始运行的命令 (2).将每一个spider对象的路径传入到crawl_process.crawl方法中去 (3).crawl_process.crawl方法创建一个Crawler对象,通过调用Crawler.crawl方法创建一个

scrapy框架的日志等级和请求传参, 优化效率

目录 scrapy框架的日志等级和请求传参, 优化效率 Scrapy的日志等级 请求传参 如何提高scripy的爬取效率 scrapy框架的日志等级和请求传参, 优化效率 Scrapy的日志等级 在使用scrapy crawl spiderFileName运行程序时,在终端里打印输出的就是scrapy的日志信息. 日志信息的种类: ERROR : 一般错误 WARNING : 警告 INFO : 一般的信息 DEBUG : 调试信息 设置日志信息指定输出: 在settings.py配置文件中,加

Scrapy 框架 手动发送请求 POST 请求的发送

手动发送请求 import scrapy from choutiSpider.items import ChoutispiderItem class ChoutiSpider(scrapy.Spider): name = 'chouti' # allowed_domains = ['www.xxx.com'] start_urls = ['https://dig.****.com/r/scoff/hot/1'] # 通用模板 url url = 'https://dig.****.com/r/s

【Scrapy框架之请求传参案例】 -- 2019-08-08 20:40:13

原文: http://106.13.73.98/__/141/ 在某些情况下,我们爬取的数据不在同一个页面. 例如下面的案例1,我们要爬取一个电影网站,电影的排名.名称.主演分在一页,而其它的信息分在二级子页面中.这时,我们就需要用到请求传参. 案例1:爬取97电影网中所有热门电影的详细信息 97电影网热门电影URL:http://www.55xia.com/movie/hotest/ 第一步,爬虫文件: # -*- coding: utf-8 -*- import scrapy from Te

爬虫5 scrapy框架2 全站爬取cnblogs, scarpy请求传参, 提高爬取效率, 下载中间件, 集成selenium, fake-useragent, 去重源码分析, 布隆过滤器, 分布式爬虫, java等语言概念补充, bilibili爬视频参考

1 全站爬取cnblogs # 1 scrapy startproject cnblogs_crawl # 2 scrapy genspider cnblogs www.cnblogs.com 示例: # cnblogs_crawl/cnblogs_crawl/spiders/cnblogs.py import scrapy from cnblogs_crawl.items import CnblogsCrawlItem from scrapy.http import Request class

python实现爬虫(一)--- Scrapy框架抓取豆瓣书籍信息

Scrapy是一个用python实现都爬虫框架,简单易用,功能强大,只需要在框架的基础上自定义自己的分析规则即可,具体如何新建工程等待都在官方文档上面讲解得非常清楚,官方文档tutorial(http://doc.scrapy.org/en/latest/intro/tutorial.html)请保证下载较新版本的Scrapy(我的是0.24.2,scrapy -v)旧版本会出现一些问题. 下面我使用Scrapy抓取豆瓣上面编程书籍的一些简单信息 一.准备爬取的页面如下,新建一个douban工程