成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【Sasila】一個簡單易用的爬蟲框架

yacheng / 2282人閱讀

摘要:所以我模仿這些爬蟲框架的優(yōu)勢,以盡量簡單的原則,搭配實際上是開發(fā)了這套輕量級爬蟲框架。將下載器,解析器,調(diào)度器,數(shù)據(jù)處理器注入核心成為對象。提供對爬蟲進(jìn)行管理監(jiān)控。每個腳本被認(rèn)為是一個,確定一個任務(wù)。

??現(xiàn)在有很多爬蟲框架,比如scrapywebmagic、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)參考了scrapywebmagic。對有接觸過這兩個框架的朋友非常友好。

不采用命令行來啟動爬蟲,方便調(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è)置好了 downloaderscheduler,如果不滿意,可以自己進(jìn)行定制。

可以為spider設(shè)置 downloaderpipeline 甚至 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

相關(guān)文章

  • 高效率爬蟲框架之pyspider

    摘要:一個爬蟲框架的雛形,應(yīng)該包含調(diào)度器隊列請求對象等。我們平時寫的爬蟲程序,連最基本的框架都不具備。這樣,不僅開發(fā)效率會提高很多,而且爬蟲的健壯性也更強(qiáng)。支持多種消息隊列如。將抓取任務(wù)分發(fā)給進(jìn)行抓取,執(zhí)行并得到響應(yīng)隨后將響應(yīng)發(fā)送給。 showImg(https://segmentfault.com/img/remote/1460000015557057); 為什么要使用爬蟲框架 在我們平常...

    MasonEast 評論0 收藏0
  • 一批,那些你不得不知 Python 殺手級框架

    摘要:那在屆有哪些被封神的庫呢,今天就給大家介紹十個堪稱殺手級別的工具包。總之,是一款非常強(qiáng)大且易用的網(wǎng)絡(luò)請求庫。地址最好用的框架。圖像處理,該庫是你的不二之選。 Pyt...

    zeyu 評論0 收藏0
  • 一批,那些你不得不知 Python 殺手級框架!

    摘要:那在屆有哪些被封神的庫呢,今天就給大家介紹十個堪稱殺手級別的工具包。該庫是在之上完善的,自此請求就變得異常的簡單,一行代碼即可搞定。這是最流行的網(wǎng)絡(luò)爬蟲框架庫,沒有之一。最好用的框架。圖像處理,該庫是你的不二之選。 文 |?豆豆 來源:Python 技術(shù)「ID: pythonall」 ...

    ninefive 評論0 收藏0
  • 基于 ZooKeeper 實現(xiàn)爬蟲集群監(jiān)控

    摘要:各個爬蟲的節(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框架...

    Backache 評論0 收藏0
  • Python爬蟲之Scrapy學(xué)習(xí)(基礎(chǔ)篇)

    摘要:下載器下載器負(fù)責(zé)獲取頁面數(shù)據(jù)并提供給引擎,而后提供給。下載器中間件下載器中間件是在引擎及下載器之間的特定鉤子,處理傳遞給引擎的。一旦頁面下載完畢,下載器生成一個該頁面的,并將其通過下載中間件返回方向發(fā)送給引擎。 作者:xiaoyu微信公眾號:Python數(shù)據(jù)科學(xué)知乎:Python數(shù)據(jù)分析師 在爬蟲的路上,學(xué)習(xí)scrapy是一個必不可少的環(huán)節(jié)。也許有好多朋友此時此刻也正在接觸并學(xué)習(xí)sc...

    pkhope 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<