首页 > 编程知识 正文

scrapy爬虫案例,scrapy定时爬虫

时间:2023-05-06 04:05:55 阅读:38540 作者:2366

分析了Scrapy_redis的原理, 断点再爬和分布式爬虫实现github下载demo代码2.dmoz文件观察3.dmoz爬虫运行观察现象4. scrapy_redis原理分析4.1 Scrapy_redis的redis pipeliiis lter4.3 Scrapy_redis的Scheduler4.4可以由此总结请求4.4

学习目标

了解scrapy实现发布的原理了解scrapy中要求入队的条件了解基于scrapy_redisURL地址的增量独立爬虫了解scrapy_redis分布式爬虫github的demo代码

git clone https://github.com/Rolando/scrapy-redis.git

研究项目附带的demo

MVS crapy-redis/example-project~~/scrapyredis-project

2 .观察dmoz文件为domz爬虫文件,实现方式为以前的crawlspider类型爬虫

froms crapy.linkextractorsimportlinkextractorfromscrapy.spidersimportcrawlspider, reclassdmozspider(crawlspider ) : ' ' followcategoriesandextractlinks.' ' name=' dmoz ' allowed _ domains=[ statal 修改以定义数据提取规则,并使用了css选择器rules=[ rule (链接提取器(restrict _ CSS=() )。 ' . cat-item ' ),callback='parse_directory ',follow=True ),]defparse_directory(self, response (: fordivinresponse.CSS (.title-and-desc ) ) : yield { ' name ' : div.CSS }.site-title 33333333 . extract_first ).strip )、' link'3360div.CSS )、}但settings.py中添加了以下行: 这些行表示在scrapy_redis中重新实现的排除的类和调度程序,并使用RedisPipeline管道类

dupe filter _ class=' scrapy _ redis.dupe filter.rfpdupefilter ' scheduler=' scrapy _ redis.scheduler ' mple.pipeper ' scrapy _ redis.pipelines.redis pipeline ' :400,}3.dmoz驾驶爬行动物,观察现象程序为redis redis _ URL=' redis : /

中止进程后,如果再次运行3358www.Sina.com/爬行器并继续运行该程序,则可以看到该程序将根据上次继续运行。domz

4. scrapy_redis原理分析从settings.py三种结构进行分析

分别为:

RedisPipeline #管道类RFPDupeFilter #指纹去水类Scheduler #调度器类SCHEDULER_PERSIST #请求队列和指纹集合4.1 Scrapy_redis的redis pppist

line

RedisPipeline中观察process_item,进行数据的保存,存入了redis中

4.2 Scrapy_redis之RFPDupeFilter

RFPDupeFilter 实现了对request对象的加密

4.3 Scrapy_redis之Scheduler

scrapy_redis调度器的实现了决定什么时候把request对象加入带抓取的队列,同时把请求过的request对象过滤掉

4.4 由此可以总结出request对象入队的条件 request的指纹不在集合中requestdont_filter为True,即不过滤 start_urls中的url地址会入队,因为他们默认是不过滤 4.5 实现单机断点续爬

改写网易招聘爬虫,该爬虫就是一个经典的基于url地址的增量式爬虫

5. 实现分布式爬虫 5.1 分析demo中代码

打开example-project项目中的myspider_redis.py文件

通过观察代码:

继承自父类为RedisSpider增加了一个redis_key的键,没有start_urls,因为分布式中,如果每台电脑都请求一次start_url就会重复多了__init__方法,该方法不是必须的,可以手动指定allow_domains启动方法: 在每个节点正确的目录下执行scrapy crawl 爬虫名,使该节点的scrapy_redis爬虫程序就位在共用的redis中 lpush redis_key 'start_url',使全部节点真正的开始运行 settings.py中关键的配置 DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"SCHEDULER = "scrapy_redis.scheduler.Scheduler"SCHEDULER_PERSIST = TrueITEM_PIPELINES = { 'example.pipelines.ExamplePipeline': 300, 'scrapy_redis.pipelines.RedisPipeline': 400,}REDIS_URL = "redis://127.0.0.1:6379" 5.2 动手实现分布式爬虫

改写tencent爬虫为分布式爬虫

注意:启动方式发生改变

6. 小结

scrapy_redis的含义和能够实现的功能

scrapy是框架scrapy_redis是scrapy的组件scrapy_redis能够实现断点续爬和分布式爬虫

scrapy_redis流程和实现原理

在scrapy框架流程的基础上,把存储request对象放到了redis的有序集合中,利用该有序集合实现了请求队列并对request对象生成指纹对象,也存储到同一redis的集合中,利用request指纹避免发送重复的请求

request对象进入队列的条件

request的指纹不在集合中request的dont_filter为True,即不过滤

request指纹的实现

请求方法排序后的请求地址排序并处理过的请求体或空字符串用hashlib.sha1()对以上内容进行加密

scarpy_redis实现增量式爬虫、布式爬虫

对setting进行如下设置 DUPEFILTER_CLASS = “scrapy_redis.dupefilter.RFPDupeFilter”SCHEDULER = “scrapy_redis.scheduler.Scheduler”SCHEDULER_PERSIST = TrueITEM_PIPELINES = {‘scrapy_redis.pipelines.RedisPipeline’: 400,}REDIS_URL = “redis://127.0.0.1:6379” # 请正确配置REDIS_URL 爬虫文件中的爬虫类继承RedisSpider类爬虫类中redis_key替代了start_urls启动方式不同 通过scrapy crawl spider启动爬虫后,向redis_key放入一个或多个起始url(lpush或rpush都可以),才能够让scrapy_redis爬虫运行 除了以上差异点以外,scrapy_redis爬虫和scrapy爬虫的使用方法都是一样的

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。