Scrapy框架——CrawlSpider類爬蟲案例

Scrapy框架中分兩類爬蟲,Spider類和CrawlSpider類皮仁。
此案例采用的是CrawlSpider類實現(xiàn)爬蟲魂爪。

它是Spider的派生類,Spider類的設(shè)計原則是只爬取start_url列表中的網(wǎng)頁哩盲,而CrawlSpider類定義了一些規(guī)則(rule)來提供跟進(jìn)link的方便的機(jī)制前方,從爬取的網(wǎng)頁中獲取link并繼續(xù)爬取的工作更適合狈醉。

創(chuàng)建項目指令:

    scrapy startproject tencent 

模版創(chuàng)建:

scrapy genspider crawl -t tencent 'hr.tencent.com' 

CrawlSpider繼承于Spider類,除了繼承過來的屬性外(name惠险、allow_domains)苗傅,還提供了新的屬性和方法:

LinkExtractors
class scrapy.linkextractors.LinkExtractor

Link Extractors 的目的很簡單: 提取鏈接?
每個LinkExtractor有唯一的公共方法是 extract_links(),它接收一個 Response 對象莺匠,并返回一個 scrapy.link.Link 對象金吗。
Link Extractors要實例化一次,并且 extract_links 方法會根據(jù)不同的 response 調(diào)用多次提取鏈接?

        主要參數(shù):
        
            allow:滿足括號中“正則表達(dá)式”的值會被提取趣竣,如果為空摇庙,則全部匹配。
            
            deny:與這個正則表達(dá)式(或正則表達(dá)式列表)不匹配的URL一定不提取遥缕。
            
            allow_domains:會被提取的鏈接的domains卫袒。
            
            deny_domains:一定不會被提取鏈接的domains。
            
            restrict_xpaths:使用xpath表達(dá)式单匣,和allow共同作用過濾鏈接夕凝。
rules

在rules中包含一個或多個Rule對象,每個Rule對爬取網(wǎng)站的動作定義了特定操作户秤。如果多個rule匹配了相同的鏈接码秉,則根據(jù)規(guī)則在本集合中被定義的順序,第一個會被使用鸡号。

參數(shù)介紹:
link_extractor:是一個Link Extractor對象转砖,用于定義需要提取的鏈接。

    callback: 從link_extractor中每獲取到鏈接時鲸伴,參數(shù)所指定的值作為回調(diào)函數(shù)府蔗,該回調(diào)函數(shù)接受一個response作為其第一個參數(shù)。
    
    注意:當(dāng)編寫爬蟲規(guī)則時汞窗,避免使用parse作為回調(diào)函數(shù)姓赤。由于CrawlSpider使用parse方法來實現(xiàn)其邏輯,如果覆蓋了 parse方法仲吏,crawl spider將會運行失敗不铆。
    
    follow:是一個布爾(boolean)值,指定了根據(jù)該規(guī)則從response提取的鏈接是否需要跟進(jìn)蜘矢。 如果callback為None狂男,follow 默認(rèn)設(shè)置為True ,否則默認(rèn)為False品腹。
    
    process_links:指定該spider中哪個的函數(shù)將會被調(diào)用岖食,從link_extractor中獲取到鏈接列表時將會調(diào)用該函數(shù)。該方法主要用來過濾舞吭。
    
    process_request:指定該spider中哪個的函數(shù)將會被調(diào)用泡垃, 該規(guī)則提取到每個request時都會調(diào)用該函數(shù)析珊。 (用來過濾request)

以下是案例代碼:

item文件

    import scrapy
    
    class TencentItem(scrapy.Item):
        # 職位
        name = scrapy.Field()
        # 詳情鏈接
        positionlink = scrapy.Field()
        #職位類別
        positiontype = scrapy.Field()
        # 人數(shù)
        peoplenum = scrapy.Field()
        # 工作地點
        worklocation = scrapy.Field()
        # 發(fā)布時間
        publish = scrapy.Field()

pipeline文件

    import json
    class TencentPipeline(object):
    
        def __init__(self):
            self.filename = open("tencent.json", "w")
        def process_item(self, item, spider):
            text = json.dumps(dict(item), ensure_ascii = False)  + ",\n"
            self.filename.write(text.encode("utf-8"))
            return item
        def close_spider(self, spider):
            self.filename.close()

setting文件

    BOT_NAME = 'tencent'
    
    SPIDER_MODULES = ['tencent.spiders']
    NEWSPIDER_MODULE = 'tencent.spiders'
    LOG_FILE = 'tenlog.log'
    LOG_LEVEL = 'DEBUG'
    LOG_ENCODING = 'utf-8'
    
    ROBOTSTXT_OBEY = True
    
    DEFAULT_REQUEST_HEADERS = {
      'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    #   'Accept-Language': 'en',
    }
    
    
    ITEM_PIPELINES = {
       'tencent.pipelines.TencentPipeline': 300,
    }

