pyspider的基本使用

1. 安裝

pip install pyspider

2. 啟動(dòng)

#直接輸入即可
pyspider

3. 錯(cuò)誤說明

3.1 pyspider報(bào)錯(cuò):TypeError: initialize() got an unexpected keyword argument ‘io_loop

錯(cuò)誤描述:
1溺健、pyspider是 0.39版本
2儡蔓、 安裝后運(yùn)行 出現(xiàn)錯(cuò)誤 TypeError: initialize() got an unexpected keyword argument ‘io_loop’

原因:python環(huán)境中强戴,默認(rèn)tornado版本是最新的5.0,在4.0之后就廢棄了io_loop參數(shù)啄育。

解決方法:

1、pip uninstall tornado

2、pip install tornado==4.1

3.2 錯(cuò)誤2

ssl599錯(cuò)誤

解決方法
在on_start()加validate_cert=False

def on_start(self):
   self.crawl('https://www.lagou.com/jobs/list_python%E7%88%AC%E8%99%AB?labelWords=&fromSearch=true&suginput=', callback=self.index_page, validate_cert=Flase)

4. 使用

這樣可以啟動(dòng) pyspider 的所有組件哮洽,包括 PhantomJS打却、ResultWorker杉适、Processer、Fetcher柳击、Scheduler淘衙、WebUI,這些都是 pysipder 運(yùn)行必備的組件腻暮。最后一行輸出 WebUI 運(yùn)行在 5000 端口上彤守√赫欤可以打開瀏覽器,輸入鏈接 http://localhost:5000具垫,這時(shí)我們會(huì)看到頁面侈离。

啟動(dòng)完成之后,在瀏覽器輸入筝蚕,localhost:5000


image.png

4.1創(chuàng)建項(xiàng)目

新建一個(gè)項(xiàng)目卦碾,點(diǎn)擊右邊的 Create 按鈕,在彈出的浮窗里輸入項(xiàng)目的名稱和爬取的鏈接起宽,再點(diǎn)擊 create 按鈕洲胖,這樣就成功創(chuàng)建了一個(gè)項(xiàng)目。


image.png

接下來會(huì)看到 pyspider 的項(xiàng)目編輯和調(diào)試頁面坯沪。


image.png

左側(cè)就是代碼的調(diào)試頁面绿映,點(diǎn)擊左側(cè)右上角的 run 單步調(diào)試爬蟲程序,在左側(cè)下半部分可以預(yù)覽當(dāng)前的爬取頁面腐晾。右側(cè)是代碼編輯頁面叉弦,我們可以直接編輯代碼和保存代碼,不需要借助于 IDE藻糖。
注意右側(cè)淹冰,pyspider 已經(jīng)幫我們生成了一段代碼。代碼如下所示:

from pyspider.libs.base_handler import *


class Handler(BaseHandler):
    crawl_config = {
    }

    @every(minutes=24 * 60)
    def on_start(self):
        self.crawl('http://travel.qunar.com/travelbook/list.htm', callback=self.index_page)

    @config(age=10 * 24 * 60 * 60)
    def index_page(self, response):
        for each in response.doc('a[href^="http"]').items():
            self.crawl(each.attr.href, callback=self.detail_page)

    @config(priority=2)
    def detail_page(self, response):
        return {
            "url": response.url,
            "title": response.doc('title').text(),
        }

這里的 Handler 就是 pyspider 爬蟲的主類巨柒,我們可以在此處定義爬取樱拴、解析、存儲(chǔ)的邏輯洋满。整個(gè)爬蟲的功能只需要一個(gè) Handler 即可完成疹鳄。

接下來我們可以看到一個(gè) crawl_config 屬性。我們可以將本項(xiàng)目的所有爬取配置統(tǒng)一定義到這里芦岂,如定義 Headers瘪弓、設(shè)置代理等,配置之后全局生效禽最。

然后腺怯,on_start() 方法是爬取入口,初始的爬取請(qǐng)求會(huì)在這里產(chǎn)生川无,該方法通過調(diào)用 crawl() 方法即可新建一個(gè)爬取請(qǐng)求呛占,第一個(gè)參數(shù)是爬取的 URL,這里自動(dòng)替換成我們定義的 URL懦趋。crawl() 方法還有一個(gè) callback晾虑,它指定了這個(gè)頁面爬取成功后用哪個(gè)方法進(jìn)行解析,代碼中指定為 index_page() 方法,即如果這個(gè) URL 對(duì)應(yīng)的頁面爬取成功了帜篇,那 Response 將交給 index_page() 方法解析糙捺。

