PySpider踩坑記

PySpider

沒有用過框架寫爬蟲赊堪,有人推薦了pyspider,我也沒有和別的框架比對,就直接上手先用了负溪。

使用感受

框架的封裝性帶來的優(yōu)缺點在這里顯示的淋漓精致...

優(yōu)點

  • 爬蟲該有的都有了——網站入口逃沿;分頁查詢婴渡;解析網頁幻锁;保存數(shù)據(還可以發(fā)消息);
  • 爬取時間間隔設置边臼;
  • 網頁有效期維護哄尔;
  • 爬取多線程設置;
  • 對無頭瀏覽器phantomjs的支持柠并;
  • 支持web ui上調試代碼岭接,需求不高的情況下類似在線編寫代碼;
  • 提供了一鍵式獲取css selector按鈕臼予,方便獲取元素鸣戴。

缺點

  • 本身不支持xpath方式解析;
  • 使用回調方式來運行pipline粘拾,框架把控回調的執(zhí)行窄锅,不夠靈活,多層爬取時需要遞歸方式調用index_page缰雇,導致代碼可能比較混亂入偷;
  • 提供的css selector提取器實用性一般,有一些復雜一點的拿不到械哟;
  • 任務運行/關閉很多時候令人迷惑疏之;
  • 對phantomjs的調用會對電腦cpu造成較大壓力,據說是每次爬取都會啟停一個phantomjs線程暇咆;
  • web ui沒有刪除任務的選項体捏,也沒有清空爬取到的數(shù)據的選項;
  • web ui的方式編碼很費勁糯崎,我都是在IDE里面寫好再復制上去几缭;
  • web ui不能像本地IDE一樣識別新加入的包。

版本:

pyspider v0.3.10
python 3.6.5

安裝啟動

參考官方Quick start可以很快上手: http://docs.pyspider.org/en/latest/Quickstart/

# 一鍵安裝pyspider
pip install pyspider

# 會在當前目錄下建立data文件夾沃呢,保存任務相關代碼年栓,數(shù)據,任務進度等薄霜,如果換了路徑啟動就找不到了
# 啟動所有pyspider的組件某抓,更多命令可以 pyspider help
pyspider all 

之后可以在 http://localhost:5000/ 看到啟動了一個web ui,用來調試和運行pyspider的

框架機制補充

爬取

on_start并非只是個入口惰瓜,pyspider之后要爬取url不會超過on_start執(zhí)行的url的子集
換言之否副,不能爬取on_start的url的父路徑。

多層次路徑爬取

  • on_start只會執(zhí)行一次崎坊,如果on_start中有循環(huán)調用crawl方法备禀,則只會執(zhí)行最后一條
  • index_page可以遞歸調用自身,可以使用這個特性來爬取多層路徑

phantomjs

  • phantomjs 將其{phantomjs_home/bin}添加到環(huán)境變量path中即可,重啟pyspider即可曲尸,注意要環(huán)境變量生效pyspider才能找到phantomjs赋续。
  • 瀏覽器中能獲取到的dom,pyspider獲取不到另患,可能是需要設置phantomjs的調用

一些小特性

這里不一一羅列API了纽乱,主要講我使用過程中碰到的一些特性

from pyspider.libs.base_handler import *


# pyspider的實現(xiàn)類需要繼承BaseHandler,實現(xiàn)基本的幾個接口
class Handler(BaseHandler):  
    # 放一些self.crawl函數(shù)請求頁面時的http請求頭:referer昆箕,user-agent等
    crawl_config = {
    }

    # pipline的起點鸦列,這里請求的url最好是下文請求的父級url,否則爬取不了鹏倘,我出過這樣的問題薯嗤,不知道是不是就是這樣的機制
    # 只會執(zhí)行一次,即如果on_start中有循環(huán)self.crawl第股,只會執(zhí)行最后一次
    @every(minutes=24 * 60)  # 任務運行之間的間隔应民,用來不停的補采過期的數(shù)據
    def on_start(self):  
        # 爬取網頁的核心函數(shù),支持phantomjs解析夕吻,需配置fetch_type='js'
        self.crawl('http://scrapy.org/', callback=self.index_page)

    #  理論上是爬取分頁的诲锹,但是如果有多層爬取也得靠index_page,需要在self.crawl中設置callback為index_page涉馅,形成遞歸归园,當然如果邏輯不通,用if-else分開即可稚矿,如果有人發(fā)現(xiàn)了更好的多層爬取的方式庸诱,拜托告訴我一聲...
    @config(age=10 * 24 * 60 * 60)  # 爬取結果的有效期
    def index_page(self, response):
        # response.doc得到一個pyquery對象,和操作一個jquery對象相似晤揣,相關api看pyquery官網即可
        for each in response.doc('a[href^="http"]').items():
            self.crawl(each.attr.href, callback=self.detail_page)

    # 輸出解析結果桥爽,如果用默認的sqlite,只能return一個dict昧识,如果自己復寫了on_result钠四,就可以隨意返回了
    @config(priority=2)
    def detail_page(self, response):
        return {
            "url": response.url,
            "title": response.doc('title').text(),
        }

    # 自定義結果處理方式
    def on_result(self, result):
        ...
        # 處理結果
        ...

    # task結束時調用
    def on_finished(self, response, task):
        ...
        # 任務關閉時的操作,可以用來關數(shù)據庫連接之類
        ...

