別只用 Selenium恩急,新神器 Pyppeteer 繞過淘寶更簡單!

如果大家對 Python 爬蟲有所了解的話此叠,想必你應該聽說過 Selenium 這個庫随珠,這實際上是一個自動化測試工具,現(xiàn)在已經(jīng)被廣泛用于網(wǎng)絡爬蟲中來應對 JavaScript 渲染的頁面的抓取简卧。

但 Selenium 用的時候有個麻煩事烤芦,就是環(huán)境的相關配置析校,得安裝好相關瀏覽器智玻,比如 Chrome、Firefox 等等盖彭,然后還要到官方網(wǎng)站去下載對應的驅(qū)動,最重要的還需要安裝對應的 Python Selenium 庫铺呵,確實是不是很方便隧熙,另外如果要做大規(guī)模部署的話,環(huán)境配置的一些問題也是個頭疼的事情音念。

那么本節(jié)就介紹另一個類似的替代品躏敢,叫做 Pyppeteer。注意肝谭,是叫做 Pyppeteer蛾扇,不是 Puppeteer。Puppeteer 是 Google 基于 Node.js 開發(fā)的一個工具镀首,有了它我們可以通過 JavaScript 來控制 Chrome 瀏覽器的一些操作更哄,當然也可以用作網(wǎng)絡爬蟲上,其 API 極其完善觅捆,功能非常強大麻敌。 而 Pyppeteer 又是什么呢?它實際上是 Puppeteer 的 Python 版本的實現(xiàn)赢赊,但他不是 Google 開發(fā)的级历,是一位來自于日本的工程師依據(jù) Puppeteer 的一些功能開發(fā)出來的非官方版本寥殖。

在 Pyppetter 中涩蜘,實際上它背后也是有一個類似 Chrome 瀏覽器的 Chromium 瀏覽器在執(zhí)行一些動作進行網(wǎng)頁渲染熏纯,首先說下 Chrome 瀏覽器和 Chromium 瀏覽器的淵源豆巨。

Chromium 是谷歌為了研發(fā) Chrome 而啟動的項目,是完全開源的贩猎。二者基于相同的源代碼構建萍膛,Chrome 所有的新功能都會先在 Chromium 上實現(xiàn),待驗證穩(wěn)定后才會移植艇棕,因此 Chromium 的版本更新頻率更高串塑,也會包含很多新的功能桩匪,但作為一款獨立的瀏覽器,Chromium 的用戶群體要小眾得多闺骚。兩款瀏覽器“同根同源”妆档,它們有著同樣的 Logo,但配色不同胸梆,Chrome 由藍紅綠黃四種顏色組成纤虽,而 Chromium 由不同深度的藍色構成逼纸。

image

總的來說济蝉,兩款瀏覽器的內(nèi)核是一樣的,實現(xiàn)方式也是一樣的贺嫂,可以認為是開發(fā)版和正式版的區(qū)別第喳,功能上基本是沒有太大區(qū)別的。

Pyppeteer 就是依賴于 Chromium 這個瀏覽器來運行的悠抹。那么有了 Pyppeteer 之后扩淀,我們就可以免去那些繁瑣的環(huán)境配置等問題。如果第一次運行的時候卵凑,Chromium 瀏覽器沒有安全胜臊,那么程序會幫我們自動安裝和配置象对,就免去了繁瑣的環(huán)境配置等工作。另外 Pyppeteer 是基于 Python 的新特性 async 實現(xiàn)的杨何,所以它的一些執(zhí)行也支持異步操作沥邻,效率相對于 Selenium 來說也提高了。

那么下面就讓我們來一起了解下 Pyppeteer 的相關用法吧埃跷。

安裝

首先就是安裝問題了邮利,由于 Pyppeteer 采用了 Python 的 async 機制延届,所以其運行要求的 Python 版本為 3.5 及以上。

安裝方式非常簡單:

pip3 install pyppeteer

好了厕吉,安裝完成之后我們命令行下測試下:

>>> import pyppeteer

如果沒有報錯,那么就證明安裝成功了运悲。

快速上手

接下來我們測試下基本的頁面渲染操作项钮,這里我們選用的網(wǎng)址為:http://quotes.toscrape.com/js/烁巫,這個頁面是 JavaScript 渲染而成的,用基本的 requests 庫請求得到的 HTML 結果里面是不包含頁面中所見的條目內(nèi)容的定踱。

為了證明 requests 無法完成正常的抓取恃鞋,我們可以先用如下代碼來測試一下:


