当前位置:   article > 正文

Python爬虫 | 如何使用爬虫框架scrapy爬取分页数据案例演示_scrapy分页爬取

scrapy分页爬取

导读

1、 scrapy框架爬虫

1.1 使用scrapy框架爬取分页数据案例演示

步骤1:数据解析

步骤2:在item类中定义相关的属性

步骤3:将解析的数据封装存储到item,并进行 分页操作

步骤4:将item类型的对象提交给管道Pipeline持久化存储

步骤5:在管道类的process_item中要将接收到的item对象中存储的数据进行持久化存储

步骤6:修改配置文件settings.py

步骤7:执行工程

本章总结

完整代码领取

1、scrapy框架爬虫

前面我们介绍了使用明星框架scrapy中的Pipeline将数据持久化存储成txt格式的文件。今天我们来介绍爬取分页数据并持久化存储成txt文件的方法。

案例:使用爬虫框架Scrapy来爬取古诗词网苏轼的诗词的诗人、诗人简介信息,并爬取第1~5页数据中第2条诗词名、作者和诗词内容,并将解析的数据持久化存储到本地指定的txt文件中。

1.1使用scrapy框架爬取分页数据案例演示

创建工程的步骤和之前的文章中的步骤一样,今天就不在这里重复,有需要查看详情的,可以查看小编之前发布的文章【Python爬虫(16) | 使用明星框架scrapy中的Pipeline将数据持久化存储成txt格式的致胜法宝】

步骤1:数据解析

**方法:**双击SpiderSuShiDemo_01.py打开爬虫文件,修改或添加代码。

示例代码:

"""使用scrapy框架爬虫案例演示:爬取分页数据"""``# 案例:使用爬虫框架Scrapy来爬取古诗词网苏轼的诗词中的第1~5页数据中第2条诗词名、作者和诗词内容,并将解析的数据持久化存储到本地指定的txt文件中``import scrapy``from ScrapySuShiDemo.items  import ScrapysushidemoItem``   ``#  创建类Spidersushidemo01Spider``class Spidersushidemo01Spider(scrapy.Spider):`   `name = "SpiderSuShiDemo_01"`   `# allowed_domains = ["shici.com.cn"]`   `start_urls = ["https://shici.com.cn/poet/0x2bf504c9?"]``   `   `# 生成一个通用的url模板`   `url = 'https://shici.com.cn/poet/0x2bf504c9?page=%d'`   `page_num = 2``   `   `# 定义函数parse`   `def parse(self, response):`       `# 对响应结果进行解析:对诗词名、作者名称和诗词内容进行解析`       `div_list = response.xpath('//*[@id="wrapper"]/div/div[2]/div[1]')``   `       `# 存储所有解析到的数据`       `all_data = []``   `       `# 使用for循环遍历诗词名、作者名称和诗词内容`       `for div in div_list:`           `item = ScrapysushidemoItem()`           `# extract可以将Selector对象中data参数存储的字符串提取出来`           `# 苏东坡`           `poem = div_list.xpath('./div[1]/div[1]/div/div/h1/text()').extract()`           `# 将poem列表内容转换成字符串`           `poem = ''.join(poem)`           `# print("【诗人】:",poem)``   `           `intro = div_list.xpath('./div[1]/div[1]/div/div/p[2]//text()').extract()`           `# 将intro列表内容转换成字符串`           `intro = ''.join(intro)`           `# print("【诗人简介】:",intro, '\n')``   `           `# title = div.xpath('./div[3]/h3/a/text()').extract_first()`           `title = div.xpath('./div[3]/h3/a/text()').extract_first()`           `# print(title)``   `           `author = div.xpath('./div[3]/div[2]/div[1]/a/text()')[0].extract()``   `           `# author = div.xpath('./div[3]/div[2]/div[1]/a/text()')[0].extract()`           `# print(author)``   `           `# poetry = div.xpath('//*[@id="poetry-238002"]/p//text()').extract()`           `poetry = div.xpath('./div[3]/div[2]/div[2]/p//text()').extract()``   `           `# 将poetry列表内容转换成字符串`           `poetry = ''.join(poetry)`           `# print(poetry,'\n')``   
  • 1

–可左右滑动查看完整代码–

步骤2:在item类中定义相关的属性

**方法:**双击items.py打开爬虫文件,在该文件基础上修改代码,定义属性

示例代码:

# Define here the models for your scraped items``#``# See documentation in:``# https://docs.scrapy.org/en/latest/topics/items.html``import scrapy``   ``class ScrapysushidemoItem(scrapy.Item):`   `# define the fields for your item here like:`   `# name = scrapy.Field()`   `# 在item类中定义相关的属性`   `poem = scrapy.Field()`   `intro = scrapy.Field()`   `title = scrapy.Field()`   `author = scrapy.Field()`   `poetry = scrapy.Field()`   `pass``   
  • 1

–可左右滑动查看完整代码–

步骤3:将解析的数据封装存储到item类型的对象,并进行分页操作

**方法:**双击SpiderSuShiDemo_01.py打开爬虫文件,在步骤1的基础上修改代码。

示例代码:

(1)导入ScrapysushidemoItem类

# 从当前工程ScrapySuShiDemo的items中导入ScrapysushidemoItem类``from ScrapySuShiDemo.items  import ScrapysushidemoItem``   
  • 1

–可左右滑动查看完整代码–

(2)将解析的数据封装存储到item类型的对象

# 将解析的数据封装存储到item类型的对象``item = ScrapysushidemoItem()``item['poem'] = poem``item['intro'] = intro``item['title'] = title``item['author'] = author``item['poetry'] = poetry``   ``# 将item提交给管道``yield item``   
  • 1

