Pyspider爬蟲簡單框架——鏈家網

pyspidercss

目錄html

pyspider簡單介紹python

pyspider的使用jquery

實戰git

 


 

 

pyspider簡單介紹github

  一個國人編寫的強大的網絡爬蟲系統並帶有強大的WebUI。採用Python語言編寫,分佈式架構,支持多種數據庫後端,web

強大的WebUI支持腳本編輯器,任務監視器,項目管理器以及結果查看器sql

官方文檔: http://docs.pyspider.org/en/latest/數據庫

開源地址: http://github.com/binux/pyspider後端

中文文檔: http://www.pyspider.cn/

pyspider框架的特性

  • python腳本控制,能夠使用用任何你喜歡的html解析包(內置pyquery)
  • WEB界面編寫調試腳本,啓停腳本,監控執行狀態,查看活動內容,獲取結果產出
  • 數據庫存儲支持MySQl,MongoDB,Redis,SQLite,Elasticsearch,PostgreSQL及SQLAlchemy
  • 隊列服務支持RabbitMQ,Beanstalk,Redis和Kombu
  • 支持抓取JavaScript的頁面
  • 組件可替換,支持單機/分佈式部署,支持Docker的部署
  • 強大的調度控制,支持超時重爬及優先級設置
  • 支持python2&3

 


 

pyspider的安裝

pip install pyspider
  • 安裝完成後運行,在cmd窗口輸入pyspider

 

pyspider的使用:

  • 在瀏覽器中輸入最後一行的IP和端口號。
  • 在web控制檯點create按鈕新建項目。

  • 保存後打開代碼編輯器(代碼編輯器默認有簡單的示例代碼)

  • 右側就是代碼編輯器,,之後能夠直接在這裏添加和修改代碼。代碼以下:

 

代碼分析:

  • def on_start(self)方法是入口代碼。當在web控制檯點擊run按鈕時會執行此方法。
  • self.crawl(url, callback=self.index_page)這個方法是調用API生成一個新的爬蟲任務,這個任務被添加到待爬取隊列
  • def index_page(self.response)這個方法獲取一個response對象。response.doc是pyquery對象的一個擴展方法。pyquery是一個相似於jquery的對象選擇器。
  • def detail_page(self, response)返回一個結果即對象。這個結果默認會被添加到resultdb數據庫(若是啓動時沒有指定數據庫默認調用sqlite數據庫)。也能夠重寫on_result(self,  result) 方法來指定保存位置。

  • 當完成腳本編寫,調試無誤後,請先保存腳本,而後返回控制檯首頁
  • 直接點擊項目狀態status那欄,把狀態由TTODO改爲debug或running
  • 最後點擊項目最右邊那個RUN按鈕啓動項目

  • 當progress那欄有數據顯示說明啓動成功。就能夠點擊右側的result查看結果了

技巧:

  • pyspider訪問https協議得網站是,會提示證書問題,須要設置validate_cert = False,屏蔽證書驗證
  • 預覽網頁得時候,可能會出現空白頁面,是由於pysipder不加載JavaScript代碼,用fetch_type='js',pyspider會自動調用phantomjs來渲染網頁。前提是電腦上已經安裝了phantomls.exe插件
  • 當須要刪除項目時,將status狀態改爲STOP,再將group寫上delete,pyspider默認在STOP的delete狀態下保存24小時後刪除

enable css selector helper能夠在點擊了web 的網頁預覽下,獲取網頁的css選擇器

點擊圖片箭頭的按鍵,就會生成對應css選擇器在光標所在的位置處

  • follows是根據代碼請求所跟進的url連接,點擊實現網頁跳轉
  • 當代碼調試出錯的時候,要回到最初的首頁開始從新調試

 

實戰

爬取鏈家網的信息:

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# Created on 2018-11-02 10:54:11
# Project: ddd

from pyspider.libs.base_handler import *


class Handler(BaseHandler):
    crawl_config = {
    }

    @every(minutes=24 * 60) # 設置爬取的時間間隔 def on_start(self):
        self.crawl('https://cs.lianjia.com/ershoufang/', callback=self.index_page, validate_cert = False) # 參數三是設置不驗證ssl證書

    @config(age=10 * 24 * 60 * 60) # 過時時間
    def index_page(self, response):
        for each in response.doc('.title > a').items():
            self.crawl(each.attr.href, callback=self.detail_page, validate_cert = False)

    @config(priority=2) # 優先級 數大極高 def detail_page(self, response):
        yield {
            'title': response.doc('.main').text(),
            'special': response.doc('.tags > .content').text(),
            'price': response.doc('.price > .total').text(),
            'sell point': response.doc('.baseattribute > .content').text()
        }

 

 結果:分別爬取了賣房的標題(title),特色(special),賣點(sell point)和價格(price),由於字典保存,因此無序

相關文章
相關標籤/搜索