import requests
from pyquery import PyQuery as pq

url = 'http://quotes.toscrape.com/js/'
response = requests.get(url)
doc = pq(response.text)
print('Quotes:', doc('.quote').length)

這里首先使用 requests 來請求網(wǎng)頁內(nèi)容恤浪,然后使用 pyquery 來解析頁面中的每一個條目。觀察源碼之后我們發(fā)現(xiàn)每個條目的 class 名為 quote荠呐,所以這里選用了 .quote 這個 CSS 選擇器來選擇砂客,最后輸出條目數(shù)量。

運行結果:

Quotes: 0

結果是 0媚创,這就證明使用 requests 是無法正常抓取到相關數(shù)據(jù)的钞钙。因為什么声离?因為這個頁面是 JavaScript 渲染而成的,我們所看到的內(nèi)容都是網(wǎng)頁加載后又執(zhí)行了 JavaScript 之后才呈現(xiàn)出來的本刽,因此這些條目數(shù)據(jù)并不存在于原始 HTML 代碼中,而 requests 僅僅抓取的是原始 HTML 代碼唤锉。

好的,所以遇到這種類型的網(wǎng)站我們應該怎么辦呢株憾?

其實答案有很多:

  • 分析網(wǎng)頁源代碼數(shù)據(jù)嗤瞎,如果數(shù)據(jù)是隱藏在 HTML 中的其他地方,以 JavaScript 變量的形式存在虹菲,直接提取就好了掉瞳。
  • 分析 Ajax,很多數(shù)據(jù)可能是經(jīng)過 Ajax 請求時候獲取的霎褐,所以可以分析其接口冻璃。
  • 模擬 JavaScript 渲染過程损合,直接抓取渲染后的結果。

而 Pyppeteer 和 Selenium 就是用的第三種方法拍埠,下面我們再用 Pyppeteer 來試試土居,如果用 Pyppeteer 實現(xiàn)如上頁面的抓取的話擦耀,代碼就可以寫為如下形式:

import asyncio
from pyppeteer import launch
from pyquery import PyQuery as pq

async def main():
    browser = await launch()
    page = await browser.newPage()
    await page.goto('http://quotes.toscrape.com/js/')
    doc = pq(await page.content())
    print('Quotes:', doc('.quote').length)
    await browser.close()

asyncio.get_event_loop().run_until_complete(main())

運行結果:

Quotes: 10

看運行結果眷蜓,這說明我們就成功匹配出來了 class 為 quote 的條目,總數(shù)為 10 條德召,具體的內(nèi)容可以進一步使用 pyquery 解析查看。

那么這里面的過程發(fā)生了什么福荸?

實際上肴掷,Pyppeteer 整個流程就完成了瀏覽器的開啟呆瞻、新建頁面、頁面加載等操作颤介。另外 Pyppeteer 里面進行了異步操作赞赖,所以需要配合 async/await 關鍵詞來實現(xiàn)薯定。

首先, launch 方法會新建一個 Browser 對象亏推,然后賦值給 browser年堆,然后調(diào)用 newPage 方法相當于瀏覽器中新建了一個選項卡,同時新建了一個 Page 對象芽狗。然后 Page 對象調(diào)用了 goto 方法就相當于在瀏覽器中輸入了這個 URL童擎,瀏覽器跳轉(zhuǎn)到了對應的頁面進行加載攻晒,加載完成之后再調(diào)用 content 方法鲁捏,返回當前瀏覽器頁面的源代碼。然后進一步地假丧,我們用 pyquery 進行同樣地解析,就可以得到 JavaScript 渲染的結果了渔期。

另外其他的一些方法如調(diào)用 asyncio 的 get_event_loop 等方法的相關操作則屬于 Python 異步 async 相關的內(nèi)容了婴噩,大家如果不熟悉可以了解下 Python 的 async/await 的相關知識几莽。

好宅静,通過上面的代碼姨夹,我們就可以完成 JavaScript 渲染頁面的爬取了。

在這個過程中峭沦,我們沒有配置 Chrome 瀏覽器逃糟,沒有配置瀏覽器驅(qū)動绰咽,免去了一些繁瑣的步驟,同樣達到了 Selenium 的效果琐谤,還實現(xiàn)了異步抓取玩敏,爽歪歪旺聚!

接下來我們再看看另外一個例子,這個例子可以模擬網(wǎng)頁截圖陈哑,保存 PDF,另外還可以執(zhí)行自定義的 JavaScript 獲得特定的內(nèi)容诚卸,代碼如下:

