python爬虫scrapy基于CrawlSpider类的全站数据爬取示例解析


Posted in Python onFebruary 20, 2021

一、CrawlSpider类介绍

1.1 引入

使用scrapy框架进行全站数据爬取可以基于Spider类,也可以使用接下来用到的CrawlSpider类。基于Spider类的全站数据爬取之前举过栗子,感兴趣的可以康康

1.2 介绍和使用

1.2.1 介绍

CrawlSpider是Spider的一个子类,因此CrawlSpider除了继承Spider的特性和功能外,还有自己特有的功能,主要用到的是 LinkExtractor()rules = (Rule(LinkExtractor(allow=r'Items/'), callback='parse_item', follow=True),)

LinkExtractor()链接提取器
LinkExtractor()接受response对象,并根据allow对应的正则表达式提取响应对象中的链接

link = LinkExtractor(
# Items只能是一个正则表达式,会提取当前页面中满足该"正则表达式"的url	
  allow=r'Items/'
)

rules = (Rule(link, callback='parse_item', follow=True),)规则解析器
按照指定规则从链接提取器中提取到的链接中解析网页数据
link:是一个LinkExtractor()对象,指定链接提取器
callback:回调函数,指定规则解析器(解析方法)解析数据
follow:是否将链接提取器继续作用到链接提取器提取出的链接网页

import scrapy
# 导入相关的包
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule

class TextSpider(CrawlSpider):
 name = 'text'
 allowed_domains = ['www.xxx.com']
 start_urls = ['http://www.xxx.com/']

# 链接提取器,从接受到的response对象中,根据item正则表达式提取页面中的链接
	link = LinkExtractor(allow=r'Items/')
	link2 = LinkExtractor(allow=r'Items/')
# 规则解析器,根据callback将链接提取器提取到的链接进行数据解析
# follow为true,则表示将链接提取器继续作用到链接提取器所提取到的链接页面中
# 故:在我们提取多页数据时,若第一页对应的网页中包含了第2,3,4,5页的链接,
# 当跳转到第5页时,第5页又包含了第6,7,8,9页的链接,
# 令follow=True,就可以持续作用,从而提取到所有页面的链接
 rules = (Rule(link, callback='parse_item', follow=True),
 		Rule(link2,callback='parse_content',follow=False))
 # 链接提取器link使用parse_item解析数据
	def parse_item(self, response):
 item = {}
 
 yield item
 # 链接提取器link2使用parse_content解析数据
	def parse_content(self, response):
		item = {}
		
		yield item

1.2.2 使用

创建爬虫文件:除了创建爬虫文件不同外,创建项目和运行爬虫使用的命令和基于Spider类使用的命令相同

scrapy genspider crawl -t spiderName www.xxx.com

二、案例:古诗文网全站数据爬取

爬取古诗文网首页古诗的标题,以及每一首诗详情页古诗的标题和内容。
最后将从详情页提取到的古诗标题和内容进行持久化存储

2.1 爬虫文件

import scrapy
from scrapy.linkextractors import LinkExtractor

from scrapy.spiders import CrawlSpider, Rule
from gushiPro.items import GushiproItem,ContentItem

class GushiSpider(CrawlSpider):
 name = 'gushi'
 #allowed_domains = ['www.xxx.com']
 start_urls = ['https://www.gushiwen.org/']

 # 链接提取器:只能使用正则表达式,提取当前页面的满足allow条件的链接
 link = LinkExtractor(allow=r'/default_\d+\.aspx')

 # 链接提取器,提取所有标题对应的详情页url
 content_link = LinkExtractor(allow=r'cn/shiwenv_\w+\.aspx')
 rules = (
 # 规则解析器,需要解析所有的页面,所有follow=True
 Rule(link, callback='parse_item', follow=True),

 # 不需要写follow,因为我们只需要解析详情页中的数据,而不是详情页中的url
 Rule(content_link, callback='content_item'),
 )

 # 解析当前页面的标题
 def parse_item(self, response):
 p_list = response.xpath('//div[@class="sons"]/div[1]/p[1]')

 for p in p_list:
 title = p.xpath('./a//text()').extract_first()
 item = GushiproItem()
 item['title'] = title
 yield item
 
 # 解析详情页面的标题和内容
 def content_item(self,response):
 # //div[@id="sonsyuanwen"]/div[@class="cont"]/div[@class="contson"]
 # 解析详情页面的内容
 content = response.xpath('//div[@id="sonsyuanwen"]/div[@class="cont"]/div[@class="contson"]//text()').extract()
 content = "".join(content)
 # # 解析详情页面的标题
 title = response.xpath('//div[@id="sonsyuanwen"]/div[@class="cont"]/h1/text()').extract_first()
 # print("title:"+title+"\ncontent:"+content)
 item = ContentItem()
 item["content"] = content
 item["title"] = title
 # 将itme对象传给管道
 yield item

2.2 item文件

import scrapy

# 不同的item类是独立的,他们可以创建不同的item对象
class GushiproItem(scrapy.Item):
 # define the fields for your item here like:
 # name = scrapy.Field()
 title = scrapy.Field()

class ContentItem(scrapy.Item):
 title = scrapy.Field()
 content = scrapy.Field()

2.3 管道文件

