pyspider

pyspider是一個(gè)爬蟲(chóng)架構(gòu)的開(kāi)源化實(shí)現(xiàn)

主要的功能需求是:
  • 抓取、更新調(diào)度多站點(diǎn)的特定的頁(yè)面
  • 需要對(duì)頁(yè)面進(jìn)行結(jié)構(gòu)化信息提取
  • 靈活可擴(kuò)展香缺,穩(wěn)定可監(jiān)控 而這也是絕大多數(shù)python爬蟲(chóng)的需求 —— 定向抓取鹉动,結(jié)構(gòu)化化解析。但是面對(duì)結(jié)構(gòu)迥異的各種網(wǎng)站,單一的抓取模式并不一定能滿(mǎn)足懈玻,靈活的抓取控制是必須的。為了達(dá)到這個(gè)目的乾颁,單純的配置文件往往不夠靈活涂乌,于是,通過(guò)腳本去控制抓取是我最后的選擇英岭。 而去重調(diào)度湾盒,隊(duì)列,抓取诅妹,異常處理罚勾,監(jiān)控等功能作為框架,提供給抓取腳本吭狡,并保證靈活性尖殃。最后加上web的編輯調(diào)試環(huán)境,以及web任務(wù)監(jiān)控划煮,即成為了這套框架分衫。
pyspider的設(shè)計(jì)基礎(chǔ)是:以python腳本驅(qū)動(dòng)的抓取環(huán)模型爬蟲(chóng)
  • 通過(guò)python腳本進(jìn)行結(jié)構(gòu)化信息的提取,follow鏈接調(diào)度抓取控制般此,實(shí)現(xiàn)最大的靈活性
  • 通過(guò)web化的腳本編寫(xiě)蚪战、調(diào)試環(huán)境。web展現(xiàn)調(diào)度狀態(tài)
  • 抓取環(huán)模型成熟穩(wěn)定铐懊,模塊間相互獨(dú)立邀桑,通過(guò)消息隊(duì)列連接,從單進(jìn)程到多機(jī)分布式靈活拓展
安裝pyspider:

添加依賴(lài)

sudo apt-get install python python-dev python-distribute python-pip libcurl4-openssl-dev libxml2-dev libxslt1-dev python-lxml libssl-dev zlib1g-dev

sudo apt-get install phantomjs

pip3 install pyspider

啟動(dòng):

pyspider all

以鏈家為例 :

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# Created on 2019-01-09 14:03:20
# Project: lianjia

from pyspider.libs.base_handler import *
import json
import pymongo
import pymysql