import asyncio
from pyppeteer import launch

async def main():
    browser = await launch()
    page = await browser.newPage()
    await page.goto('http://quotes.toscrape.com/js/')
    await page.screenshot(path='example.png')
    await page.pdf(path='example.pdf')
    dimensions = await page.evaluate('''() => {
        return {
            width: document.documentElement.clientWidth,
            height: document.documentElement.clientHeight,
            deviceScaleFactor: window.devicePixelRatio,
        }
    }''')

    print(dimensions)
    # >>> {'width': 800, 'height': 600, 'deviceScaleFactor': 1}
    await browser.close()

asyncio.get_event_loop().run_until_complete(main())

這里我們又用到了幾個新的 API,完成了網(wǎng)頁截圖保存庇谆、網(wǎng)頁導出 PDF 保存凭疮、執(zhí)行 JavaScript 并返回對應數(shù)據(jù)执解。

首先 screenshot 方法可以傳入保存的圖片路徑,另外還可以指定保存格式 type新蟆、清晰度 quality右蕊、是否全屏 fullPage饶囚、裁切 clip 等各個參數(shù)實現(xiàn)截圖。

截圖的樣例如下:

image

可以看到它返回的就是 JavaScript 渲染后的頁面。

pdf 方法也是類似的闹丐,只不過頁面保存格式不一樣卿拴,最后得到一個多頁的 pdf 文件,樣例如下:

image

可見其內(nèi)容也是 JavaScript 渲染后的內(nèi)容文狱,另外這個方法還可以指定放縮大小 scale瞄崇、頁碼范圍 pageRanges、寬高 width 和 height等浊、方向 landscape 等等參數(shù)筹燕,導出定制化的 pdf 用這個方法就十分方便衅鹿。

最后我們又調(diào)用了 evaluate 方法執(zhí)行了一些 JavaScript大渤,JavaScript 傳入的是一個函數(shù),使用 return 方法返回了網(wǎng)頁的寬高忍捡、像素大小比率三個值切黔,最后得到的是一個 JSON 格式的對象纬霞,內(nèi)容如下:

{'width': 800, 'height': 600, 'deviceScaleFactor': 1}

OK驱显,實例就先感受到這里埃疫,還有太多太多的功能還沒提及。

總之利用 Pyppeteer 我們可以控制瀏覽器執(zhí)行幾乎所有動作翠桦,想要的操作和功能基本都可以實現(xiàn)销凑,用它來自由地控制爬蟲當然就不在話下了仅炊。

詳細用法

了解了基本的實例之后抚垄,我們再來梳理一下 Pyppeteer 的一些基本和常用操作谋逻。Pyppeteer 的幾乎所有功能都能在其官方文檔的 API Reference 里面找到斤贰,鏈接為:https://miyakogi.github.io/pyppeteer/reference.html次询,用到哪個方法就來這里查詢就好了屯吊,參數(shù)不必死記硬背,即用即查就好骗爆。

開啟瀏覽器

使用 Pyppeteer 的第一步便是啟動瀏覽器蔽介,首先我們看下怎樣啟動一個瀏覽器虹蓄,其實就相當于我們點擊桌面上的瀏覽器圖標一樣薇组,把它開起來。用 Pyppeteer 完成同樣的操作宋光,只需要調(diào)用 launch 方法即可炭菌。

我們先看下 launch 方法的 API罪佳,鏈接為:https://miyakogi.github.io/pyppeteer/reference.html#pyppeteer.launcher.launch,其方法定義如下:

pyppeteer.launcher.launch(options: dict = None, **kwargs) → pyppeteer.browser.Browser

可以看到它處于 launcher 模塊中黑低,參數(shù)沒有在聲明中特別指定赘艳,返回類型是 browser 模塊中的 Browser 對象,另外觀察源碼發(fā)現(xiàn)這是一個 async 修飾的方法投储,所以調(diào)用它的時候需要使用 await第练。