啟停任務

  • 在 localhost:5000 的web ui上修改狀態(tài)即可
  • running和debug狀態(tài)沒有區(qū)別
  • rate/brust rate表示每秒爬取的網頁個數(shù)可以為小數(shù)跪楞,這樣可以放慢task調度缀去,brust理解為并發(fā)數(shù)

其他

  • pyspider啟動后在當前目錄下生成data目錄,project相關的數(shù)據甸祭,換目錄啟動會找不到之前的數(shù)據
  • pyspider自帶了sqlite缕碎,但是要保存到別的數(shù)據庫需要自己建連接,插入池户,關連接咏雌,相關的包自己導入后重啟pyspider即可
  • project和task的信息在web-ui中不能修改凡怎,但是可以通過數(shù)據庫工具打開data/{db_name}.db的文件,刪除或者修改
  • 可以通過web ui的result頁面的on_process項的內容做簡單的debug
  • phantomjs的環(huán)境變量有一種可以立即生效的辦法处嫌,不贅述啦
  • web ui中看似好的縮進可能是不合法的栅贴, 編輯器問題斟湃,復制出來格式化好了再粘貼回去

參考:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末熏迹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子凝赛,更是在濱河造成了極大的恐慌注暗,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件墓猎,死亡現(xiàn)場離奇詭異捆昏,居然都是意外死亡,警方通過查閱死者的電腦和手機毙沾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門骗卜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人左胞,你說我怎么就攤上這事寇仓。” “怎么了烤宙?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵遍烦,是天一觀的道長。 經常有香客問我躺枕,道長服猪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任拐云,我火速辦了婚禮罢猪,結果婚禮上,老公的妹妹穿的比我還像新娘叉瘩。我一直安慰自己膳帕,他們只是感情好,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布房揭。 她就那樣靜靜地躺著备闲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪捅暴。 梳的紋絲不亂的頭發(fā)上恬砂,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天,我揣著相機與錄音蓬痒,去河邊找鬼泻骤。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的狱掂。 我是一名探鬼主播演痒,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼趋惨!你這毒婦竟也來了鸟顺?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤器虾,失蹤者是張志新(化名)和其女友劉穎讯嫂,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體兆沙,經...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡欧芽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了葛圃。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片千扔。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖库正,靈堂內的尸體忽然破棺而出曲楚,到底是詐尸還是另有隱情,我是刑警寧澤诀诊,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布洞渤,位于F島的核電站,受9級特大地震影響属瓣,放射性物質發(fā)生泄漏载迄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一抡蛙、第九天 我趴在偏房一處隱蔽的房頂上張望护昧。 院中可真熱鬧,春花似錦粗截、人聲如沸惋耙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绽榛。三九已至,卻和暖如春婿屹,著一層夾襖步出監(jiān)牢的瞬間灭美,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工昂利, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留届腐,地道東北人铁坎。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像犁苏,于是被迫代替她去往敵國和親硬萍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,116評論 25 707
  • 1.ios高性能編程 (1).內層 最小的內層平均值和峰值(2).耗電量 高效的算法和數(shù)據結構(3).初始化時...
    歐辰_OSR閱讀 29,385評論 8 265
  • 我曾因你一句 無心的承諾 熬紅了雙眼 卻換來你無情的背影 2016.9.16
    橙子_Lin閱讀 265評論 0 0
  • 最近因為加入一個新的團隊围详,才開始認真的關注關于編寫高質量代碼的話題朴乖,學習總結的同時,記錄下這段讓自己再一次認真學習...
    JavaQ閱讀 606評論 1 3
  • 序 人---作為一種群居動物短曾,根據“能量級”的不同寒砖,逐漸形成了圈子赐劣。 圈子嫉拐,就像圍城,里面和外面有著明顯的界限魁兼。 ...
    圣掿凡閱讀 284評論 0 0