python爬虫--scrapy框架的学习和使用(七)⭐---第二部分
文章目录
- 九、CrawlSpider⭐⭐⭐
- 实战项目
- 问题总结
- 十、分布式爬虫
- 十一、增量式爬虫
- 总结
九、CrawlSpider⭐⭐⭐
是一个类,基于Spider的子类。
子类继承父类所有的功能,并能派生出自己的功能!
- 用于全栈数据的爬取
- 基于Spider:手动请求
- 基于CrawlSpider
- 使用流程
- 创建工程(同以前不变)
- cd XXX
- 创建爬虫文件(CrawlSpider):
scrapy genspider -t crawl xxx www.xxx.com
【scrapy genspider -t crawl sun www.xxx.com
】- 链接提取器:根据指定的规则(allow)进行指定的提取
- 规则解析器:将链接提取器的链接进行指定规则(callback)的解析操作
实战项目
- 需求
爬取sun网站网站中的编号、新闻标题、新闻内容、编号
- 分析
爬取的数据没有在同一张页面中
- 流程
- 可以使用链接提取器提取所有的页码链接
- 让链接提取器提取所有的新闻详情页
- 源码解析
- sun.py
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rulefrom sunPro.items import SunproItem,DetailItem# 需求:爬取sun网站网站中的编号、新闻标题、新闻内容、编号
class SunSpider(CrawlSpider):name = 'sun'# allowed_domains = ['www.xxx.com']start_urls = ['https://wzzdg.sun0769.com/political/index/politicsNewest?id=1&page=1']# 链接提取器:根据指定规则(allow="正则")进行指定链接的提取link = LinkExtractor(allow=r'id=1&page=\d+')link_detail = LinkExtractor(allow=r'index\?id=\d+')rules = (# 规则解析器:将链接提取器的链接进行指定规则(callback)的解析操作# 提取链接的个数和回调的次数是相同的Rule(link, callback='parse_item', follow=True),Rule(link_detail, callback='parse_detail'),# follow=True:可以将链接提取器 继续作用到链接提取器提取到的链接 所对应的页面中# follow=True:对全栈链接的提取)# https://wzzdg.sun0769.com/political/politics/index?id=526663 # https://wzzdg.sun0769.com/political/politics/index?id=526662# 如下两个方法中不可以实现请求传参,因为就没有使用scrapy.Request() ⭐行星# 无法将两个解析方法解析的数据存储到一个item中,因此存储到两个# 解析新闻编号和标题def parse_item(self, response):# xpaht表达式中不可以出现tbody标签li_list = response.xpath('/html/body/div[2]/div[3]/ul[2]/li')for li in li_list:# 新闻编号、新闻标题获取new_num = li.xpath('./span[1]/text()').extract_first()new_title = li.xpath('./span[@class="state3"]/a/text()').extract_first()# print('new_num:',new_num,'new_num_title:',new_title)item = SunproItem()item['title'] = new_titleitem['new_num'] = new_numyield item# 解析详情页新闻内容、编号def parse_detail(self,response):new_id = response.xpath('/html/body/div[3]/div[2]/div[2]/div[1]/span[4]/text()').extract_first()new_content = response.xpath('/html/body/div[3]/div[2]/div[2]/div[2]/pre/text()').extract_first()# print('new_id:',new_id,'new_content:',new_content)item = DetailItem()item['new_id'] = new_iditem['new_content'] = new_contentyield item
- items.py
sun.py
文件中的两个方法【parse_item,parse_detail】中不可以实现请求传参,因为就没有使用scrapy.Request() ⭐⭐
- 无法将两个解析方法解析的数据存储到一个item中,因此存储到两个
class SunproItem(scrapy.Item):# define the fields for your item here like:title = scrapy.Field()new_num = scrapy.Field()class DetailItem(scrapy.Item):# define the fields for your item here like:new_id = scrapy.Field()new_content = scrapy.Field()
- pipelines.py
将数据写入数据库时,如何保证新闻的一致性
通过new_id与new_num 两个数值是一样的
class SunproPipeline:# 一定要区分不同的item# 如何判定item类型def process_item(self, item, spider):if item.__class__.__name__ == 'DetailItem':⭐⭐print(item['new_id'],item['new_content'])else:print(item['new_num'],item['title'])return item
- 最后修改settings.py文件
问题总结
- CrawlSpider爬图片的时候遇到了不完整url⭐⭐
- re正则的使用
在线正则表达式测试工具
十、分布式爬虫
- 概念
我们需要搭建一个分布式的集群,让其对一组资源进行分布联合爬取
- 作用
提升爬取数据的效率
- 如何实现分布式?
安装一个
scrapy-redis
的组件
原生的scrapy是不可以实现分布式爬虫,必须让scrapy结合着scrapy-redis组件一起实习那分布式爬虫
- 为什么原生的scrapy不可以实现分布式?
- 调度器不可以被分布式集群共享
- 管道不可以被分布式集群共享
- scrapy-redis组件作用:
可以给原生的scrapy框架提供可以被共享的管道和调度器
- 实现流程⭐⭐
- 创建一个工程【同以往一样】
- 创建一个基于CrawlSpider的爬虫文件
scrapy startproject fbsPro
cd .\fbsPro\
scrapy genspider -t crawl fbs www.xxx.com
- 修改当前的爬虫文件:
- 导包:
from scrapy_redis.spiders import RedisCrawlSpider
- 注释:
start_urls和allowed_domains
- 添加新属性:
redis_key = 'xxxx'
可以被共享的调度器队列的名称- 编写数据解析相关的操作
- 将当前爬虫类的父类改为RedisCrawlSpider
- 修改配置文件settings.py
- 指定使用可以被共享的管道
ITEM_PIPELINES = {
‘scrapy_redis.pipelines.RedisPipeline’: 400,
}- 指定调度器
SCHEDULER ="scrapy_redis.scheduler.Scheduler"
SCHEDULER_PERSIST = True
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
- 指定redis服务器
REDIS_HOST = 'redis服务中的ip地址'
# 不指定则默认本地
REDIS_PORT = 6379
- redis相关操作配置
- 配置redis的配置文件:
- Linux或者Mac:redis.conf
- Windows:redis.windows.conf
- 打开配置文件修改:
- 将bind 127.0.0.1进行删除
- 关闭保护模式 :protected-mode yes改为protected-mode no
- 结合着配置文件开启redis服务: redis-server 配置文件
- 启动客户端 :redis-cli
- 执行工程
scrapy runspider xxx.py
- 向调度器的队列中放入起使url
- 调度器的队列在redis的客户端中
lpush xxx www.xxx.com
- 查看数据
- 爬取到的数据存储在了redis的
ProName:items
这个数据结构中
十一、增量式爬虫
三类:
- 通用爬虫
- 聚焦爬虫
- 增量式爬虫
- 概念
检测网站数据更新的情况,只会爬取网站最新更新出来的数据。
- 需求
获得该网页的名称和简介
- 分析
- 指定一个起使的url
- 基于CrawlSpider获取其他页码链接
- 基于Rule将其他页码链接进行请求
- 从每一个页码对应的页面源码中解析出每一个电影详情页的url
- 核心:检测电影详情页的url之前有没有请求过
python爬虫--scrapy框架的学习和使用(七)⭐---第二部分相关推荐
- Python爬虫 scrapy框架爬取某招聘网存入mongodb解析
这篇文章主要介绍了Python爬虫 scrapy框架爬取某招聘网存入mongodb解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 创建项目 sc ...
- python爬虫--Scrapy框架--Scrapy+selenium实现动态爬取
python爬虫–Scrapy框架–Scrapy+selenium实现动态爬取 前言 本文基于数据分析竞赛爬虫阶段,对使用scrapy + selenium进行政策文本爬虫进行记录.用于个人爬虫学习记 ...
- Python爬虫—Scrapy框架—Win10下载安装
Python爬虫-Scrapy框架-Win10下载安装 1. 下载wheel 2.下载twisted 3. 下载pywin32 4. 下载安装Scrapy 5. 创建一个scrapy项目 6. fir ...
- Python爬虫-Scrapy框架(四)- 内置爬虫文件 - 4.2 初探Crawl Spider
Python爬虫-Scrapy框架(四)- 内置爬虫文件 - 4.2 初探Crawl Spider 写在前面 初探Crawl Spider 创建Crawl Spider项目 对比Basic与Crawl ...
- python爬虫scrapy框架教程_Python爬虫教程-30-Scrapy 爬虫框架介绍
从本篇开始学习 Scrapy 爬虫框架 Python爬虫教程-30-Scrapy 爬虫框架介绍 框架:框架就是对于相同的相似的部分,代码做到不出错,而我们就可以将注意力放到我们自己的部分了 常见爬虫框 ...
- Python爬虫——scrapy框架介绍
一.什么是Scrapy? Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍.所谓的框架就是一个已经被集成了各种功能(高性能异步下载,队列,分布式,解析,持久化等) ...
- Python爬虫——Scrapy框架(附有实战)
大家好!我是霖hero 有一天,我在逛街,突然被一声靓仔打断了我的脚步,回头一看,原来是水果摊阿姨叫我买水果,说我那么靓仔,便宜一点买给我,自恋的我无法拒绝阿姨的一声声靓仔,于是买了很多水果回家,家人 ...
- python爬虫scrapy框架基础
我使用的软件是pychram 最近几周也一直在学习scrapy,发现知识点比较混乱,今天来总结一下.我是按照<精通python网络爬虫核心技术框架与项目实战>这本书来写的.讲的比较简洁,想 ...
- python爬虫scrapy框架爬取网页数据_Scrapy-Python
scrapy Scrapy:Python的爬虫框架 实例Demo 抓取:汽车之家.瓜子.链家 等数据信息 版本+环境库 Python2.7 + Scrapy1.12 初窥Scrapy Scrapy是一 ...
最新文章
- web个人主页制作代码_关于嵌入式web服务器
- 使用ASIHTTPRequest 编译提示找不到libxml/HTMLparser.h的解决方法
- zookeeper web ui--gt;node-zk-browser安装
- CEdit里''\r\n才是换行
- 添加aspnet_isapi.dll的映射时“确定”按钮不可用的解决方案
- CodeSmith实用技巧(八):生成的代码输出到文件中
- mt4 指标 涨跌幅 颜色k线_通达信指标公式源码阴线买股+黄金K线指标+源码
- 25个深度学习开源数据集
- 从自走棋代码分析游戏机制--棋池、回蓝、目标判断、掉落概率与新英雄
- 7个最佳博客名称生成器,可帮助您找到好的博客名称提示
- 【89元】爱乐生 上臂式语音电子血压计测量仪 家用医用全自动智能大屏 老人尊享 LZX-B1681-C标准款...
- 华为怎么显示返回按键_华为怎么把返回那三个键调出来
- oracle数据库优化之统计分析
- leetcode 494. 目标和
- catia 螺钉外螺纹_请问catia如何画螺杆和螺栓上的螺纹
- 致敬司徒!avalon例子学习
- 软件构造Lab2总结
- 【Flink】FLink Task did not exit gracefully within 180 + seconds 未解决
- 乐趣无穷,用SQL语句给宝宝取名字(用电脑起名)
- php版本支持存储过程,PHP升级到4.3版本之后改变了调用存储过程的一个特性
热门文章
- 运维工程师都在做什么
- CMake和Make之间的区别
- 用verilog实现检测1的个数_[转]常用数字处理算法的Verilog实现
- Python实现视频转 gif 动图
- java根据jpg格式图片或视频文件生成gif动图
- 计算机毕业设计java+ssm酒店管理系统(源码+系统+mysql数据库+Lw文档)
- 干货,分享!09-基于layui后台html模板!!!
- IDA Pro7.0使用技巧总结
- html给标题设置背景,怎么在html中设置一级标题背景
- Win7重装系统遇到错误怎么办?