接下來看看它的參數(shù):

  • ignoreHTTPSErrors (bool): 是否要忽略 HTTPS 的錯誤,默認是 False玛荞。
  • headless (bool): 是否啟用 Headless 模式,即無界面模式勋眯,如果 devtools 這個參數(shù)是 True 的話婴梧,那么該參數(shù)就會被設置為 False下梢,否則為 True,即默認是開啟無界面模式的塞蹭。
  • executablePath (str): 可執(zhí)行文件的路徑孽江,如果指定之后就不需要使用默認的 Chromium 了,可以指定為已有的 Chrome 或 Chromium番电。
  • slowMo (int|float): 通過傳入指定的時間岗屏,可以減緩 Pyppeteer 的一些模擬操作。
  • args (List[str]): 在執(zhí)行過程中可以傳入的額外參數(shù)漱办。
  • ignoreDefaultArgs (bool): 不使用 Pyppeteer 的默認參數(shù)这刷,如果使用了這個參數(shù),那么最好通過 args 參數(shù)來設定一些參數(shù)娩井,否則可能會出現(xiàn)一些意想不到的問題暇屋。這個參數(shù)相對比較危險,慎用洞辣。
  • handleSIGINT (bool): 是否響應 SIGINT 信號咐刨,也就是可以使用 Ctrl + C 來終止瀏覽器程序,默認是 True扬霜。
  • handleSIGTERM (bool): 是否響應 SIGTERM 信號定鸟,一般是 kill 命令,默認是 True畜挥。
  • handleSIGHUP (bool): 是否響應 SIGHUP 信號仔粥,即掛起信號,比如終端退出操作蟹但,默認是 True。
  • dumpio (bool): 是否將 Pyppeteer 的輸出內(nèi)容傳給 process.stdout 和 process.stderr 對象谭羔,默認是 False华糖。
  • userDataDir (str): 即用戶數(shù)據(jù)文件夾,即可以保留一些個性化配置和操作記錄瘟裸。
  • env (dict): 環(huán)境變量客叉,可以通過字典形式傳入。
  • devtools (bool): 是否為每一個頁面自動開啟調(diào)試工具话告,默認是 False兼搏。如果這個參數(shù)設置為 True,那么 headless 參數(shù)就會無效沙郭,會被強制設置為 False佛呻。
  • logLevel (int|str): 日志級別,默認和 root logger 對象的級別相同病线。
  • autoClose (bool): 當一些命令執(zhí)行完之后吓著,是否自動關閉瀏覽器鲤嫡,默認是 True。
  • loop (asyncio.AbstractEventLoop): 時間循環(huán)對象绑莺。

好了暖眼,知道這些參數(shù)之后,我們可以先試試看纺裁。

首先可以試用下最常用的參數(shù) headless诫肠,如果我們將它設置為 True 或者默認不設置它,在啟動的時候我們是看不到任何界面的欺缘,如果把它設置為 False区赵,那么在啟動的時候就可以看到界面了,一般我們在調(diào)試的時候會把它設置為 False浪南,在生產(chǎn)環(huán)境上就可以設置為 True笼才,我們先嘗試一下關閉 headless 模式:

import asyncio
from pyppeteer import launch

async def main():
    await launch(headless=False)
    await asyncio.sleep(100)

asyncio.get_event_loop().run_until_complete(main())

運行之后看不到任何控制臺輸出,但是這時候就會出現(xiàn)一個空白的 Chromium 界面了:

image

但是可以看到這就是一個光禿禿的瀏覽器而已络凿,看一下相關信息:

image

看到了骡送,這就是 Chromium,上面還寫了開發(fā)者內(nèi)部版本絮记,可以認為是開發(fā)版的 Chrome 瀏覽器就好摔踱。

另外我們還可以開啟調(diào)試模式,比如在寫爬蟲的時候會經(jīng)常需要分析網(wǎng)頁結構還有網(wǎng)絡請求怨愤,所以開啟調(diào)試工具還是很有必要的派敷,我們可以將 devtools 參數(shù)設置為 True,這樣每開啟一個界面就會彈出一個調(diào)試窗口撰洗,非常方便篮愉,示例如下:

import asyncio
from pyppeteer import launch

async def main():
    browser = await launch(devtools=True)
    page = await browser.newPage()
    await page.goto('https://www.baidu.com')
    await asyncio.sleep(100)

asyncio.get_event_loop().run_until_complete(main())

剛才說過 devtools 這個參數(shù)如果設置為了 True,那么 headless 就會被關閉了差导,界面始終會顯現(xiàn)出來试躏。在這里我們新建了一個頁面,打開了百度设褐,界面運行效果如下:

image

這時候我們可以看到上面的一條提示:"Chrome 正受到自動測試軟件的控制"颠蕴,這個提示條有點煩,那咋關閉呢助析?這時候就需要用到 args 參數(shù)了犀被,禁用操作如下:

browser = await launch(headless=False, args=['--disable-infobars'])