–可左右滑动查看完整代码–

(3)分页操作

# 分页操作``if self.page_num <= 5:`    `new_url = format(self.url%self.page_num)`    `self.page_num += 1`    `# 手动请求发送:callback回调函数是专门用作于数据解析`    `yield scrapy.Request(url=new_url,callback=self.parse)``   
  • 1

–可左右滑动查看完整代码–

步骤4:将item类型的对象提交给管道(Pipeline)进行持久化存储的操作

**方法:**双击pipelines.py打开管道(Pipeline)文件,在该文件上修改代码。

示例代码:

# Define your item pipelines here``#``# Don't forget to add your pipeline to the ITEM_PIPELINES setting``# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html``   ``# useful for handling different item types with a single interface``from itemadapter import ItemAdapter``   ``class ScrapysushidemoPipeline:`   `fp = None`   `# 重写父类的一个方法:该方法只在开始爬虫的时候被调用一次`   `def open_spider(self, spider):`       `print("小伙伴们,请做好准备吧,开始爬虫啦......")``   `   `# 用来处理item类型对象,该方法可以接收爬虫文件提交过来的item对象`   `# 该方法每接收到一个item就会被调用一次`   `def process_item(self, item, spider):`       `poem = item['poem']`       `intro = item['intro']`       `title = item['title']`       `author = item['author']`       `poetry = item['poetry']``   `       `# 持久化存储的文件中写入这三个字段的值`       `self.fp.write(poem+'\n'+intro+'\n'+title+'\n'+author+'\n'+poetry+'\n')``   `       `return item``   `   `def close_spider(self, spider):`       `print("真棒,爬虫完成啦!")`       `self.fp.close()``   
  • 1

–可左右滑动查看完整代码–

步骤5:在管道类的process_item中要将其接收到的item对象中存储的数据进行持久化存储操作。

示例代码:

# 持久化存储``self.fp = open("./SuShi.txt", "w", encoding="utf-8")``   
  • 1

–可左右滑动查看完整代码–

**步骤6:**修改配置文件settings.py

**(1)修改ROBOTSTXT_OBEY 协议配置:**双击ScrapyDemoTest下的配置文件settings.py,将文件打开,发现文件中ROBOTSTXT_OBEY 配置项的值默认为True,将文件中ROBOTSTXT_OBEY 配置项的值修改为 False,如下图所示:

**(2)UA伪装:**在settings.py配置文件中找到USER_AGENT配置项,并将该配置项的值修改为我们爬取的网站的USER_AGENT的值。方法,找到我们要爬取的网站的USER_AGENT的值方法是点击F2打开调试控制台,点击Network,找到对应接口请求头Request-Headers中的USER_AGENT,如下图所示:

**(3)开启管道:**双击settings.py打开配置文件,找到ITEM_PIPELINES配置项,该配置项默认为注释状态,将该配置项的注释放开,开启管道,如下图所示:

**(4)配置日志打印级别为ERROR:**在配置文件中添加一个配置项:LOG_LEVEL = ‘ERROR’,该配置项的目的是只打印ERROR级别的log,如下图所示:

步骤7:执行工程

输入执行工程的命令scrapy crawl SpiderSuShiDemo_01后按回车。

如上命令各参数含义如下:

**(1)scrapy craw:**为固定格式。

**(2)SpiderSuShiDemo_01:**为爬虫文件名。

**命令格式:**scrapy crawl SpiderName(爬虫文件名)

运行结果:

图1:运行成功,项目工程目录下生成的txt文件,从pycharm中查看,如下图所示:

图2:运行成功,项目工程目录下生成的txt文件,从本地磁盘查看,如下图所示:

图3:运行成功,项目工程目录下生成的txt文件,从本地磁盘查看到的文件内容,如下图所示:

代码分析:

通过上面执行结果可以看出,使用爬虫框架Scrapy对分页数据进行爬虫后,并对response返回的结果诗人、诗人简介、诗词名、作者和诗词内容进行了解析,并通过管道的方式持久化存储到本地txt文档。

本章总结

使用爬虫框架Scrapy,基于管道(Pipeline)持久化存储数据到本地指定的txt文件的基本流程如下:

(1)创建工程。

命令:scrapy startproject ScrapySuShiDemo

(2)在spiders子目录下创建爬虫文件。

命令:scrapy genspider SpiderSuShiDemo_01 https://shici.com.cn/poet/0x2bf504c9

(3)数据解析。

(4)在item类中定义相关的属性。

def process_item(self, item, spider):
title = item[‘title’]
author = item[‘author’]
poetry = item[‘poetry’]

(5)将解析的数据封装存储到item类型的对象**,并进行分页操作。**

(6)将item类型的对象提交给管道(Pipeline)进行持久化存储的操作。

(7)在管道类的process_item中将其接收到的item对象中存储的数据进行持久化存储操作。

(8)修改配置文件settings.py,在配置文件中开启管道。

(9)执行工程,调试运行。

命令:scrapy crawl SpiderSuShiDemo_01

(10)运行成功后,查看本地生成的持久化存储文件内容。

---------------------------END---------------------------

题外话

当下这个大数据时代不掌握一门编程语言怎么跟的上脚本呢?当下最火的编程语言Python前景一片光明!如果你也想跟上时代提升自己那么请看一下.

在这里插入图片描述

感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img
img

二、Python必备开发工具

工具都帮大家整理好了,安装就可直接上手!img

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、Python视频合集

观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

五、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

六、面试宝典

在这里插入图片描述

在这里插入图片描述

简历模板在这里插入图片描述
若有侵权,请联系删除
声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号