class Handler(BaseHandler):
    #pyspider爬蟲(chóng)的主類(lèi)科乎,在這里進(jìn)行爬取壁畸,解析,和存儲(chǔ)數(shù)據(jù)
    
    #crawl_config:在這個(gè)參數(shù)中可以做全局的設(shè)置(UA,Headers,proxy..)
    crawl_config = {
        'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
        #'itags':'v2'
    }
    
    #創(chuàng)建mongodb數(shù)據(jù)庫(kù)連接
    mongo_client = pymongo.MongoClient('127.0.0.1',27017)
    #獲取要湊走的數(shù)據(jù)庫(kù)
    db = mongo_client['lianjia']
    #獲取數(shù)據(jù)庫(kù)下的集合
    col = db['lianjiacol']
    
    
    #創(chuàng)建數(shù)據(jù)庫(kù)連接
    mysql_cli = pymysql.Connect(
        '127.0.0.1','root','ljh1314',
        'lianjia',3306,charset='utf8'
    )
    #創(chuàng)建游標(biāo)
    cursor = mysql_cli.Cursor()

    @every(minutes=24 * 60)
    #定時(shí):每隔一天進(jìn)行重復(fù)請(qǐng)求(重新執(zhí)行on_start)
    def on_start(self):
        #crawl:根據(jù)crawl發(fā)起請(qǐng)求(url,proxy,itag,user-agent,headers,exetime,callback,save,parmas,data,fetch_type,)
        self.crawl('https://bj.lianjia.com/ershoufang/', callback=self.index_page)

    @config(age=10 * 24 * 60 * 60)
    def index_page(self, response):
        
        #response.doc:是一個(gè)pyquery對(duì)象
        #response.etree:返回的是一個(gè)lxml
        #提取每一個(gè)房源的詳情url地址
        hourse_infos = response.doc('ul.sellListContent li.clear.LOGCLICKDATA')
        
        for hourse in hourse_infos.items():
            detail_url = hourse('div.title a').attr.href
            self.crawl(detail_url,callback=self.detail_page)
            
        #提取下一頁(yè)發(fā)起請(qǐng)求
        #data = response.doc('div.page-box.house-lst-page-box').attr.page-data
        data = response.etree.xpath('//div[@class="page-box house-lst-page-box"]/@page-data')[0]
        print(data)
        json_data = json.loads(data)
        #print('nextdata',json_data)
        cur_page = int(json_data['curPage'])
        total_page = int(json_data['totalPage'])
        if cur_page < total_page:
            #發(fā)起下一頁(yè)請(qǐng)求
            next_page = cur_page+1
            next_url = 'https://bj.lianjia.com/ershoufang/pg%s/' % str(next_page)
            self.crawl(next_url,callback=self.index_page)
            
        #next_url = response.doc()
       # 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):
        print('二手房詳情獲取成功')
        #獲取二手房詳情的數(shù)據(jù)
        info = {}
        #標(biāo)題(獲取標(biāo)簽的屬性和文本)
        #info['title'] = response.doc('h1.main').attr.title
        info['title'] = response.doc('h1.main').text()
        #其他信息
        info['subTitle'] = response.doc('div.sub').text()
        #關(guān)注人數(shù)
        info['attenNum'] = response.doc('#favCount').text()
        #觀看人數(shù)
        info['cartCount'] = response.doc('#cartCount').text()
        #總價(jià)
        info['totalPrice'] = response.doc('div.price  .total').text()
        #單價(jià)
        info['price'] = response.doc('span.unitPriceValue').text()
        #規(guī)模
        info['model'] = response.doc('div.room .mainInfo').text()
        #樓層
        info['foolr'] = response.doc('div.room .subInfo').text()
        #小區(qū)
        info['communityName'] = response.doc('div.communityName a.info ').text()
        
        #print(info)
        
        return info
    
    def on_result(self,result):
        print('獲取到了結(jié)果',result)
        if result:
            try:
                #self.col.insert(result)
                sql = """
                INSERT INTO lianjiadb(%s)
                VALUES (%s)
                """ % (','.join(result.keys()),','.join(['%s']*len(result)))
                data = list(result.values())
                self.cursor.exectue(sql,data)
                print('數(shù)據(jù)存儲(chǔ)成功')
            except Exception as err:
                print('數(shù)據(jù)插入失敗',err)
        
        #return {
        #    "url": response.url,
        #    "title": response.doc('title').text(),
        #}


        ```
        
        
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末茅茂,一起剝皮案震驚了整個(gè)濱河市捏萍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌空闲,老刑警劉巖令杈,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異碴倾,居然都是意外死亡逗噩,警方通過(guò)查閱死者的電腦和手機(jī)掉丽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)异雁,“玉大人捶障,你說(shuō)我怎么就攤上這事「俚叮” “怎么了项炼?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)示绊。 經(jīng)常有香客問(wèn)我锭部,道長(zhǎng),這世上最難降的妖魔是什么耻台? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任空免,我火速辦了婚禮空另,結(jié)果婚禮上盆耽,老公的妹妹穿的比我還像新娘。我一直安慰自己扼菠,他們只是感情好摄杂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著循榆,像睡著了一般析恢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上秧饮,一...
    開(kāi)封第一講書(shū)人閱讀 51,165評(píng)論 1 299
  • 那天映挂,我揣著相機(jī)與錄音,去河邊找鬼盗尸。 笑死柑船,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的泼各。 我是一名探鬼主播鞍时,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼扣蜻!你這毒婦竟也來(lái)了逆巍?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤莽使,失蹤者是張志新(化名)和其女友劉穎锐极,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體芳肌,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡溪烤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年味咳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片檬嘀。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡槽驶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鸳兽,到底是詐尸還是另有隱情掂铐,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布揍异,位于F島的核電站全陨,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏衷掷。R本人自食惡果不足惜辱姨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望戚嗅。 院中可真熱鬧雨涛,春花似錦、人聲如沸懦胞。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)躏尉。三九已至蚯根,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間胀糜,已是汗流浹背颅拦。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留教藻,地道東北人距帅。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像怖竭,于是被迫代替她去往敵國(guó)和親锥债。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

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