scrapy處理python爬蟲(chóng)調(diào)度詳解
學(xué)習(xí)了簡(jiǎn)單的知識(shí)點(diǎn),就會(huì)想要向有難度的問(wèn)題挑戰(zhàn),這里必須要夸一夸小伙伴們。不過(guò)我們今天不需要做什么程序的測(cè)試,只用簡(jiǎn)單的兩個(gè)代碼對(duì)比,小伙伴們就能在其中體會(huì)兩者的不同和難易程度。scrapy能否適合處理python爬蟲(chóng)調(diào)度的問(wèn)題,小編直接說(shuō)出答案小伙伴們也不能馬上信服,下面就讓我們?cè)谑纠姓覍ご鸢赴伞?/p>
總的來(lái)說(shuō),需要使用代碼來(lái)爬一些數(shù)據(jù)的大概分為兩類(lèi)人:
非程序員,需要爬一些數(shù)據(jù)來(lái)做畢業(yè)設(shè)計(jì)、市場(chǎng)調(diào)研等等,他們可能連 Python 都不是很熟;
程序員,需要設(shè)計(jì)大規(guī)模、分布式、高穩(wěn)定性的爬蟲(chóng)系統(tǒng),對(duì)他們來(lái)說(shuō),語(yǔ)言都無(wú)所謂的,更別說(shuō)用不用框架了。
對(duì)于一個(gè)任何一個(gè)已經(jīng)入門(mén)的程序員來(lái)說(shuō),Python 都算不上一個(gè)很復(fù)雜的語(yǔ)言,除了不用大括號(hào)可能讓一些人感覺(jué)有些不適應(yīng)之外,基本上看看語(yǔ)法上手就能寫(xiě)了。但是恰恰是因?yàn)槲覀兌际抢纤緳C(jī)了,所以不能體會(huì)到使用一門(mén)編程語(yǔ)言對(duì)于外行來(lái)說(shuō)可能『比登天還難』。如果不用 scrapy,可能我只需要這樣:
import requests def main(): for i in range(100): rsp = requests.get(f"http://www.example.com/{i}.html") with open("example-{i}.txt", "w") as f: f.write(rsp.text) if __name__ == "__main__": main()
就寫(xiě)好了一個(gè)簡(jiǎn)單的爬蟲(chóng),而使用 scrapy 呢,大概需要這樣吧:
import scrapy class QuotesSpider(scrapy.Spider): name = 'quotes' def start_requests(self): urls = [ 'http://quotes.toscrape.com/page/1/', 'http://quotes.toscrape.com/page/2/' ] for url in urls: yield scrapy.Request(url=url, callback=self.parse) def parse(self, response): page = response.url.split('/')[-2] filename = 'quotes-%s.html' % page with open(filename, 'wb') as f: f.write(response.body) self.log('Save file %s' % filename)
先不說(shuō)代碼增長(zhǎng)了一倍有余,初學(xué)者會(huì)問(wèn)到這些問(wèn)題:什么是 class?為什么類(lèi)還有參數(shù)?啊,什么是繼承?yield 又是什么鬼,那個(gè) scrapy.Request 又是啥?這些都是負(fù)擔(dān)。
既然要開(kāi)發(fā)大型爬蟲(chóng)系統(tǒng),那么其中很重要的一部分就是爬蟲(chóng)的調(diào)度了。一種比較簡(jiǎn)單的模式是 scheduler 作為 master,全局調(diào)度。另一種模式?jīng)]有 master,所有的爬蟲(chóng) worker 都是對(duì)等的。在實(shí)際生產(chǎn)中顯然是第一種用的更多。
顯然 scheduler 這部分是不能再用一個(gè)爬蟲(chóng)框架來(lái)實(shí)現(xiàn)的,連主循環(huán)都沒(méi)有咋寫(xiě)邏輯呢?我們可能還要實(shí)現(xiàn)增量爬取,或者消費(fèi)業(yè)務(wù)方發(fā)來(lái)的爬取請(qǐng)求等各種業(yè)務(wù),這塊顯然是在 scheduler 里面的,那么這個(gè)爬蟲(chóng)系統(tǒng)無(wú)非是 scheduler 分發(fā)任務(wù)給各個(gè) worker 來(lái)抓取。worker 還可以使用 scrapy 實(shí)現(xiàn),但是呢,這個(gè) worker 其實(shí)已經(jīng)弱化為一層薄薄的 downloader 了,那我要他干嘛呢?scrapy 的核心邏輯也不過(guò)是個(gè)深度或者廣度優(yōu)先的遍歷而已,少一個(gè)依賴(lài)不好么……
爬蟲(chóng)的工作量要么在反爬,要么在調(diào)度等業(yè)務(wù)邏輯,本身只是一個(gè) requests.get 而已,scrapy 提供的種種抽象對(duì)于初學(xué)者太復(fù)雜,大型系統(tǒng)又用不上,所以個(gè)人不推薦使用包括但不限于 scrapy 在內(nèi)的所有爬蟲(chóng)框架。
內(nèi)容擴(kuò)展:
Scrapy模塊
1、scheduler:用來(lái)存放url隊(duì)列
2、downloader:發(fā)送請(qǐng)求
3、spiders:提取數(shù)據(jù)和url
4、itemPipeline:數(shù)據(jù)保存
from twisted.internet import reactor, defer from scrapy.crawler import CrawlerRunner from scrapy.utils.log import configure_logging import time import logging from scrapy.utils.project import get_project_settings #在控制臺(tái)打印日志 configure_logging() #CrawlerRunner獲取settings.py里的設(shè)置信息 runner = CrawlerRunner(get_project_settings()) @defer.inlineCallbacks def crawl(): while True: logging.info("new cycle starting") yield runner.crawl("xxxxx") #1s跑一次 time.sleep(1) reactor.stop() crawl() reactor.run()
到此這篇關(guān)于scrapy處理python爬蟲(chóng)調(diào)度詳解的文章就介紹到這了,更多相關(guān)scrapy適合處理python爬蟲(chóng)調(diào)度嗎內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 自動(dòng)在Windows中運(yùn)行Python腳本并定時(shí)觸發(fā)功能實(shí)現(xiàn)
- 實(shí)現(xiàn)Windows下設(shè)置定時(shí)任務(wù)來(lái)運(yùn)行python腳本
- 如何給windows設(shè)置定時(shí)任務(wù)并運(yùn)行python腳本
- python 實(shí)現(xiàn)定時(shí)任務(wù)的四種方式
- python獲取指定時(shí)間段內(nèi)特定規(guī)律的日期列表
- python中用Scrapy實(shí)現(xiàn)定時(shí)爬蟲(chóng)的實(shí)例講解
- Python爬蟲(chóng)定時(shí)計(jì)劃任務(wù)的幾種常見(jiàn)方法(推薦)
- python實(shí)現(xiàn)定時(shí)發(fā)送郵件到指定郵箱
- python實(shí)現(xiàn)定時(shí)發(fā)送郵件
- python腳本定時(shí)發(fā)送郵件
- Python實(shí)現(xiàn)FTP文件定時(shí)自動(dòng)下載的步驟
- python爬蟲(chóng)調(diào)度器用法及實(shí)例代碼
- 簡(jiǎn)單的Python調(diào)度器Schedule詳解
- python編寫(xiě)網(wǎng)頁(yè)爬蟲(chóng)腳本并實(shí)現(xiàn)APScheduler調(diào)度
- Python使用定時(shí)調(diào)度任務(wù)的方式
相關(guān)文章
python opencv 實(shí)現(xiàn)對(duì)圖像邊緣擴(kuò)充
今天小編就為大家分享一篇python opencv 實(shí)現(xiàn)對(duì)圖像邊緣擴(kuò)充,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01Pytorch相關(guān)知識(shí)介紹與應(yīng)用
最近又重拾了機(jī)器學(xué)習(xí)的相關(guān)技術(shù),在本科畢設(shè)的階段下學(xué)習(xí)使用了Tensorflow 2.x工具,當(dāng)時(shí)也是不求甚解,直接拿來(lái)用了,但現(xiàn)在已經(jīng)有充足的時(shí)間、精力和基礎(chǔ)知識(shí)來(lái)重新學(xué)習(xí)一下2022-11-11簡(jiǎn)單學(xué)習(xí)Python多進(jìn)程Multiprocessing
這篇文章主要和大家一起簡(jiǎn)單的學(xué)習(xí)Python多進(jìn)程Multiprocessing ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08淺談pytorch中的nn.Sequential(*net[3: 5])是啥意思
這篇文章主要介紹了pytorch中的nn.Sequential(*net[3: 5])是啥意思,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04Python實(shí)現(xiàn)的爬蟲(chóng)刷回復(fù)功能示例
這篇文章主要介紹了Python實(shí)現(xiàn)的爬蟲(chóng)刷回復(fù)功能,結(jié)合實(shí)例形式分析了Python2.7基于爬蟲(chóng)實(shí)現(xiàn)的模擬登陸、刷帖、回復(fù)等功能相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-06-06Django如何實(shí)現(xiàn)網(wǎng)站注冊(cè)用戶(hù)郵箱驗(yàn)證功能
這篇文章主要介紹了Django如何實(shí)現(xiàn)網(wǎng)站注冊(cè)用戶(hù)郵箱驗(yàn)證功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08Python中flatten( )函數(shù)及函數(shù)用法詳解
flatten是numpy.ndarray.flatten的一個(gè)函數(shù),即返回一個(gè)一維數(shù)組。這篇文章主要介紹了Python中flatten( )函數(shù),需要的朋友可以參考下2018-11-11七個(gè)生態(tài)系統(tǒng)核心庫(kù)[python自學(xué)收藏]
無(wú)論你是想快速入手Python,還是想成為數(shù)據(jù)分析大神或者機(jī)器學(xué)習(xí)大佬,亦或者對(duì)Python代碼進(jìn)行優(yōu)化,本文的python庫(kù)都能為你提供一些幫助2021-08-08