spider文件

    # -*- coding: utf-8 -*-
    import scrapy
    # 導(dǎo)入鏈接匹配規(guī)則類,用來提取符合規(guī)則的鏈接
    from scrapy.linkextractors import LinkExtractor
    from scrapy.spiders import CrawlSpider, Rule
    from tencent.items import TencentItem
    
    class TenecntSpider(CrawlSpider):
        name = 'tencent1'
        # 可選蔑穴,加上會有一個爬去的范圍
        allowed_domains = ['hr.tencent.com']
        start_urls = ['http://hr.tencent.com/position.php?&start=0#a']
        # response中提取 鏈接的匹配規(guī)則忠寻,得出是符合的鏈接
        pagelink = LinkExtractor(allow=('start=\d+'))
    
        print (pagelink)
        # 可以寫多個rule規(guī)則
        rules = [
            # follow = True需要跟進(jìn)的時候加上這句。
            # 有callback的時候就有follow
            # 只要符合匹配規(guī)則存和,在rule中都會發(fā)送請求奕剃,同是調(diào)用回調(diào)函數(shù)處理響應(yīng)
            # rule就是批量處理請求
            Rule(pagelink, callback='parse_item', follow=True),
        ]
    
        # 不能寫parse方法,因為源碼中已經(jīng)有了捐腿,回覆蓋導(dǎo)致程序不能跑
        def parse_item(self, response):
            for each in response.xpath("http://tr[@class='even'] | //tr[@class='odd']"):
                # 把數(shù)據(jù)保存在創(chuàng)建的對象中纵朋,用字典的形式
    
                item = TencentItem()
                # 職位
                # each.xpath('./td[1]/a/text()')返回的是列表,extract轉(zhuǎn)為unicode字符串茄袖,[0]取第一個
                item['name'] = each.xpath('./td[1]/a/text()').extract()[0]
                # 詳情鏈接
                item['positionlink'] = each.xpath('./td[1]/a/@href').extract()[0]
                # 職位類別
                item['positiontype'] = each.xpath("./td[2]/text()").extract()[0]
                # 人數(shù)
                item['peoplenum'] = each.xpath('./td[3]/text()').extract()[0]
                # 工作地點
                item['worklocation'] = each.xpath('./td[4]/text()').extract()[0]
                # 發(fā)布時間
                item['publish'] = each.xpath('./td[5]/text()').extract()[0]
    
                # 把數(shù)據(jù)交給管道文件
                yield item

結(jié)果展示:
http://p1.bpimg.com/4851/0bc14ca5a6c502be.png

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末操软,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子宪祥,更是在濱河造成了極大的恐慌聂薪,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蝗羊,死亡現(xiàn)場離奇詭異藏澳,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)耀找,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門笆载,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人涯呻,你說我怎么就攤上這事∧逡” “怎么了复罐?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長雄家。 經(jīng)常有香客問我效诅,道長,這世上最難降的妖魔是什么趟济? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任乱投,我火速辦了婚禮,結(jié)果婚禮上顷编,老公的妹妹穿的比我還像新娘戚炫。我一直安慰自己,他們只是感情好媳纬,可當(dāng)我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布双肤。 她就那樣靜靜地躺著施掏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪茅糜。 梳的紋絲不亂的頭發(fā)上七芭,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機(jī)與錄音蔑赘,去河邊找鬼狸驳。 笑死,一個胖子當(dāng)著我的面吹牛缩赛,可吹牛的內(nèi)容都是我干的耙箍。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼峦筒,長吁一口氣:“原來是場噩夢啊……” “哼究西!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起物喷,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤卤材,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后峦失,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扇丛,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年尉辑,在試婚紗的時候發(fā)現(xiàn)自己被綠了帆精。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡隧魄,死狀恐怖卓练,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情购啄,我是刑警寧澤襟企,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站狮含,受9級特大地震影響顽悼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜几迄,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一蔚龙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧映胁,春花似錦木羹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽务荆。三九已至,卻和暖如春穷遂,著一層夾襖步出監(jiān)牢的瞬間函匕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工蚪黑, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留盅惜,地道東北人。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓忌穿,卻偏偏與公主長得像抒寂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子掠剑,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,834評論 2 345

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

  • 總結(jié)一下之前的spider屈芜,總的來說,Spider類就是定義了如何爬取某個(或某些)網(wǎng)站朴译。包括了爬取的動作以及如何...
    王小魚鱻閱讀 1,226評論 0 2
  • scrapy是python最有名的爬蟲框架之一井佑,可以很方便的進(jìn)行web抓取,并且提供了很強(qiáng)的定制型眠寿,這里記錄簡單學(xué)...
    bomo閱讀 2,088評論 1 11
  • scrapy學(xué)習(xí)筆記(有示例版) 我的博客 scrapy學(xué)習(xí)筆記1.使用scrapy1.1創(chuàng)建工程1.2創(chuàng)建爬蟲模...
    陳思煜閱讀 12,655評論 4 46
  • Spiders Spider類定義了如何爬取某個網(wǎng)站躬翁。包括了爬取的動作(例如:是否跟進(jìn)鏈接)以及如何從網(wǎng)頁的內(nèi)容中...
    cnkai閱讀 1,488評論 1 4
  • 此刻,又混亂了盯拱。昨晚還好好的盒发,今天又這樣。額(°_°)… 還是自己頭腦里想的太多了狡逢,一邊是要好的朋友宁舰,一邊是未知的...
    聆聽藍(lán)色的精靈閱讀 267評論 0 3