index_page() 方法恰好接收這個(gè) Response 參數(shù),Response 對(duì)接了 pyquery笙隙。我們直接調(diào)用 doc() 方法傳入相應(yīng)的 CSS 選擇器洪灯,就可以像 pyquery 一樣解析此頁面,代碼中默認(rèn)是 a[href^="http"]竟痰,也就是說該方法解析了頁面的所有鏈接签钩,然后將鏈接遍歷,再次調(diào)用了 crawl() 方法生成了新的爬取請(qǐng)求坏快,同時(shí)再指定了 callback 為 detail_page铅檩,意思是說這些頁面爬取成功了就調(diào)用 detail_page() 方法解析。這里莽鸿,index_page() 實(shí)現(xiàn)了兩個(gè)功能昧旨,一是將爬取的結(jié)果進(jìn)行解析,二是生成新的爬取請(qǐng)求富拗。

detail_page() 同樣接收 Response 作為參數(shù)臼予。detail_page() 抓取的就是詳情頁的信息鸣戴,就不會(huì)生成新的請(qǐng)求啃沪,只對(duì) Response 對(duì)象做解析,解析之后將結(jié)果以字典的形式返回窄锅。當(dāng)然我們也可以進(jìn)行后續(xù)處理创千,如將結(jié)果保存到數(shù)據(jù)庫。

接下來入偷,我們改寫一下代碼來實(shí)現(xiàn)攻略的爬取追驴。

5. 爬取首頁

點(diǎn)擊左欄右上角的 run 按鈕,即可看到頁面下方 follows 便會(huì)出現(xiàn)一個(gè)標(biāo)注疏之,其中包含數(shù)字 1 殿雪,這代表有新的爬取請(qǐng)求產(chǎn)生。


image.png

左欄左上角會(huì)出現(xiàn)當(dāng)前 run 的配置文章锋爪,這里有一個(gè) callback 為 on_start丙曙,這說明點(diǎn)擊 run 之后實(shí)際是執(zhí)行了 on_start() 方法。在 on_start() 方法中其骄,我們利用 crawl() 方法生成一個(gè)爬取請(qǐng)求亏镰,那下方 follows 部分的數(shù)字 1 就代表了這一個(gè)爬取請(qǐng)求。

點(diǎn)擊下方的 follows 按鈕拯爽,即可看到生成的爬取請(qǐng)求的鏈接索抓。每個(gè)鏈接的右側(cè)還有一個(gè)箭頭按鈕。

image.png

image.png

點(diǎn)擊該箭頭,我們就可以對(duì)此鏈接進(jìn)行爬取逼肯,也就是爬取攻略的首頁內(nèi)容耸黑。

image.png

上方的 callback 已經(jīng)變成了 index_page,這就代表當(dāng)前運(yùn)行了 index_page() 方法汉矿。index_page() 接收到的 response 參數(shù)就是剛才生成的第一個(gè)爬取請(qǐng)求的 Response 對(duì)象崎坊。index_page() 方法通過調(diào)用 doc() 方法,傳入提取所有 a 節(jié)點(diǎn)的 CSS 選擇器洲拇,然后獲取 a 節(jié)點(diǎn)的屬性 href奈揍,這樣實(shí)際上就是獲取了第一個(gè)爬取頁面中的所有鏈接。然后在 index_page() 方法里遍歷了所有鏈接赋续,同時(shí)調(diào)用 crawl() 方法男翰,就把這一個(gè)個(gè)的鏈接構(gòu)造成新的爬取請(qǐng)求了。所以最下方 follows 按鈕部分有 231 的數(shù)字標(biāo)記纽乱,這代表新生成了 231 個(gè)爬取請(qǐng)求蛾绎,同時(shí)這些請(qǐng)求的 URL 都呈現(xiàn)在當(dāng)前的頁面了。

再點(diǎn)擊下方的 web 按鈕鸦列,即可預(yù)覽當(dāng)前爬取結(jié)果的頁面租冠。

image.png

這里編輯器并不是很友好,顯示的頁面只有一小些薯嗤,但并不會(huì)妨礙我們的抓取顽爹。當(dāng)前看到的頁面結(jié)果和瀏覽器看到的幾乎是完全一致的,在這里我們可以方便地查看頁面請(qǐng)求的結(jié)果骆姐。

點(diǎn)擊 html 按鈕即可查看當(dāng)前頁面的源代碼镜粤。

image.png

我們剛才在 index_page() 方法中提取了所有的鏈接并生成了新的爬取請(qǐng)求。但是很明顯要爬取的肯定不是所有鏈接玻褪,只需要攻略詳情的頁面鏈接就夠了肉渴,所以我們要修改一下當(dāng)前 index_page() 里提取鏈接時(shí)的 CSS 選擇器。