這里就不再寫完整代碼了,就是在 launch 方法中外冀,args 參數(shù)通過 list 形式傳入即可寡键,這里使用的是 --disable-infobars 的參數(shù)。

另外有人就說了锥惋,這里你只是把提示關閉了昌腰,有些網(wǎng)站還是會檢測到是 webdriver 吧开伏,比如淘寶檢測到是 webdriver 就會禁止登錄了,我們可以試試:

import asyncio
from pyppeteer import launch

async def main():
    browser = await launch(headless=False)
    page = await browser.newPage()
    await page.goto('https://www.taobao.com')
    await asyncio.sleep(100)

asyncio.get_event_loop().run_until_complete(main())

運行時候進行一下登錄遭商,然后就會彈出滑塊固灵,自己手動拖動一下,然后就報錯了劫流,界面如下:

image

爬蟲的時候看到這界面是很讓人崩潰的吧巫玻,而且這時候我們還發(fā)現(xiàn)了頁面的 bug,整個瀏覽器窗口比顯示的內(nèi)容窗口要大祠汇,這個是某些頁面會出現(xiàn)的情況仍秤,讓人看起來很不爽。

我們可以先解決一下這個顯示的 bug可很,需要設置下 window-size 還有 viewport诗力,代碼如下:

import asyncio
from pyppeteer import launch

width, height = 1366, 768

async def main():
    browser = await launch(headless=False,
                           args=[f'--window-size={width},{height}'])
    page = await browser.newPage()
    await page.setViewport({'width': width, 'height': height})
    await page.goto('https://www.taobao.com')
    await asyncio.sleep(100)

asyncio.get_event_loop().run_until_complete(main())

這樣整個界面就正常了:

image

OK,那剛才所說的 webdriver 檢測問題怎樣來解決呢我抠?其實淘寶主要通過 window.navigator.webdriver 來對 webdriver 進行檢測苇本,所以我們只需要使用 JavaScript 將它設置為 false 即可,代碼如下:

import asyncio
from pyppeteer import launch


async def main():
    browser = await launch(headless=False, args=['--disable-infobars'])
    page = await browser.newPage()
    await page.goto('https://login.taobao.com/member/login.jhtml?redirectURL=https://www.taobao.com/')
    await page.evaluate(
        '''() =>{ Object.defineProperties(navigator,{ webdriver:{ get: () => false } }) }''')
    await asyncio.sleep(100)

asyncio.get_event_loop().run_until_complete(main())

這里沒加輸入用戶名密碼的代碼菜拓,當然后面可以自行添加瓣窄,下面打開之后,我們點擊輸入用戶名密碼纳鼎,然后這時候會出現(xiàn)一個滑動條俺夕,這里滑動的話,就可以通過了贱鄙,如圖所示:

image

OK劝贸,這樣的話我們就成功規(guī)避了 webdriver 的檢測,使用鼠標拖動模擬就可以完成淘寶的登錄了贰逾。

還有另一種方法可以進一步免去淘寶登錄的煩惱悬荣,那就是設置用戶目錄。平時我們已經(jīng)注意到疙剑,當我們登錄淘寶之后,如果下次再次打開瀏覽器發(fā)現(xiàn)還是登錄的狀態(tài)践叠。這是因為淘寶的一些關鍵 Cookies 已經(jīng)保存到本地了言缤,下次登錄的時候可以直接讀取并保持登錄狀態(tài)。

那么這些信息保存在哪里了呢禁灼?其實就是保存在用戶目錄下了管挟,里面不僅包含了瀏覽器的基本配置信息,還有一些 Cache弄捕、Cookies 等各種信息都在里面僻孝,如果我們能在瀏覽器啟動的時候讀取這些信息导帝,那么啟動的時候就可以恢復一些歷史記錄甚至一些登錄狀態(tài)信息了。

這也就解決了一個問題:很多朋友在每次啟動 Selenium 或 Pyppeteer 的時候總是是一個全新的瀏覽器穿铆,那就是沒有設置用戶目錄您单,如果設置了它,每次打開就不再是一個全新的瀏覽器了荞雏,它可以恢復之前的歷史記錄虐秦,也可以恢復很多網(wǎng)站的登錄信息。

那么這個怎么來做呢凤优?很簡單悦陋,在啟動的時候設置 userDataDir 就好了,示例如下:

import asyncio
from pyppeteer import launch

