爬蟲實(shí)戰(zhàn)二:爬取電影天堂的最新電影

圖片來自 unsplash

前面兩篇文章介紹 requests 和 xpath 的用法。我們推崇學(xué)以致用,所以本文講解利用這兩個(gè)工具進(jìn)行實(shí)戰(zhàn)。

1 爬取目標(biāo)

本次爬取的站點(diǎn)選擇電影天堂,網(wǎng)址是: www.dytt8.net。爬取內(nèi)容是整個(gè)站點(diǎn)的所有電影信息,包括電影名稱,導(dǎo)演、主演、下載地址等。具體抓取信息如下圖所示:

點(diǎn)擊查看大圖

2 設(shè)計(jì)爬蟲程序

2.1 確定爬取入口

電影天堂里面的電影數(shù)目成千上萬,電影類型也是讓人眼花繚亂。我們?yōu)榱吮WC爬取的電影信息不重復(fù), 所以要確定一個(gè)爬取方向。目前這情況真讓人無從下手。但是,我們點(diǎn)擊主頁(yè)中的【最新電影】選項(xiàng),跳進(jìn)一個(gè)新的頁(yè)面。驀然有種柳暗花明又一村的感覺。


點(diǎn)擊查看大圖

由圖可知道,電影天堂有 5 個(gè)電影欄目,分別為最新電影、日韓電影、歐美電影、國(guó)內(nèi)電影、綜合電影。每個(gè)欄目又有一定數(shù)量的分頁(yè),每個(gè)分頁(yè)有 25 條電影信息。那么程序的入口可以有 5 個(gè) url 地址。這 5 個(gè)地址分別對(duì)應(yīng)每個(gè)欄目的首頁(yè)鏈接。

2.2 爬取思路

知道爬取入口,后面的工作就容易多了。我通過測(cè)試發(fā)現(xiàn)這幾個(gè)欄目除了頁(yè)面的 url 地址不一樣之外,其他例如提取信息的 xpath 路徑是一樣的。因此,我把 5 個(gè)欄目當(dāng)做 1 個(gè)類,再該類進(jìn)行遍歷爬取。

我這里“最新電影”為例說明爬取思路。
1)請(qǐng)求欄目的首頁(yè)來獲取到分頁(yè)的總數(shù),以及推測(cè)出每個(gè)分頁(yè)的 url 地址;
2)將獲取到的分頁(yè) url 存放到名為 floorQueue 隊(duì)列中;
3)從 floorQueue 中依次取出分頁(yè) url,然后利用多線程發(fā)起請(qǐng)求;
4)將獲取到的電影頁(yè)面 url 存入到名為 middleQueue 的隊(duì)列;
5)從 middleQueue 中依次取出電影頁(yè)面 url,再利用多線程發(fā)起請(qǐng)求;
6)將請(qǐng)求結(jié)果使用 Xpath 解析并提取所需的電影信息;
7)將爬取到的電影信息存到名為 contentQueue 隊(duì)列中;
8)從 contentQueue 隊(duì)列中依次取出電影信息,然后存到數(shù)據(jù)庫(kù)中。

2.3 設(shè)計(jì)爬蟲架構(gòu)

根據(jù)爬取思路,我設(shè)計(jì)出爬蟲架構(gòu)。如下圖所示:


點(diǎn)擊查看大圖

2.4 代碼實(shí)現(xiàn)

主要闡述幾個(gè)重要的類的代碼

  • main 類

主要工作兩個(gè):第一,實(shí)例化出一個(gè)dytt8Moive對(duì)象,然后開始爬取信息。第二,等爬取結(jié)束,將數(shù)據(jù)插入到數(shù)據(jù)庫(kù)中。

處理爬蟲的邏輯代碼如下:

# 截止到2017-08-08, 最新電影一共才有 164 個(gè)頁(yè)面
LASTEST_MOIVE_TOTAL_SUM = 6 #164

# 請(qǐng)求網(wǎng)絡(luò)線程總數(shù), 線程不要調(diào)太好, 不然會(huì)返回很多 400
THREAD_SUM = 5

