爬虫--Scrapy-CrawlSpider基于CrawlSpide的分布式爬虫
CrawlSpider
提问:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法?方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法)。方法二:基于CrawlSpider的自动爬取进行实现(更加简洁和高效)。 全栈120页数据
---------------------------------------------------------------------------
CrawlSpider: 问题:如果我们想要对某一个网站的全站数据进行爬取? 解决方案: 1. 手动请求的发送
2. CrawlSpider(推荐)
之前的事基于Spider类 CrawlSpider概念:CrawlSpider其实就是Spider的一个子类。CrawlSpider功能更加强大(链接提取器,规则解析器)。代码: 1. 创建一个基于CrawlSpider的爬虫文件 a) scrapy genspider –t crawl 爬虫名称 起始url
-------
创建工程scrapy startproject crawlSpiderPro
cd crawlSpiderPro
创建爬虫文件 scrapy genspider -t crawl chouti dig.chouti.com
基于scrapySpider爬虫文件的和基于spider的不同之处
爬虫文件chouti.py
区别:
class ChoutiSpider(CrawlSpider):name = 'chouti'#allowed_domains = ['dig.chouti.com']start_urls = ['https://dig.chouti.com/']#实例化了一个链接提取器对象#链接提取器:用来提取指定的链接(url)#allow参数:赋值一个正则表达式#链接提取器就可以根据正则表达式在页面中提取指定的链接#提取到的链接会全部交给规则解析器link = LinkExtractor(allow=r'/all/hot/recent/\d+')rules = (#实例化了一个规则解析器对象#规则解析器接受了链接提取器发送的链接后,就会对这些链接发起请求,获取链接对应的页面内容,就会根据指定的规则对页面内容中指定的数据值进行解析#callback:指定一个解析规则(方法/函数)#follow:是否将链接提取器继续作用到连接提取器提取出的链接所表示的页面数据中Rule(link, callback='parse_item', follow=),)def parse_item(self, response):print(response) # 对应的编写response.xpath()---存到items ----将items传给管道---在管道进行持久化存储
# follow=True 所有的页面数据
link = LinkExtractor(allow=r'/all/hot/recent/\d+')
---------------------------------------------
Rule(link, callback='parse_item', follow=True),
分布式爬虫
分布式爬虫: 1. 概念:多台机器上可以执行同一个爬虫程序,实现网站数据的分布爬取。 2. 原生的scrapy是不可以实现分布式爬虫?a) 调度器无法共享b) 管道无法共享 3. scrapy-redis组件:专门为scrapy开发的一套组件。该组件可以让scrapy实现分布式。a) 下载:pip install scrapy-redis 4. 分布式爬取的流程:a) redis配置文件的配置:i. bind 127.0.0.1 进行注释ii. protected-mode no 关闭保护模式b) redis服务器的开启:基于配置配置文件c) 创建scrapy工程后,创建基于crawlSpider的爬虫文件 d) 导入RedisCrawlSpider类,然后将爬虫文件修改成基于该类的源文件e) 将start_url修改成redis_key = ‘XXX’f) 在配置文件中进行相应配置:将管道配置成scrapy-redis集成的管道g) 在配置文件中将调度器切换成scrapy-redis集成好的调度器h) 执行爬虫程序:scrapy runspider xxx.pyi) redis客户端:lpush 调度器队列的名称 “起始url”
-------------------------
分布式爬虫: 1. 概念:多台机器上可以执行同一个爬虫程序,实现网站数据的分布爬取。 2. 原生的scrapy是不可以实现分布式爬虫?a) 调度器无法共享b) 管道无法共享 3. scrapy-redis组件:专门为scrapy开发的一套组件。该组件可以让scrapy实现分布式。a) 下载:pip install scrapy-redis 4. 分布式爬取的流程: 下载redis----我用的是windows版本的在redis数据库所在文件进行配置a) redis配置文件的配置:i. bind 127.0.0.1 进行注释ii. protected-mode no 关闭保护模式
b) redis服务器的开启:基于配置配置文件----
c) 创建scrapy工程后,创建基于crawlSpider的爬虫文件
d) 导入RedisCrawlSpider类,然后将爬虫文件修改成基于该类的源文件
from scrapy_redis.spiders import RedisCrawlSpider class QiubaiSpider(RedisCrawlSpider):
e) 将start_url修改成redis_key = ‘XXX’f) 在配置文件中进行相应配置:将管道配置成scrapy-redis集成的管道默认的为:
g) 在配置文件中将调度器切换成scrapy-redis集成好的调度器在settings.py粘贴如下配置调度器:、
h) 执行爬虫程序:scrapy runspider xxx.py不同之处是要cd 到爬虫文件
i) 起始url:
https://www.qiushibaike.com/pic/
【补充】 #如果redis服务器不在自己本机,则需要在setting中进行如下配置 REDIS_HOST = 'redis服务的ip地址' REDIS_PORT = 6379 【注意】近期糗事百科更新了糗图板块的反爬机制,更新后该板块的页码链接/pic/page/2/s=5135066,末尾的数字每次页面刷新都会变化,因此爬虫文件中链接提取器的正则不可写为/pic/page/\d+/s=5135066而应该修改成/pic/page/\d+
分布式爬虫代码:
qiubai.py
import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule from redisPro.items import RedisproItem from scrapy_redis.spiders import RedisCrawlSpider class QiubaiSpider(RedisCrawlSpider):#继承的类不同,功能也就不一样name = 'qiubai'#allowed_domains = ['www.qiushibaike.com/pic']#start_urls = ['http://www.qiushibaike.com/pic/']# 调度器队列的名称redis_key = 'qiubaispider' # 表示跟start_urls含义是一样 rules = (Rule(LinkExtractor(allow=r'/pic/page/\d+'), callback='parse_item', follow=True),)# img src //pic.qiushibaike.com/system/pictures/12133/121333058/medium/8ULD8612VVF6T0NR.jpgdef parse_item(self, response):div_list = response.xpath('//*[@id="content-left"]/div')for div in div_list:# 相对于div_list .// img_urlimg_url = div.xpath('./div[@class="thumb"]/a/img/@src').extract_first()# 在items.py中声明 ---导入items# 实例化items对象item = RedisproItem()item['img_url'] = img_urlyield item
-------------------
github地址
1、打开redis服务器:
2、再执行:
h) 执行爬虫程序:scrapy runspider xxx.py 不同之处是要cd 到爬虫文件
3、打开客户端:
redis客户端:lpush 调度器队列的名称 “起始url”
---------------------------
keys *
测试成功
转载于:https://www.cnblogs.com/foremostxl/p/10095663.html
爬虫--Scrapy-CrawlSpider基于CrawlSpide的分布式爬虫相关推荐
- scrapy 分布式 mysql_Scrapy基于scrapy_redis实现分布式爬虫部署的示例
准备工作 1.安装scrapy_redis包,打开cmd工具,执行命令pip install scrapy_redis 2.准备好一个没有BUG,没有报错的爬虫项目 3.准备好redis主服务器还有跟 ...
- python爬虫之基于scrapy_redis的分布式爬虫
基于redis的分布式爬虫 问题: (1)为什么原生的scrapy框架不可以自己实现分布式爬虫? 原因有两个: (1)因为多台机器上部署的scrapy会各自拥有各自的调度器,这样就使得多台机器无法分配 ...
- 手把手教你搭建一个基于Java的分布式爬虫系统
http://blog.51cto.com/xpleaf/2093952 1 概述 在不用爬虫框架的情况,经过多方学习,尝试实现了一个分布式爬虫系统,并且可以将数据保存到不同地方,类似MySQL.HB ...
- python分布式爬虫系统_如何构建一个分布式爬虫:理论篇
前言 本系列文章计划分三个章节进行讲述,分别是理论篇.基础篇和实战篇.理论篇主要为构建分布式爬虫而储备的理论知识,基础篇会基于理论篇的知识写一个简易的分布式爬虫,实战篇则会以微博为例,教大家做一个比较 ...
- 基于PyHusky的分布式爬虫原理及实现
原理 爬虫是我们获取互联网数据的一个非常有效的方法,而分布式爬虫则是利用许多台机器协调工作来加快抓取数据效率的不二途径.分布式爬虫是由访问某些原始网址开始,在获取这些网址的内容后,根据某些规则从中提取 ...
- 网络爬虫--19.【Scrapy-Redis实战】分布式爬虫爬取房天下--环境准备
文章目录 0. 思路 一. 虚拟机Ubuntu0中安装Redis 二. 虚拟机Ubuntu1中安装Redis 三. Windows服务器上安装Redis 四. 安装cmder 五. 安装RedisDe ...
- python 爬虫 scrapy 和 requsts 哪个快_Scrapy爬虫框架结构以及和Requests库的比较
爬虫框架 *爬虫框架是实现爬虫功能的一个软件结构和功能组件集合 *爬虫框架是一个半成品,能够帮助用户实现专业网络爬虫 Scrapy爬虫框架结构 "5+2"结构 Spiders(用户 ...
- 中华英才网爬虫程序解析(4)-分布式爬虫redis
欢迎来到爬虫高级兼实战教程,打开你的IDE,开始python之旅吧! redis数据库 redis也是一种数据库,我们用到他的一个数据类型,也就是list列表来进行我们的分布式爬虫,接下来截取部分代码 ...
- 基于python的网络爬虫编程_基于Python的网络爬虫程序设计
程序设计 ●Program Design 基于 Python的网络爬虫程序设计 网络 信 息量 的迅 猛 增 长,对 如何从海量的信息中准确的搜索 到用户需要的信息提 出了极大的 挑战.网络爬 虫具有 ...
- 基于python的网络爬虫技术_基于python的网络爬虫技术的研究
龙源期刊网 http://www.qikan.com.cn 基于 python 的网络爬虫技术的研究 作者:刘文辉 李丽
最新文章
- Python游戏开发,pygame模块,Python实现愤怒的小鸟【附带源码】
- plsql导入到mysql数据库乱码问题_PLSQL打开sql文件中文乱码解决方案
- LaTeX技巧:如何高效地将LaTeX代码转为Word公式
- 发布Apworks应用开发框架(Alpha版本)
- yii2 发送邮件 yii\swiftmailer\Mailer
- JavaSE各阶段练习题----Map
- 大学生应当趁早谋划未来
- python 小说cms_用python 发 帝国cms 文章
- AIoT催使AI深度场景化,“AI赋能,智联万物——开发者沙龙·南京站”圆满落幕...
- Vue之不常注意的点
- 【转】Linux内核结构详解
- Dubbo介绍前篇------单一应用框架、垂直应用框架、分布式应用框架、流动计算框架,及RPC的简介
- android pickerview 多行,Android-PickerView系列之介绍与使用篇(一)
- 单体药店医药管理软件如何选择
- npp++常用的匹配正则表达式
- 魔众在线题库管理系统v3.3.0源码
- 用QQ聊天记录生成一个词云
- 医学统计python之ROC比较:Delong test
- HTML——使用表格制作个人简历
- 为什么计算机关机慢,XP系统为什么电脑关机慢?
热门文章
- 嵌入式系统——RS232和RS449
- 原生html如何发送网络请求,原生JS向服务器发送GET请求
- spark入门及环境搭建
- Linux内核学习之路_1_编译Linux内核
- 详解多维数组与指针之间的关系
- 【CentOS 7笔记43】,防火墙和iptables filter表#
- 微信开发--获取用户信息中文乱码的解决方案
- struts2在action中获取request、session、application,并传递数据
- Resources.resx 未将对象引用设置到对象的实例
- Visual Studio Node.js工具1.1