image.png

在右側(cè)代碼選中要更改的區(qū)域带射,點(diǎn)擊左欄的右箭頭同规,此時(shí)在上方出現(xiàn)的標(biāo)題的 CSS 選擇器就會(huì)被替換到右側(cè)代碼中。

image.png

這樣就成功完成了 CSS 選擇器的替換窟社,非常方便券勺。
重新點(diǎn)擊左欄右上角的 run 按鈕,即可重新執(zhí)行 index_page() 方法桥爽。此時(shí)的 follows 就變成了 10 個(gè)朱灿,也就是說現(xiàn)在我們提取的只有當(dāng)前頁面的 10 個(gè)攻略。

image.png

我們現(xiàn)在抓取的只是第一頁的內(nèi)容钠四,還需要抓取后續(xù)頁面盗扒,所以還需要一個(gè)爬取鏈接跪楞,即爬取下一頁的攻略列表頁面。我們?cè)倮?crawl() 方法添加下一頁的爬取請(qǐng)求侣灶,在 index_page() 方法里面添加如下代碼甸祭,然后點(diǎn)擊 save() 保存。

next = response.doc('.next').attr.href
self.crawl(next, callback=self.index_page)

利用 CSS 選擇器選中下一頁的鏈接褥影,獲取它的 href 屬性池户,也就獲取了頁面的 URL。然后將該 URL 傳給 crawl() 方法凡怎,同時(shí)指定回調(diào)函數(shù)校焦,注意這里回調(diào)函數(shù)仍然指定為 index_page() 方法,因?yàn)橄乱豁摰慕Y(jié)構(gòu)與此頁相同统倒。

重新點(diǎn)擊 run 按鈕寨典,這時(shí)就可以看到 11 個(gè)爬取請(qǐng)求。follows 按鈕上會(huì)顯示 11房匆,這就代表我們成功添加了下一頁的爬取請(qǐng)求耸成。

image.png

現(xiàn)在,索引列表頁面的解析過程我們就完成了浴鸿。

5 爬取詳情頁

任意選取一個(gè)詳情頁進(jìn)入井氢,點(diǎn)擊前 10 個(gè)爬取請(qǐng)求的任意一個(gè)的右箭頭,執(zhí)行詳情頁的爬取岳链。

image.png

切換到 Web 頁面預(yù)覽效果花竞,頁面下拉之后,頭圖正文中的一些圖片一直顯示加載中宠页。

image.png

查看源碼左胞,我們沒有看到 img 節(jié)點(diǎn)寇仓。

出現(xiàn)此現(xiàn)象的原因是 pyspider 默認(rèn)發(fā)送 HTTP 請(qǐng)求举户,請(qǐng)求的 HTML 文檔本身就不包含 img 節(jié)點(diǎn)。但是在瀏覽器中我們看到了圖片遍烦,這是因?yàn)檫@張圖片是后期經(jīng)過 JavaScrpit 出現(xiàn)的俭嘁。那么,我們?cè)撊绾潍@取呢服猪?

幸運(yùn)的是供填,pyspider 內(nèi)部對(duì)接了 PhatomJS,那么我們只需要修改一個(gè)參數(shù)即可罢猪。

我們將 index_page() 中生成抓取詳情頁的請(qǐng)求方法添加一個(gè)參數(shù) fetch_type近她,改寫的 index_page() 變?yōu)槿缦聝?nèi)容:

def index_page(self, response):
        for each in response.doc('li > .tit > a').items():
            self.crawl(each.attr.href, callback=self.detail_page, fetch_type='js')
        next = response.doc('.next').attr.href
        self.crawl(next, callback=self.index_page)

接下來,我們來試試它的抓取效果膳帕。

點(diǎn)擊左欄上方的左箭頭返回粘捎,重新調(diào)用 index_page() 方法生成新的爬取詳情頁的 Request薇缅。

image.png

再點(diǎn)擊新生成的詳情頁的 Request 的爬取按鈕,這時(shí)我們便可以看到頁面變成了這樣子攒磨。

image.png

圖片被成功渲染處理泳桦,這就是啟用了 PhantomJS 渲染后的結(jié)果。只需要添加一個(gè) fetch_type 參數(shù)即可娩缰,這非常方便灸撰。
最后就是將詳情頁面中需要的信息提取處理。最終的 detail_page() 方法改寫如下:

  def detail_page(self, response):
        return {
            "url": response.url,
            "title": response.doc('#booktitle').text(),
            "date": response.doc('.when .data').text(),
            "day": response.doc('.howlong .data').text(),
            "who": response.doc('.who .data').text(),
            "text": response.doc('#b_panel_schedule').text(),
            "image": response.doc('.cover_img').attr.src,
        }

