(2018-05-21.Python從Zero到One)5蚕脏、(爬蟲)scrapy實戰(zhàn)項目__1.5.3(實戰(zhàn)項目三)新浪網(wǎng)分類資訊爬蟲

(實戰(zhàn)項目三)新浪網(wǎng)分類資訊爬蟲

爬取新浪網(wǎng)導航頁所有下所有大類、小類侦锯、小類里的子鏈接驼鞭,以及子鏈接頁面的新聞內(nèi)容。

效果演示圖:

day55_爬蟲-scrapy實戰(zhàn)項目-01.png

items.py

import scrapy
import sys
reload(sys)
sys.setdefaultencoding("utf-8")

class SinaItem(scrapy.Item):
    # 大類的標題 和 url
    parentTitle = scrapy.Field()
    parentUrls = scrapy.Field()

    # 小類的標題 和 子url
    subTitle = scrapy.Field()
    subUrls = scrapy.Field()

    # 小類目錄存儲路徑
    subFilename = scrapy.Field()

    # 小類下的子鏈接
    sonUrls = scrapy.Field()

    # 文章標題和內(nèi)容
    head = scrapy.Field()
    content = scrapy.Field()

spiders/sina.py

# -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-

from Sina.items import SinaItem
import scrapy
import os

import sys
reload(sys)
sys.setdefaultencoding("utf-8")

class SinaSpider(scrapy.Spider):
    name= "sina"
    allowed_domains= ["sina.com.cn"]
    start_urls= [
       "http://news.sina.com.cn/guide/"
    ]

    def parse(self, response):
        items= []
        # 所有大類的url 和 標題
        parentUrls = response.xpath('//div[@id=\"tab01\"]/div/h3/a/@href').extract()
        parentTitle = response.xpath("http://div[@id=\"tab01\"]/div/h3/a/text()").extract()

        # 所有小類的ur 和 標題
        subUrls  = response.xpath('//div[@id=\"tab01\"]/div/ul/li/a/@href').extract()
        subTitle = response.xpath('//div[@id=\"tab01\"]/div/ul/li/a/text()').extract()

        #爬取所有大類
        for i in range(0, len(parentTitle)):
            # 指定大類目錄的路徑和目錄名
            parentFilename = "./Data/" + parentTitle[i]

            #如果目錄不存在尺碰,則創(chuàng)建目錄
            if(not os.path.exists(parentFilename)):
                os.makedirs(parentFilename)

            # 爬取所有小類
            for j in range(0, len(subUrls)):
                item = SinaItem()

                # 保存大類的title和urls
                item['parentTitle'] = parentTitle[i]
                item['parentUrls'] = parentUrls[i]

                # 檢查小類的url是否以同類別大類url開頭终议,如果是返回True (sports.sina.com.cn 和 sports.sina.com.cn/nba)
                if_belong = subUrls[j].startswith(item['parentUrls'])

                # 如果屬于本大類,將存儲目錄放在本大類目錄下
                if(if_belong):
                    subFilename =parentFilename + '/'+ subTitle[j]
                    # 如果目錄不存在葱蝗,則創(chuàng)建目錄
                    if(not os.path.exists(subFilename)):
                        os.makedirs(subFilename)

                    # 存儲 小類url穴张、title和filename字段數(shù)據(jù)
                    item['subUrls'] = subUrls[j]
                    item['subTitle'] =subTitle[j]
                    item['subFilename'] = subFilename

                    items.append(item)

        #發(fā)送每個小類url的Request請求,得到Response連同包含meta數(shù)據(jù) 一同交給回調(diào)函數(shù) second_parse 方法處理
        for item in items:
            yield scrapy.Request( url = item['subUrls'], meta={'meta_1': item}, callback=self.second_parse)

    #對于返回的小類的url两曼,再進行遞歸請求
    def second_parse(self, response):
        # 提取每次Response的meta數(shù)據(jù)
        meta_1= response.meta['meta_1']

        # 取出小類里所有子鏈接
        sonUrls = response.xpath('//a/@href').extract()

        items= []
        for i in range(0, len(sonUrls)):
            # 檢查每個鏈接是否以大類url開頭皂甘、以.shtml結(jié)尾,如果是返回True
            if_belong = sonUrls[i].endswith('.shtml') and sonUrls[i].startswith(meta_1['parentUrls'])

            # 如果屬于本大類悼凑,獲取字段值放在同一個item下便于傳輸
            if(if_belong):
                item = SinaItem()
                item['parentTitle'] =meta_1['parentTitle']
                item['parentUrls'] =meta_1['parentUrls']
                item['subUrls'] = meta_1['subUrls']
                item['subTitle'] = meta_1['subTitle']
                item['subFilename'] = meta_1['subFilename']
                item['sonUrls'] = sonUrls[i]
                items.append(item)

        #發(fā)送每個小類下子鏈接url的Request請求偿枕,得到Response后連同包含meta數(shù)據(jù) 一同交給回調(diào)函數(shù) detail_parse 方法處理
        for item in items:
                yield scrapy.Request(url=item['sonUrls'], meta={'meta_2':item}, callback = self.detail_parse)

    # 數(shù)據(jù)解析方法璧瞬,獲取文章標題和內(nèi)容
    def detail_parse(self, response):
        item = response.meta['meta_2']
        content = ""
        head = response.xpath('//h1[@id=\"main_title\"]/text()')
        content_list = response.xpath('//div[@id=\"artibody\"]/p/text()').extract()

        # 將p標簽里的文本內(nèi)容合并到一起
        for content_one in content_list:
            content += content_one

        item['head']= head
        item['content']= content

        yield item