def startSpider():
    # 實(shí)例化對(duì)象

    # 獲取【最新電影】有多少個(gè)頁(yè)面
    LASTEST_MOIVE_TOTAL_SUM = dytt_Lastest.getMaxsize()
    print('【最新電影】一共  ' + str(LASTEST_MOIVE_TOTAL_SUM) + '  有個(gè)頁(yè)面')
    dyttlastest = dytt_Lastest(LASTEST_MOIVE_TOTAL_SUM)
    floorlist = dyttlastest.getPageUrlList()

    floorQueue = TaskQueue.getFloorQueue()
    for item in floorlist:
        floorQueue.put(item, 3)

    # print(floorQueue.qsize())

    for i in range(THREAD_SUM):
        workthread = FloorWorkThread(floorQueue, i)
        workthread.start()

    while True:
        if TaskQueue.isFloorQueueEmpty():
            break
        else:
            pass

    for i in range(THREAD_SUM):
        workthread = TopWorkThread(TaskQueue.getMiddleQueue(), i)
        workthread.start()

    while True:
        if TaskQueue.isMiddleQueueEmpty():
            break
        else:
            pass

    insertData()
    
if __name__ == '__main__':
    startSpider()

創(chuàng)建數(shù)據(jù)庫(kù)以及表,接著再把電影信息插入到數(shù)據(jù)庫(kù)的代碼如下:

def insertData():
    DBName = 'dytt.db'
    db = sqlite3.connect('./' + DBName, 10)
    conn = db.cursor()

    SelectSql = 'Select * from sqlite_master where type = "table" and name="lastest_moive";'
    CreateTableSql = '''
        Create Table lastest_moive (
            'm_id' INTEGER PRIMARY KEY,
            'm_type' varchar(100),
            'm_trans_name' varchar(200),
            'm_name' varchar(100),
            'm_decade' varchar(30),
            'm_conutry' varchar(30),
            'm_level' varchar(100),
            'm_language' varchar(30),
            'm_subtitles' varchar(100),
            'm_publish' varchar(30),
            'm_IMDB_socre' varchar(50),
            'm_douban_score' varchar(50),
            'm_format' varchar(20),
            'm_resolution' varchar(20),
            'm_size' varchar(10),
            'm_duration' varchar(10),
            'm_director' varchar(50),
            'm_actors' varchar(1000),
            'm_placard' varchar(200),
            'm_screenshot' varchar(200),
            'm_ftpurl' varchar(200),
            'm_dytt8_url' varchar(200)
        );
    '''

    InsertSql = '''
        Insert into lastest_moive(m_type, m_trans_name, m_name, m_decade, m_conutry, m_level, m_language, m_subtitles, m_publish, m_IMDB_socre, 
        m_douban_score, m_format, m_resolution, m_size, m_duration, m_director, m_actors, m_placard, m_screenshot, m_ftpurl,
        m_dytt8_url)
        values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);
    '''

    if not conn.execute(SelectSql).fetchone():
        conn.execute(CreateTableSql)
        db.commit()
        print('====  創(chuàng)建表成功  ====')
    else:
        print('====  創(chuàng)建表失敗, 表已經(jīng)存在  ====')

    count = 1

    while not TaskQueue.isContentQueueEmpty():
        item = TaskQueue.getContentQueue().get()
        conn.execute(InsertSql, Utils.dirToList(item))
        db.commit()
        print('插入第 ' + str(count) + ' 條數(shù)據(jù)成功')
        count = count + 1

    db.commit()
    db.close()
  • TaskQueue 類

維護(hù) floorQueue、middleQueue、contentQueue 三個(gè)隊(duì)列的管理類。之所以選擇隊(duì)列的數(shù)據(jù)結(jié)構(gòu),是因?yàn)榕老x程序需要用到多線程,隊(duì)列能夠保證線程安全。

  • dytt8Moive 類

dytt8Moive 類是本程序的主心骨。程序最初的爬取目標(biāo)是 5 個(gè)電影欄目,但是目前只現(xiàn)實(shí)了爬取最新欄目。如果你想爬取全部欄目電影,只需對(duì) dytt8Moive 稍微改造下即可。