我們分別提取了頁面的鏈接拼坎、標(biāo)題浮毯、出行日期、出現(xiàn)天數(shù)泰鸡、人物亲轨、攻略正文、頭圖信息鸟顺,將這些信息構(gòu)造成一個(gè)字典惦蚊。
重新運(yùn)行,即可發(fā)現(xiàn)輸出結(jié)果讯嫂。

左欄中輸出了最終構(gòu)造的字典信息蹦锋,這就是一篇攻略的抓取結(jié)果。

6 啟動(dòng)爬蟲

返回爬蟲的主頁面欧芽,將爬蟲的 status 設(shè)置成 DEBUG 或 RUNNING莉掂,點(diǎn)擊右側(cè)的 Run 按鈕即可開始爬取。

image.png

在最左側(cè)我們可以定義項(xiàng)目的分組千扔,以方便管理憎妙。rate/burst 代表當(dāng)前的爬取速率。rate 代表 1 秒發(fā)出多少個(gè)請(qǐng)求曲楚,burst 相當(dāng)于流量控制中的令牌桶算法的令牌數(shù)厘唾,rate 和 burst 設(shè)置的越大,爬取速率越快龙誊,當(dāng)然速率需要考慮本機(jī)性能和爬取過快被封的問題抚垃。process 中的 5m、1h趟大、1d 指 的是最近 5 分鹤树、1 小時(shí)、1 天內(nèi)的請(qǐng)求情況逊朽,all 代表所有的請(qǐng)求情況罕伯。請(qǐng)求由不同顏色表示、藍(lán)色的代表等待被執(zhí)行的請(qǐng)求叽讳,綠色的代表成功的請(qǐng)求追他,黃色的代表請(qǐng)求失敗后等待重試的請(qǐng)求熊昌,紅色的代表失敗次數(shù)過多而被忽略的請(qǐng)求,這樣可以直觀知道爬取的進(jìn)度和請(qǐng)求情況湿酸。

image.png

點(diǎn)擊 Active Tasks婿屹,即可查看最近請(qǐng)求的詳細(xì)狀況。

image.png

點(diǎn)擊 Result推溃,即可查看所有的爬取結(jié)果昂利。

image.png

點(diǎn)擊右上角的按鈕,即可獲取數(shù)據(jù)的 JSON铁坎、CSV 格式蜂奸。

本文來源

鏈接:http://www.reibang.com/p/c70ba728cb36
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市硬萍,隨后出現(xiàn)的幾起案子扩所,更是在濱河造成了極大的恐慌,老刑警劉巖朴乖,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祖屏,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡买羞,警方通過查閱死者的電腦和手機(jī)袁勺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來畜普,“玉大人期丰,你說我怎么就攤上這事〕蕴簦” “怎么了钝荡?”我有些...
    開封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)舶衬。 經(jīng)常有香客問我埠通,道長(zhǎng),這世上最難降的妖魔是什么约炎? 我笑而不...
    開封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任植阴,我火速辦了婚禮蟹瘾,結(jié)果婚禮上圾浅,老公的妹妹穿的比我還像新娘。我一直安慰自己憾朴,他們只是感情好狸捕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著众雷,像睡著了一般灸拍。 火紅的嫁衣襯著肌膚如雪做祝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天鸡岗,我揣著相機(jī)與錄音混槐,去河邊找鬼。 笑死轩性,一個(gè)胖子當(dāng)著我的面吹牛声登,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播揣苏,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼悯嗓,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了卸察?” 一聲冷哼從身側(cè)響起脯厨,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎坑质,沒想到半個(gè)月后合武,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡涡扼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年眯杏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片壳澳。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡岂贩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出巷波,到底是詐尸還是另有隱情萎津,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布抹镊,位于F島的核電站锉屈,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏垮耳。R本人自食惡果不足惜颈渊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望终佛。 院中可真熱鬧俊嗽,春花似錦、人聲如沸铃彰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽牙捉。三九已至竹揍,卻和暖如春敬飒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背芬位。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工无拗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人昧碉。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓蓝纲,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親晌纫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子税迷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 輔導(dǎo)班現(xiàn)在幾乎成了最賺錢的行業(yè)之一箭养,有些輔導(dǎo)班甚至到了“一座難求”的地步,引得家長(zhǎng)哥牍、學(xué)生紛紛投身毕泌,爭(zhēng)先恐后。 ...
    吾苡閱讀 579評(píng)論 0 5