pipelines.py

from scrapy import signals
import sys
reload(sys)
sys.setdefaultencoding("utf-8")

class SinaPipeline(object):
    def process_item(self, item, spider):
        sonUrls = item['sonUrls']

        # 文件名為子鏈接url中間部分,并將 / 替換為 _渐夸,保存為 .txt格式
        filename = sonUrls[7:-6].replace('/','_')
        filename += ".txt"

        fp = open(item['subFilename']+'/'+filename, 'w')
        fp.write(item['content'])
        fp.close()

        return item

settings.py

BOT_NAME = 'Sina'

SPIDER_MODULES = ['Sina.spiders']
NEWSPIDER_MODULE = 'Sina.spiders'

ITEM_PIPELINES = {
    'Sina.pipelines.SinaPipeline': 300,
}

LOG_LEVEL = 'DEBUG'

在項目根目錄下新建main.py文件,用于調(diào)試

from scrapy import cmdline
cmdline.execute('scrapy crawl sina'.split())

執(zhí)行程序

py2 main.py
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嗤锉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子墓塌,更是在濱河造成了極大的恐慌瘟忱,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件苫幢,死亡現(xiàn)場離奇詭異访诱,居然都是意外死亡,警方通過查閱死者的電腦和手機韩肝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門触菜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人哀峻,你說我怎么就攤上這事涡相。” “怎么了剩蟀?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵催蝗,是天一觀的道長。 經(jīng)常有香客問我喻旷,道長生逸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任且预,我火速辦了婚禮槽袄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘锋谐。我一直安慰自己遍尺,他們只是感情好,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布涮拗。 她就那樣靜靜地躺著乾戏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪三热。 梳的紋絲不亂的頭發(fā)上鼓择,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機與錄音就漾,去河邊找鬼呐能。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的摆出。 我是一名探鬼主播朗徊,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼偎漫!你這毒婦竟也來了爷恳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤象踊,失蹤者是張志新(化名)和其女友劉穎温亲,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體通危,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡铸豁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年灌曙,在試婚紗的時候發(fā)現(xiàn)自己被綠了菊碟。 大學時的朋友給我發(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
  • 我被黑心中介騙來泰國打工累颂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人尤勋。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓喘落,卻偏偏與公主長得像茵宪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子瘦棋,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345

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

  • 爬取新浪網(wǎng)導航頁所有下所有大類稀火、小類、小類里的子鏈接赌朋,以及子鏈接頁面的新聞內(nèi)容凰狞。 效果演示圖: items.py ...
    文子軒閱讀 479評論 0 0
  • 生活很平等,我們怎么對待她沛慢,她便怎么對待我們自己赡若。 我的身邊有這樣的一位姑姑,她的女兒在澳洲团甲。我們通常是通過微信和...
    向陽花美麗閱讀 372評論 0 0
  • S鎮(zhèn)逾冬。鎮(zhèn)西郊的礦廠房外,烏壓壓人頭攢動躺苦,大伙兒冒著春寒身腻,早早便等在了廠房外。正值早春匹厘,這一天風和日麗嘀趟,金燦燦...
    美麗玉閱讀 161評論 0 1
  • 1.聽說,人丑就要多讀書愈诚∷矗可不知為什么我從幼兒園一直讀到高三。我覺得太委屈了炕柔。后來酌泰,我發(fā)現(xiàn)我除了美貌就一無所有了…...
    蘇月亮閱讀 345評論 9 4
  • 唐僧師徒四人去西天取經(jīng)。一日汗唱,走到一座大山中宫莱,只見天色陰沉,谷中濃霧彌漫哩罪,悟空料定必有妖怪授霸。他用金箍棒在地上劃一圈...
    雪碧_cb90閱讀 332評論 1 1