async def main():
    browser = await launch(headless=False, userDataDir='./userdata', args=['--disable-infobars'])
    page = await browser.newPage()
    await page.goto('https://www.taobao.com')
    await asyncio.sleep(100)

asyncio.get_event_loop().run_until_complete(main())

好筑辨,這里就是加了一個 userDataDir 的屬性俺驶,值為 userdata,即當前目錄的 userdata 文件夾棍辕。我們可以首先運行一下暮现,然后登錄一次淘寶,這時候我們同時可以觀察到在當前運行目錄下又多了一個 userdata 的文件夾痢毒,里面的結構是這樣子的:

image

具體的介紹可以看官方的一些說明送矩,如:https://chromium.googlesource.com/chromium/src/+/master/docs/user_data_dir.md,這里面介紹了 userdatadir 的相關內(nèi)容哪替。

再次運行上面的代碼栋荸,這時候可以發(fā)現(xiàn)現(xiàn)在就已經(jīng)是登錄狀態(tài)了,不需要再次登錄了凭舶,這樣就成功跳過了登錄的流程晌块。當然可能時間太久了,Cookies 都過期了帅霜,那還是需要登錄的匆背。

好了,本想把 Pyppeteer 的用法詳細介紹完的身冀,結果只 launch 的方法就介紹這么多了钝尸,后面的內(nèi)容放到其他文章來介紹了,其他的內(nèi)容后續(xù)文章會陸續(xù)放出搂根,謝謝珍促。

小彩蛋:以上文章摘自即將完稿的《Python3網(wǎng)絡爬蟲開發(fā)實戰(zhàn)(第二版)》,敬請期待剩愧,謝謝猪叙。

原創(chuàng): 崔慶才 進擊的Coder

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子穴翩,更是在濱河造成了極大的恐慌犬第,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芒帕,死亡現(xiàn)場離奇詭異歉嗓,居然都是意外死亡,警方通過查閱死者的電腦和手機副签,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門遥椿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人淆储,你說我怎么就攤上這事冠场。” “怎么了本砰?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵碴裙,是天一觀的道長。 經(jīng)常有香客問我点额,道長舔株,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任还棱,我火速辦了婚禮载慈,結果婚禮上,老公的妹妹穿的比我還像新娘珍手。我一直安慰自己办铡,他們只是感情好,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布琳要。 她就那樣靜靜地躺著寡具,像睡著了一般。 火紅的嫁衣襯著肌膚如雪稚补。 梳的紋絲不亂的頭發(fā)上童叠,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機與錄音课幕,去河邊找鬼厦坛。 笑死,一個胖子當著我的面吹牛乍惊,可吹牛的內(nèi)容都是我干的粪般。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼污桦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了匙监?” 一聲冷哼從身側響起凡橱,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤小作,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后稼钩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體顾稀,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年坝撑,在試婚紗的時候發(fā)現(xiàn)自己被綠了静秆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡巡李,死狀恐怖抚笔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情侨拦,我是刑警寧澤殊橙,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站狱从,受9級特大地震影響膨蛮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜季研,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一敞葛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧与涡,春花似錦惹谐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至款慨,卻和暖如春儒飒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背檩奠。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工桩了, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人埠戳。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓井誉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親整胃。 傳聞我的和親對象是個殘疾皇子颗圣,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

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

  • ??JavaScript 與 HTML 之間的交互是通過事件實現(xiàn)的在岂。 ??事件奔则,就是文檔或瀏覽器窗口中發(fā)生的一些特...
    霜天曉閱讀 3,474評論 1 11
  • 轉(zhuǎn)載自http://blog.csdn.net/qq295445028/article/details/79930...
    WebSSO閱讀 2,908評論 0 3
  • 聽朋友說她今年賺了60多萬了易茬,就是那種互聯(lián)網(wǎng)上的投資什么的,可能就是資本運作系列及老,具體我也不清楚是咋回事抽莱,可是我聽...
    別來無恙朱梅閱讀 418評論 7 3
  • 起床鬧鐘 6:00,6:05骄恶,6:10設置完畢食铐。 穿衣鬧鐘6:10,6:15叠蝇,6:17設置完畢璃岳。 洗漱化妝鬧鐘:6...
    大繆斯閱讀 157評論 0 0
  • 站穩(wěn)了,就是精品一件悔捶。 倒下了铃慷,就是亂石一堆。 放棄了蜕该,你就是笑話一段犁柜。 成功了,你就是神話一般堂淡。 挺住了馋缅,你...
    89860d17195b閱讀 189評論 0 0