from itemadapter import ItemAdapter

class GushiproPipeline:
 def __init__(self):
 self.fp = None

 def open_spider(self,spider):
 self.fp = open("gushi.txt",'w',encoding='utf-8')
 print("开始爬虫")

 def process_item(self, item, spider):
 # 从详情页获取标题和内容,所以需要判断爬虫文件中传来的item是什么类的item
 # item.__class__.__name__判断属于什么类型的item
 if item.__class__.__name__ == "ContentItem":
 content = "《"+item['title']+"》",item['content']
 content = "".join(content) 
 print(content)
 self.fp.write(content)
 return item

 def close_spider(self,spider):
 self.fp.close()
 print("结束爬虫")

2.4 配置文件

python爬虫scrapy基于CrawlSpider类的全站数据爬取示例解析

2.5 输出结果

python爬虫scrapy基于CrawlSpider类的全站数据爬取示例解析

到此这篇关于python爬虫scrapy基于CrawlSpider类的全站数据爬取示例解析的文章就介绍到这了,更多相关python爬虫scrapy数据爬取内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Django1.7+python 2.78+pycharm配置mysql数据库教程
Nov 18 Python
使用Python脚本将Bing的每日图片作为桌面的教程
May 04 Python
python生成随机密码或随机字符串的方法
Jul 03 Python
matplotlib绘制符合论文要求的图片实例(必看篇)
Jun 02 Python
Python登录并获取CSDN博客所有文章列表代码实例
Dec 28 Python
python的pandas工具包,保存.csv文件时不要表头的实例
Jun 14 Python
Python实现八皇后问题示例代码
Dec 09 Python
python requests.post带head和body的实例
Jan 02 Python
解决Python找不到ssl模块问题 No module named _ssl的方法
Apr 29 Python
python处理自动化任务之同时批量修改word里面的内容的方法
Aug 23 Python
Python求平面内点到直线距离的实现
Jan 19 Python
pyx文件 生成pyd 文件用于 cython调用的实现
Mar 04 Python
TensorFlow的环境配置与安装方法
Feb 20 #Python
python爬虫爬取某网站视频的示例代码
Feb 20 #Python
python爬虫线程池案例详解(梨视频短视频爬取)
Feb 20 #Python
python爬虫scrapy框架的梨视频案例解析
Feb 20 #Python
Keras保存模型并载入模型继续训练的实现
Feb 20 #Python
TensorFlow2.0使用keras训练模型的实现
Feb 20 #Python
tensorflow2.0教程之Keras快速入门
Feb 20 #Python
You might like
PHP+memcache实现消息队列案例分享
2014/05/21 PHP
PHP验证码无法显示的原因及解决办法
2017/08/11 PHP
Laravel ORM 数据model操作教程
2019/10/21 PHP
Jquery拖拽并简单保存的实现代码
2010/11/28 Javascript
Ubuntu 11.10 安装Node.js的方法
2011/11/30 Javascript
JQ实现新浪游戏首页幻灯片
2015/07/29 Javascript
学习JavaScript设计模式(继承)
2015/11/26 Javascript
分享我对JS插件开发的一些感想和心得
2016/02/04 Javascript
简单解析JavaScript中的__proto__属性
2016/05/10 Javascript
分享JS代码实现鼠标放在输入框上输入框和图片同时更换样式
2016/09/01 Javascript
jquery操作ID带有变量的节点实例
2016/12/07 Javascript
vue2.x 父组件监听子组件事件并传回信息的方法
2017/07/17 Javascript
基于AngularJS实现表单验证功能
2017/07/28 Javascript
Vuejs+vue-router打包+Nginx配置的实例
2018/09/20 Javascript
jQuery基于随机数解决中午吃什么去哪吃问题示例
2018/12/29 jQuery
element-ui 时间选择器限制范围的实现(随动)
2019/01/09 Javascript
VUE搭建手机商城心得和遇到的坑
2019/02/21 Javascript
JS中的算法与数据结构之栈(Stack)实例详解
2019/08/20 Javascript
js观察者模式的弹幕案例
2020/11/23 Javascript
对vue生命周期的深入理解
2020/12/03 Vue.js
Python实现的数据结构与算法之双端队列详解
2015/04/22 Python
python实现用户登陆邮件通知的方法
2015/07/09 Python
Python中利用Scipy包的SIFT方法进行图片识别的实例教程
2016/06/03 Python
Python面向对象特殊成员
2017/04/24 Python
基于Python中numpy数组的合并实例讲解
2018/04/04 Python
python如何从键盘获取输入实例
2020/06/18 Python
斯洛伐克香水和化妆品购物网站:Parfemy-Elnino.sk
2020/01/28 全球购物
工商管理专业实习生自我鉴定
2013/09/29 职场文书
大专生简历的自我评价
2013/11/26 职场文书
你的创业计划书怎样才能打动风投
2014/02/06 职场文书
保密承诺书范文
2014/03/27 职场文书
市政管理求职信范文
2014/05/07 职场文书
好媳妇事迹材料
2014/12/24 职场文书
六一文艺汇演开幕词
2015/01/29 职场文书
2015年乡镇流动人口工作总结
2015/05/12 职场文书
2019最新激励员工口号大全!
2019/06/28 职场文书