class dytt_Lastest(object):

    # 獲取爬蟲程序抓取入口
    breakoutUrl = 'http://www.dytt8.net/html/gndy/dyzz/index.html'

    def __init__(self, sum):
        self.sum = sum


    # 獲取【最新電影】有多少個(gè)頁(yè)面
    # 截止到2017-08-08, 最新電影一共才有 164 個(gè)頁(yè)面
    @classmethod
    def getMaxsize(cls):
        response = requests.get(cls.breakoutUrl, headers=RequestModel.getHeaders(), proxies=RequestModel.getProxies(), timeout=3)
        # 需將電影天堂的頁(yè)面的編碼改為 GBK, 不然會(huì)出現(xiàn)亂碼的情況
        response.encoding = 'GBK'

        selector = etree.HTML(response.text)
        # 提取信息
        optionList = selector.xpath("http://select[@name='sldd']/text()")
        return len(optionList) - 1   # 因首頁(yè)重復(fù), 所以要減1


    def getPageUrlList(self):
        '''
        主要功能:目錄頁(yè)url取出,比如:http://www.dytt8.net/html/gndy/dyzz/list_23_'+ str(i) + '.html
        '''
        templist = []
        request_url_prefix = 'http://www.dytt8.net/html/gndy/dyzz/'
        templist = [request_url_prefix + 'index.html']

        for i in range(2, self.sum + 1):
            templist.append(request_url_prefix + 'list_23_' + str(i) + '.html')

        for t in templist:
            print('request url is ###   ' + t + '    ###')
        return templist


    @classmethod
    def getMoivePageUrlList(cls, html):
        '''
        獲取電影信息的網(wǎng)頁(yè)鏈接
        '''
        selector = etree.HTML(html)
        templist = selector.xpath("http://div[@class='co_content8']/ul/td/table/tr/td/b/a/@href")
        # print(len(templist))
        # print(templist)
        return templist

    @classmethod
    def getMoiveInforms(cls, url, html):
        '''
        解析電影信息頁(yè)面的內(nèi)容, 具體如下:
        類型        : 疾速特攻/疾速追殺2][BD-mkv.720p.中英雙字][2017年高分驚悚動(dòng)作]
        ◎譯名      : ◎譯\u3000\u3000名\u3000疾速特攻/殺神John Wick 2(港)/捍衛(wèi)任務(wù)2(臺(tái))/疾速追殺2/極速追殺:第二章/約翰·威克2
        ◎片名      : ◎片\u3000\u3000名\u3000John Wick: Chapter Two
        ◎年代     : ◎年\u3000\u3000代\u30002017
        ◎國(guó)家     : ◎產(chǎn)\u3000\u3000地\u3000美國(guó)
        ◎類別     : ◎類\u3000\u3000別\u3000動(dòng)作/犯罪/驚悚
        ◎語(yǔ)言     : ◎語(yǔ)\u3000\u3000言\u3000英語(yǔ)
        ◎字幕     : ◎字\u3000\u3000幕\u3000中英雙字幕
        ◎上映日期  :◎上映日期\u30002017-02-10(美國(guó))
        ◎IMDb評(píng)分  : ◎IMDb評(píng)分\xa0 8.1/10 from 86,240 users
        ◎豆瓣評(píng)分  : ◎豆瓣評(píng)分\u30007.7/10 from 2,915 users
        ◎文件格式   : ◎文件格式\u3000x264 + aac
        ◎視頻尺寸  : ◎視頻尺寸\u30001280 x 720
        ◎文件大小  : ◎文件大小\u30001CD
        ◎片長(zhǎng)     : ◎片\u3000\u3000長(zhǎng)\u3000122分鐘
        ◎?qū)а荨?   : ◎?qū)u3000\u3000演\u3000查德·史塔赫斯基 Chad Stahelski
        ◎主演     :
        ◎簡(jiǎn)介      : 暫不要該字段
        ◎獲獎(jiǎng)情況   : 暫不要該字段
        ◎海報(bào)
        影片截圖
        下載地址
        '''
        # print(html)
        contentDir = {
            'type': '',
            'trans_name': '',
            'name': '',
            'decade': '',
            'conutry': '',
            'level': '',
            'language': '',
            'subtitles': '',
            'publish': '',
            'IMDB_socre': '',
            'douban_score': '',
            'format': '',
            'resolution': '',
            'size': '',
            'duration': '',
            'director': '',
            'actors': '',
            'placard': '',
            'screenshot': '',
            'ftpurl': '',
            'dytt8_url': ''
        }

        selector = etree.HTML(html)
        content = selector.xpath("http://div[@class='co_content8']/ul/tr/td/div/td/p/text()")
        # 匹配出來有兩張圖片, 第一張是海報(bào), 第二張是電影畫面截圖
        imgs = selector.xpath("http://div[@class='co_content8']/ul/tr/td/div/td/p/img/@src")
        # print(content)

        # 為了兼容 2012 年前的頁(yè)面
        if not len(content):
            content = selector.xpath("http://div[@class='co_content8']/ul/tr/td/div/div/td/span/text()")

        # 有些頁(yè)面特殊, 需要用以下表達(dá)式來重新獲取信息
        # 電影天堂頁(yè)面好混亂啊~
        if not len(content):
            content = selector.xpath("http://div[@class='co_content8']/ul/tr/td/div/td/div/text()")

        if not len(content):
            content = selector.xpath("http://div[@class='co_content8']/ul/tr/td/div/div/td/p/font/text()")
            if len(content) < 5:
                content = selector.xpath("http://div[@class='co_content8']/ul/tr/td/p/font/text()")

        if not len(content):
            content = selector.xpath("http://div[@class='co_content8']/ul/tr/td/div/div/td/p/span/text()")

        if not len(content):
            content = selector.xpath("http://div[@class='co_content8']/ul/tr/td/div/div/td/div/span/text()")

        if not len(content):
            content = selector.xpath("http://div[@class='co_content8']/ul/tr/td/div/div/td/font/text()")

        if not len(content):
            content = selector.xpath("http://div[@class='co_content8']/ul/tr/td/div/div/td/p/text()")

        # print(content)

        # 不同渲染頁(yè)面要采取不同的抓取方式抓取圖片
        if not len(imgs):
            imgs = selector.xpath("http://div[@class='co_content8']/ul/tr/td/div/div/td/img/@src")

        if not len(imgs):
            imgs = selector.xpath("http://div[@class='co_content8']/ul/tr/td/div/div/td/p/img/@src")

        if not len(imgs):
            imgs = selector.xpath("http://div[@class='co_content8']/ul/tr/td/div/div/td/div/img/@src")

        if not len(imgs):
            imgs = selector.xpath("http://div[@class='co_content8']/ul/tr/td/div/td/div/img/@src")

        # 類型
        if content[0][0:1] != '◎':
            contentDir['type'] = '[' + content[0]
        actor = ''

        for each in content:
            if each[0:5] == '◎譯\u3000\u3000名':
                # 譯名 ◎譯\u3000\u3000名\u3000  一共占居6位
                contentDir['trans_name'] = each[6: len(each)]
            elif each[0:5] == '◎片\u3000\u3000名':
                # 片名
                contentDir['name'] = each[6: len(each)]
            elif each[0:5] == '◎年\u3000\u3000代':
                # 年份
                contentDir['decade'] = each[6: len(each)]
            elif each[0:5] == '◎產(chǎn)\u3000\u3000地':
                # 產(chǎn)地
                contentDir['conutry'] = each[6: len(each)]
            elif each[0:5] == '◎類\u3000\u3000別':
                # 類別
                contentDir['level'] = each[6: len(each)]
            elif each[0:5] == '◎語(yǔ)\u3000\u3000言':
                # 語(yǔ)言
                contentDir['language'] = each[6: len(each)]
            elif each[0:5] == '◎字\u3000\u3000幕':
                # 字幕
                contentDir['subtitles'] = each[6: len(each)]
            elif each[0:5] == '◎上映日期':
                # 上映日期
                contentDir['publish'] = each[6: len(each)]
            elif each[0:7] == '◎IMDb評(píng)分':
                # IMDb評(píng)分
                contentDir['IMDB_socre'] = each[9: len(each)]
            elif each[0:5] == '◎豆瓣評(píng)分':
                # 豆瓣評(píng)分
                contentDir['douban_score'] = each[6: len(each)]
            elif each[0:5] == '◎文件格式':
                # 文件格式
                contentDir['format'] = each[6: len(each)]
            elif each[0:5] == '◎視頻尺寸':
                # 視頻尺寸
                contentDir['resolution'] = each[6: len(each)]
            elif each[0:5] == '◎文件大小':
                # 文件大小
                contentDir['size'] = each[6: len(each)]
            elif each[0:5] == '◎片\u3000\u3000長(zhǎng)':
                # 片長(zhǎng)
                contentDir['duration'] = each[6: len(each)]
            elif each[0:5] == '◎?qū)u3000\u3000演':
                # 導(dǎo)演
                contentDir['director'] = each[6: len(each)]
            elif each[0:5] == '◎主\u3000\u3000演':
                # 主演
                actor = each[6: len(each)]

        for item in content:
            if item[0: 4] == '\u3000\u3000\u3000\u3000':
                actor = actor + '\n' + item[6: len(item)]

        # 主演
        contentDir['actors'] = actor
        # 海報(bào)
        if imgs[0] != None:
            contentDir['placard'] = imgs[0]
        # 影片截圖
        if imgs[1] != None:
            contentDir['screenshot'] = imgs[1]
        # 下載地址
        ftp = selector.xpath("http://div[@class='co_content8']/ul/tr/td/div/td/table/tbody/tr/td/a/text()")

        # 為了兼容 2012 年前的頁(yè)面
        if not len(ftp):
            ftp = selector.xpath("http://div[@class='co_content8']/ul/tr/td/div/div/td/table/tbody/tr/td/font/a/text()")

        if not len(ftp):
            ftp = selector.xpath("http://div[@class='co_content8']/ul/tr/td/div/div/td/table/tbody/tr/td/a/text()")

        if not len(ftp):
            ftp = selector.xpath("http://div[@class='co_content8']/ul/tr/td/div/div/td/div/table/tbody/tr/td/font/a/text()")

        if not len(ftp):
            ftp = selector.xpath("http://div[@class='co_content8']/ul/tr/td/div/td/div/table/tbody/tr/td/a/text()")

        if not len(ftp):
            ftp = selector.xpath("http://div[@class='co_content8']/ul/tr/td/div/td/table/tbody/tr/td/a/text()")

        if not len(ftp):
            ftp = selector.xpath("http://div[@class='co_content8']/ul/tr/td/div/div/td/p/span/a/text()")

        if not len(ftp):
            ftp = selector.xpath("http://div[@class='co_content8']/ul/tr/td/div/div/td/div/div/table/tbody/tr/td/font/a/text()")

        if not len(ftp):
            ftp = selector.xpath("http://div[@class='co_content8']/ul/tr/td/div/div/td/span/table/tbody/tr/td/font/a/text()")

        if not len(ftp):
            ftp = selector.xpath("http://div[@class='co_content8']/ul/tr/td/div/div/td/div/span/div/table/tbody/tr/td/font/a/text()")

        contentDir['ftpurl'] = ftp[0]
        # 頁(yè)面鏈接
        contentDir['dytt8_url'] = url
        print(contentDir)
        return contentDir

