摘要:所以我模仿這些爬蟲框架的優(yōu)勢,以盡量簡單的原則,搭配實際上是開發(fā)了這套輕量級爬蟲框架。將下載器,解析器,調(diào)度器,數(shù)據(jù)處理器注入核心成為對象。提供對爬蟲進(jìn)行管理監(jiān)控。每個腳本被認(rèn)為是一個,確定一個任務(wù)。
??現(xiàn)在有很多爬蟲框架,比如scrapy、webmagic、pyspider都可以在爬蟲工作中使用,也可以直接通過requests+beautifulsoup來寫一些個性化的小型爬蟲腳本。但是在實際爬取過程當(dāng)中,爬蟲框架各自有優(yōu)勢和缺陷。比如scrapy,它的功能強(qiáng)大,但過于強(qiáng)大的功能也許反而讓新手無所適從,并且它采用twisted異步框架開發(fā),對新手來說源碼難以理解,項目難于調(diào)試。所以我模仿這些爬蟲框架的優(yōu)勢,以盡量簡單的原則,搭配gevent(實際上是grequests)開發(fā)了這套輕量級爬蟲框架。
downloader是下載器。
processor是解析器。
scheduler是調(diào)度器。
pipeline是數(shù)據(jù)處理器。
將下載器,解析器,調(diào)度器,數(shù)據(jù)處理器注入核心core成為spider對象。
通過manager管理spider對象
manager透過webapi提供外部訪問/控制接口
主要特點框架代碼結(jié)構(gòu)簡單易用,易于修改。新手、老鳥皆可把控。
采用gevent實現(xiàn)并發(fā)操作,與scrapy的twisted相比,代碼更容易理解。
完全模塊化的設(shè)計,強(qiáng)大的可擴(kuò)展性。
使用方式和結(jié)構(gòu)參考了scrapy和webmagic。對有接觸過這兩個框架的朋友非常友好。
不采用命令行來啟動爬蟲,方便調(diào)試。
對數(shù)據(jù)的解析模塊并沒有集成,可以自由使用beautifulsoup、lxml、pyquery、html5lib等等各種解析器進(jìn)行數(shù)據(jù)抽取。
集成代理換IP功能。
支持高并發(fā)采集數(shù)據(jù)。
支持分布式。
支持增量爬取。
支持爬取js動態(tài)渲染的頁面(加載SeleniumDownLoader即可)。
提供webapi對爬蟲進(jìn)行管理、監(jiān)控。
提供即時爬蟲的集成思路和結(jié)構(gòu)。
安裝pip install sasila準(zhǔn)備
請準(zhǔn)備好您的redis服務(wù)器進(jìn)行調(diào)度。
并在settings.py文件中 寫入您的redis服務(wù)器地址
REDIS_HOST = "localhost" REDIS_PORT = 6379構(gòu)建processor(解析器)
#!/usr/bin/env python # -*- coding: utf-8 -*- from bs4 import BeautifulSoup as bs from sasila.system_normal.processor.base_processor import BaseProcessor from sasila.system_normal.downloader.http.spider_request import Request from sasila.system_normal.spider.request_spider import RequestSpider class Mzi_Processor(BaseProcessor): spider_id = "mzi_spider" spider_name = "mzi_spider" allowed_domains = ["mzitu.com"] start_requests = [Request(url="http://www.mzitu.com/", priority=0)] @checkResponse def process(self, response): soup = bs(response.m_response.content, "lxml") print soup.title.string href_list = soup.select("a") for href in href_list: yield Request(url=response.nice_join(href["href"]))
寫法與scrapy幾乎一樣
所有的解析器都繼承自 BaseProcessor ,默認(rèn)入口解析函數(shù)為def process(self, response)。
為該解析器設(shè)置spider_id和spider_name,以及限定域名。
初始爬取請求為 start_requests,構(gòu)建Request對象,該對象支持GET、POST方法,支持優(yōu)先級,設(shè)置回調(diào)函數(shù)等等所有構(gòu)建request對象的一切屬性。默認(rèn)回調(diào)函數(shù)為 process。
可以使用@checkResponse裝飾器對返回的 response 進(jìn)行校驗并記錄異常日志。你也可以定義自己的裝飾器。
解析函數(shù)因為使用 yield 關(guān)鍵字,所以是一個生成器。當(dāng) yield 返回 Request 對象,則會將 Request 對象推入調(diào)度器等待調(diào)度繼續(xù)進(jìn)行爬取。若 yield 不是返回 Request 對象則會進(jìn)入 pipeline , pipeline 將對數(shù)據(jù)進(jìn)行清洗入庫等操作。
與scrapy相似,sasila同樣提供LinkExtractor的方式來提取鏈接,以下是用LinkExtractor的方式構(gòu)造processor下載妹子圖的示例
#!/usr/bin/env python # -*- coding: utf-8 -*- from sasila.system_normal.processor.base_processor import BaseProcessor, Rule, LinkExtractor from sasila.system_normal.downloader.http.spider_request import Request import os import uuid class MezituProcessor(BaseProcessor): spider_id = "mzitu" spider_name = "mzitu" allowed_domains = ["mzitu.com", "meizitu.net"] start_requests = [Request(url="http://www.mzitu.com/xinggan/")] rules = ( Rule(LinkExtractor(regex_str=r"http://i.meizitu.net/d{4}/d{2}/[0-9a-z]+.jpg"),callback="save", priority=3), Rule(LinkExtractor(regex_str=r"http://www.mzitu.com/d+"), priority=1), Rule(LinkExtractor(regex_str=r"http://www.mzitu.com/d+/d+"), priority=2), Rule(LinkExtractor(regex_str=r"http://www.mzitu.com/xinggan/page/d+"), priority=0), ) def save(self, response): if response.m_response: if not os.path.exists("img"): os.mkdir("img") with open("img/" + str(uuid.uuid1()) + ".jpg", "wb") as fs: fs.write(response.m_response.content) print("download success!")
LinkExtractor的構(gòu)造方式為
LinkExtractor(regex_str=None, css_str=None, process_value=None)
提供正則表達(dá)式提取方式:regex_str
提供css選擇器提取方式:css_str
也可以自定義process_value來提取鏈接,其中process_value是一個生成器
若使用此方式構(gòu)造processor,請不要定義默認(rèn)入口函數(shù)def process(self, response)
構(gòu)建pipeline該pipeline獲取數(shù)據(jù)后將數(shù)據(jù)轉(zhuǎn)為json格式,并輸出到屏幕
from sasila.system_normal.pipeline.base_pipeline import ItemPipeline import json class ConsolePipeline(ItemPipeline): def process_item(self, item): print json.dumps(item).decode("unicode-escape")構(gòu)建spider(爬蟲對象)
通過注入 processor 生成spider對象
from sasila.system_normal.spider.request_spider import RequestSpider spider = RequestSpider(Mzi_Processor())
RequestSpider對象包含批下載數(shù)量 batch_size,下載間隔 time_sleep,使用代理 use_proxy 等一切必要的屬性
RequestSpider(processor=None, downloader=None, use_proxy=False,scheduler=None,batch_size=None,time_sleep=None)
本項目集成使用代理IP的功能,只要在構(gòu)建RequestSpider時將 use_proxy 設(shè)置為 True,并在腳本同級目錄下放置proxy.txt文件即可。你也可以在settings.py文件中寫入代理IP文件路徑。
PROXY_PATH_REQUEST = "proxy/path"
proxy.txt文件中請寫入代理IP,格式為:IP,端口號。若該代理IP有賬號密碼,在末尾追加賬號密碼即可。
127.0.0.1,8080 127.0.0.2,8080,user,pwd 127.0.0.3,8080,user,pwd
RequestSpider已經(jīng)默認(rèn)設(shè)置好了 downloader 和 scheduler,如果不滿意,可以自己進(jìn)行定制。
可以為spider設(shè)置 downloader 和 pipeline 甚至 scheduler
spider = spider.set_pipeline(ConsolePipeline())
可以通過該方式啟動爬蟲
spider.start()
也可以將spider注入manager進(jìn)行管理
from sasila.system_normal.manager import manager from sasila import system_web manager.set_spider(spider) system_web.start()
訪問 http://127.0.0.1:5000/slow_sp... 來啟動爬蟲。
訪問 http://127.0.0.1:5000/slow_sp... 來停止爬蟲。
訪問 http://127.0.0.1:5000/slow_sp... 來查看爬蟲詳細(xì)信息。
可以為downloader加載登錄器(loginer),在使用downloader的時候使用loginer進(jìn)行登錄獲取cookies,再進(jìn)行爬取
也可以自己定義一個cookie池,批量進(jìn)行登錄并將登錄成功的cookies放進(jìn)cookie池中隨時進(jìn)行取用。項目中暫時沒有這些功能。歡迎pull request~
架構(gòu)任務(wù)由 scheduler 發(fā)起調(diào)度,downloader 抓取網(wǎng)頁內(nèi)容, processor 執(zhí)行預(yù)先編寫的py腳本,輸出結(jié)果或產(chǎn)生新的提鏈任務(wù)(發(fā)往 scheduler),形成閉環(huán)。
每個腳本被認(rèn)為是一個spider,spiderid確定一個任務(wù)。
downloader
1.method, header, cookie, proxy,timeout 等等抓取調(diào)度控制。
2.可以通過適配類似 phantomjs 的webkit引擎支持渲染。
processor
1.靈活運用pyquery,beautifulsoup等解析頁面。
2.在腳本中完全控制調(diào)度抓取的各項參數(shù)。
3.可以向后鏈傳遞信息。
4.異常捕獲。
scheduler
1.任務(wù)優(yōu)先級。
2.對任務(wù)進(jìn)行監(jiān)控。
3.對任務(wù)進(jìn)行去重等操作。
4.支持增量。
webApi
1.對爬蟲進(jìn)行增刪改查等操作。
即時爬蟲是可以通過api調(diào)用,傳入需要爬取的頁面或者需求,即時爬取數(shù)據(jù)并返回結(jié)果?,F(xiàn)階段開發(fā)并不完善。僅提供思路參考。示例核心代碼在 sasila.system_instant 中。
為啥叫Sasila?作為一個wower,你可以猜到嗎ヾ( ̄▽ ̄)
聯(lián)系方式如果對使用有疑問,或者有想法,歡迎加入討論群:602909155交流~
項目地址
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/40628.html
摘要:一個爬蟲框架的雛形,應(yīng)該包含調(diào)度器隊列請求對象等。我們平時寫的爬蟲程序,連最基本的框架都不具備。這樣,不僅開發(fā)效率會提高很多,而且爬蟲的健壯性也更強(qiáng)。支持多種消息隊列如。將抓取任務(wù)分發(fā)給進(jìn)行抓取,執(zhí)行并得到響應(yīng)隨后將響應(yīng)發(fā)送給。 showImg(https://segmentfault.com/img/remote/1460000015557057); 為什么要使用爬蟲框架 在我們平常...
摘要:那在屆有哪些被封神的庫呢,今天就給大家介紹十個堪稱殺手級別的工具包。總之,是一款非常強(qiáng)大且易用的網(wǎng)絡(luò)請求庫。地址最好用的框架。圖像處理,該庫是你的不二之選。 Pyt...
摘要:那在屆有哪些被封神的庫呢,今天就給大家介紹十個堪稱殺手級別的工具包。該庫是在之上完善的,自此請求就變得異常的簡單,一行代碼即可搞定。這是最流行的網(wǎng)絡(luò)爬蟲框架庫,沒有之一。最好用的框架。圖像處理,該庫是你的不二之選。 文 |?豆豆 來源:Python 技術(shù)「ID: pythonall」 ...
摘要:各個爬蟲的節(jié)點通過注冊到從而實現(xiàn)爬蟲集群的管理。是一款基于等框架實現(xiàn)的通用爬蟲框架。爬蟲集群的監(jiān)控包含了和。用于實現(xiàn)爬蟲的業(yè)務(wù)邏輯,可以添加到,由來管理各個的生命周期。ZooKeeper showImg(https://user-gold-cdn.xitu.io/2019/5/27/16af702ccb4a3d84); ZooKeeper 是一個開源的分布式協(xié)調(diào)服務(wù),ZooKeeper框架...
摘要:下載器下載器負(fù)責(zé)獲取頁面數(shù)據(jù)并提供給引擎,而后提供給。下載器中間件下載器中間件是在引擎及下載器之間的特定鉤子,處理傳遞給引擎的。一旦頁面下載完畢,下載器生成一個該頁面的,并將其通過下載中間件返回方向發(fā)送給引擎。 作者:xiaoyu微信公眾號:Python數(shù)據(jù)科學(xué)知乎:Python數(shù)據(jù)分析師 在爬蟲的路上,學(xué)習(xí)scrapy是一個必不可少的環(huán)節(jié)。也許有好多朋友此時此刻也正在接觸并學(xué)習(xí)sc...
閱讀 2082·2023-04-25 21:11
閱讀 2971·2021-09-30 09:47
閱讀 2283·2021-09-24 09:48
閱讀 4445·2021-08-23 09:43
閱讀 903·2019-08-30 15:54
閱讀 571·2019-08-28 18:01
閱讀 1409·2019-08-27 10:55
閱讀 595·2019-08-27 10:55