Python爬虫 | 如何使用爬虫框架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')``   

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

步骤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``   

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

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

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

示例代码:

(1)导入ScrapysushidemoItem类

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

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

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

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

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

(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)``   

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

步骤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()``   

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

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

示例代码:

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

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

**步骤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

六、面试宝典

在这里插入图片描述

在这里插入图片描述

简历模板在这里插入图片描述
若有侵权,请联系删除
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,我可以为您提供Scrapy爬取58同城二手房的代码。但是,请您注意,Scrapy爬虫需要遵守网站的robots.txt协议,不得对网站进行恶意爬取,否则会对您的程序和IP地址产生不好的影响。此外,对于爬取到的信息,请您务必遵守相关法律法规,不得进行商业化利用或其他非法用途。 以下是Scrapy爬取58同城二手房的示例代码: ```python import scrapy from scrapy import Request from scrapy.exceptions import CloseSpider from scrapy.loader import ItemLoader from scrapy.loader.processors import MapCompose, TakeFirst from w3lib.html import remove_tags import re import pymysql class Cq58ErshoufangSpider(scrapy.Spider): name = 'cq_58_ershoufang' allowed_domains = ['cq.58.com'] start_urls = ['https://cq.58.com/ershoufang/'] custom_settings = { 'ROBOTSTXT_OBEY': True, 'DOWNLOAD_DELAY': 1 } def parse(self, response): item_links = response.xpath('//ul[@class="house-list-wrap"]/li[@class="house-cell"]/div[@class="list-info"]/h2/a/@href') for item_link in item_links: yield Request(item_link.get(), callback=self.parse_item) next_page_url = response.css('a.next::attr(href)').get() if next_page_url is not None: yield Request(next_page_url, callback=self.parse) def parse_item(self, response): item_loader = ItemLoader(item=Cq58ErshoufangItem(), response=response) item_loader.default_output_processor = TakeFirst() item_loader.add_xpath('title', '//div[@class="house-title"]/h1/text()') item_loader.add_xpath('sell_point', '//div[@class="house-desc-item"]/div[1]/text()', MapCompose(remove_tags)) item_loader.add_xpath('community_name', '//div[@class="house-desc-item"]/div[2]/a/text()') item_loader.add_xpath('community_address', '//div[@class="house-desc-item"]/div[2]/span/text()') item_loader.add_xpath('room_type', '//ul[@class="house-desc-list"]/li[1]/text()') item_loader.add_xpath('floor', '//ul[@class="house-desc-list"]/li[2]/text()') item_loader.add_xpath('year_built', '//ul[@class="house-desc-list"]/li[3]/text()', MapCompose(self.extract_year_built)) item_loader.add_xpath('unit_price', '//div[@class="price"]/b/text()', MapCompose(remove_tags)) item_loader.add_xpath('total_price', '//div[@class="price"]/span[@class="price-det"]/text()', MapCompose(remove_tags)) yield item_loader.load_item() def extract_year_built(self, value): match = re.search(r'\d{4}', value) if match: return match.group(0) else: return None class Cq58ErshoufangItem(scrapy.Item): title = scrapy.Field() sell_point = scrapy.Field() community_name = scrapy.Field() community_address = scrapy.Field() room_type = scrapy.Field() floor = scrapy.Field() year_built = scrapy.Field() unit_price = scrapy.Field() total_price = scrapy.Field() class Cq58ErshoufangPipeline: def __init__(self, mysql_host, mysql_port, mysql_db, mysql_user, mysql_password): self.mysql_host = mysql_host self.mysql_port = mysql_port self.mysql_db = mysql_db self.mysql_user = mysql_user self.mysql_password = mysql_password @classmethod def from_crawler(cls, crawler): return cls( mysql_host=crawler.settings.get('MYSQL_HOST'), mysql_port=crawler.settings.get('MYSQL_PORT'), mysql_db=crawler.settings.get('MYSQL_DB'), mysql_user=crawler.settings.get('MYSQL_USER'), mysql_password=crawler.settings.get('MYSQL_PASSWORD') ) def open_spider(self, spider): self.conn = pymysql.connect( host=self.mysql_host, port=self.mysql_port, db=self.mysql_db, user=self.mysql_user, password=self.mysql_password, charset='utf8mb4' ) self.cursor = self.conn.cursor() def close_spider(self, spider): self.conn.close() def process_item(self, item, spider): sql = ''' INSERT INTO cq_58_ershoufang ( title, sell_point, community_name, community_address, room_type, floor, year_built, unit_price, total_price ) VALUES ( %s, %s, %s, %s, %s, %s, %s, %s, %s ) ''' data = ( item['title'], item['sell_point'], item['community_name'], item['community_address'], item['room_type'], item['floor'], item['year_built'], item['unit_price'], item['total_price'] ) self.cursor.execute(sql, data) self.conn.commit() return item ``` 在该示例代码中,我们使用Scrapy框架进行网页爬取,并使用了XPath和CSS选择器对网页元素进行定位和提取。爬取到的信息存储在一个自定义的Item对象中,并使用ItemLoader对数据进行处理。最后,我们将爬取到的数据存储在MySQL数据库中,需要在settings.py文件中配置MySQL数据库的相关参数。 需要注意的是,该示例代码只是一个参考,具体的爬取需求和数据存储方式可能需要根据您的实际情况进行调整。另外,为了防止网站的反爬虫机制,我们在settings.py中设置了DOWNLOAD_DELAY参数,即每次请求之间的时间间隔,您可以根据需要进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值