getMoiveInforms 方法是主要負(fù)責(zé)解析電影信息節(jié)點(diǎn)并將其封裝成字典。在代碼中,你看到 Xpath 的路徑表達(dá)式不止一條。因?yàn)殡娪疤焯玫碾娪霸斍轫?yè)面的排版參差不齊,所以單單一條內(nèi)容提取表達(dá)式、海報(bào)和影片截圖表達(dá)式、下載地址表達(dá)式遠(yuǎn)遠(yuǎn)無法滿足。

選擇字典類型作為存儲(chǔ)電影信息的數(shù)據(jù)結(jié)構(gòu),也是自己爬坑之后才決定的。這算是該站點(diǎn)另一個(gè)坑人的地方。電影詳情頁(yè)中有些內(nèi)容節(jié)點(diǎn)是沒有,例如類型、豆瓣評(píng)分,所以無法使用列表按順序保存。

3 爬取結(jié)果

我這里展示自己爬取最新欄目中 4000 多條數(shù)據(jù)中前面部分?jǐn)?shù)據(jù)。


點(diǎn)擊查看大圖

附:源代碼地址


上篇文章:“干將莫邪” —— Xpath 與 lxml 庫(kù)
推薦閱讀:詳解 Requests 庫(kù)的用法


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,563評(píng)論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,694評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,672評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,965評(píng)論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,690評(píng)論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,019評(píng)論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,013評(píng)論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,188評(píng)論 0 290
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,718評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,438評(píng)論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,667評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,149評(píng)論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,845評(píng)論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,252評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,590評(píng)論 1 295
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,384評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,635評(píng)論 2 380

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