摘要:所以我模仿這些爬蟲框架的優勢,以盡量簡單的原則,搭配實際上是開發了這套輕量級爬蟲框架。將下載器,解析器,調度器,數據處理器注入核心成為對象。提供對爬蟲進行管理監控。每個腳本被認為是一個,確定一個任務。
??現在有很多爬蟲框架,比如scrapy、webmagic、pyspider都可以在爬蟲工作中使用,也可以直接通過requests+beautifulsoup來寫一些個性化的小型爬蟲腳本。但是在實際爬取過程當中,爬蟲框架各自有優勢和缺陷。比如scrapy,它的功能強大,但過于強大的功能也許反而讓新手無所適從,并且它采用twisted異步框架開發,對新手來說源碼難以理解,項目難于調試。所以我模仿這些爬蟲框架的優勢,以盡量簡單的原則,搭配gevent(實際上是grequests)開發了這套輕量級爬蟲框架。
downloader是下載器。
processor是解析器。
scheduler是調度器。
pipeline是數據處理器。
將下載器,解析器,調度器,數據處理器注入核心core成為spider對象。
通過manager管理spider對象
manager透過webapi提供外部訪問/控制接口
主要特點框架代碼結構簡單易用,易于修改。新手、老鳥皆可把控。
采用gevent實現并發操作,與scrapy的twisted相比,代碼更容易理解。
完全模塊化的設計,強大的可擴展性。
使用方式和結構參考了scrapy和webmagic。對有接觸過這兩個框架的朋友非常友好。
不采用命令行來啟動爬蟲,方便調試。
對數據的解析模塊并沒有集成,可以自由使用beautifulsoup、lxml、pyquery、html5lib等等各種解析器進行數據抽取。
集成代理換IP功能。
支持高并發采集數據。
支持分布式。
支持增量爬取。
支持爬取js動態渲染的頁面(加載SeleniumDownLoader即可)。
提供webapi對爬蟲進行管理、監控。
提供即時爬蟲的集成思路和結構。
安裝pip install sasila準備
請準備好您的redis服務器進行調度。
并在settings.py文件中 寫入您的redis服務器地址
REDIS_HOST = "localhost" REDIS_PORT = 6379構建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 ,默認入口解析函數為def process(self, response)。
為該解析器設置spider_id和spider_name,以及限定域名。
初始爬取請求為 start_requests,構建Request對象,該對象支持GET、POST方法,支持優先級,設置回調函數等等所有構建request對象的一切屬性。默認回調函數為 process。
可以使用@checkResponse裝飾器對返回的 response 進行校驗并記錄異常日志。你也可以定義自己的裝飾器。
解析函數因為使用 yield 關鍵字,所以是一個生成器。當 yield 返回 Request 對象,則會將 Request 對象推入調度器等待調度繼續進行爬取。若 yield 不是返回 Request 對象則會進入 pipeline , pipeline 將對數據進行清洗入庫等操作。
與scrapy相似,sasila同樣提供LinkExtractor的方式來提取鏈接,以下是用LinkExtractor的方式構造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的構造方式為
LinkExtractor(regex_str=None, css_str=None, process_value=None)
提供正則表達式提取方式:regex_str
提供css選擇器提取方式:css_str
也可以自定義process_value來提取鏈接,其中process_value是一個生成器
若使用此方式構造processor,請不要定義默認入口函數def process(self, response)
構建pipeline該pipeline獲取數據后將數據轉為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")構建spider(爬蟲對象)
通過注入 processor 生成spider對象
from sasila.system_normal.spider.request_spider import RequestSpider spider = RequestSpider(Mzi_Processor())
RequestSpider對象包含批下載數量 batch_size,下載間隔 time_sleep,使用代理 use_proxy 等一切必要的屬性
RequestSpider(processor=None, downloader=None, use_proxy=False,scheduler=None,batch_size=None,time_sleep=None)
本項目集成使用代理IP的功能,只要在構建RequestSpider時將 use_proxy 設置為 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已經默認設置好了 downloader 和 scheduler,如果不滿意,可以自己進行定制。
可以為spider設置 downloader 和 pipeline 甚至 scheduler
spider = spider.set_pipeline(ConsolePipeline())
可以通過該方式啟動爬蟲
spider.start()
也可以將spider注入manager進行管理
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... 來查看爬蟲詳細信息。
可以為downloader加載登錄器(loginer),在使用downloader的時候使用loginer進行登錄獲取cookies,再進行爬取
也可以自己定義一個cookie池,批量進行登錄并將登錄成功的cookies放進cookie池中隨時進行取用。項目中暫時沒有這些功能。歡迎pull request~
架構任務由 scheduler 發起調度,downloader 抓取網頁內容, processor 執行預先編寫的py腳本,輸出結果或產生新的提鏈任務(發往 scheduler),形成閉環。
每個腳本被認為是一個spider,spiderid確定一個任務。
downloader
1.method, header, cookie, proxy,timeout 等等抓取調度控制。
2.可以通過適配類似 phantomjs 的webkit引擎支持渲染。
processor
1.靈活運用pyquery,beautifulsoup等解析頁面。
2.在腳本中完全控制調度抓取的各項參數。
3.可以向后鏈傳遞信息。
4.異常捕獲。
scheduler
1.任務優先級。
2.對任務進行監控。
3.對任務進行去重等操作。
4.支持增量。
webApi
1.對爬蟲進行增刪改查等操作。
即時爬蟲是可以通過api調用,傳入需要爬取的頁面或者需求,即時爬取數據并返回結果。現階段開發并不完善。僅提供思路參考。示例核心代碼在 sasila.system_instant 中。
為啥叫Sasila?作為一個wower,你可以猜到嗎ヾ( ̄▽ ̄)
聯系方式如果對使用有疑問,或者有想法,歡迎加入討論群:602909155交流~
項目地址
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/40628.html
摘要:一個爬蟲框架的雛形,應該包含調度器隊列請求對象等。我們平時寫的爬蟲程序,連最基本的框架都不具備。這樣,不僅開發效率會提高很多,而且爬蟲的健壯性也更強。支持多種消息隊列如。將抓取任務分發給進行抓取,執行并得到響應隨后將響應發送給。 showImg(https://segmentfault.com/img/remote/1460000015557057); 為什么要使用爬蟲框架 在我們平常...
摘要:那在屆有哪些被封神的庫呢,今天就給大家介紹十個堪稱殺手級別的工具包。總之,是一款非常強大且易用的網絡請求庫。地址最好用的框架。圖像處理,該庫是你的不二之選。 Pyt...
摘要:那在屆有哪些被封神的庫呢,今天就給大家介紹十個堪稱殺手級別的工具包。該庫是在之上完善的,自此請求就變得異常的簡單,一行代碼即可搞定。這是最流行的網絡爬蟲框架庫,沒有之一。最好用的框架。圖像處理,該庫是你的不二之選。 文 |?豆豆 來源:Python 技術「ID: pythonall」 ...
摘要:各個爬蟲的節點通過注冊到從而實現爬蟲集群的管理。是一款基于等框架實現的通用爬蟲框架。爬蟲集群的監控包含了和。用于實現爬蟲的業務邏輯,可以添加到,由來管理各個的生命周期。ZooKeeper showImg(https://user-gold-cdn.xitu.io/2019/5/27/16af702ccb4a3d84); ZooKeeper 是一個開源的分布式協調服務,ZooKeeper框架...
摘要:下載器下載器負責獲取頁面數據并提供給引擎,而后提供給。下載器中間件下載器中間件是在引擎及下載器之間的特定鉤子,處理傳遞給引擎的。一旦頁面下載完畢,下載器生成一個該頁面的,并將其通過下載中間件返回方向發送給引擎。 作者:xiaoyu微信公眾號:Python數據科學知乎:Python數據分析師 在爬蟲的路上,學習scrapy是一個必不可少的環節。也許有好多朋友此時此刻也正在接觸并學習sc...
閱讀 2077·2023-04-25 21:11
閱讀 2966·2021-09-30 09:47
閱讀 2277·2021-09-24 09:48
閱讀 4434·2021-08-23 09:43
閱讀 899·2019-08-30 15:54
閱讀 566·2019-08-28 18:01
閱讀 1402·2019-08-27 10:55
閱讀 591·2019-08-27 10:55