用Python做爬蟲(chóng)

一侧到、初步認(rèn)識(shí)

  1. 如何入門 Python 爬蟲(chóng)奶浦?大家可以看看知乎這篇文章(簡(jiǎn)單易懂)
  2. 什么是爬蟲(chóng)?大家可以先看一下下面幾張圖捎迫。





二晃酒、我的學(xué)習(xí)步驟:

1、Python開(kāi)發(fā)環(huán)境搭建

下圖為基于Intellij IDEA的python環(huán)境搭建成功的界面窄绒,大家自行百度搭建過(guò)程贝次。


2、Python正則表達(dá)式(建議觀看慕課網(wǎng)這個(gè)視頻

問(wèn):為什么要使用正則彰导?
答:雖然字符串匹配可以實(shí)現(xiàn)蛔翅,但是每一次匹配都要單獨(dú)完成,重復(fù)代碼多位谋,我們能否把它做成一個(gè)規(guī)則山析?因此正則出現(xiàn)了。

正則表達(dá)式概念

  • 使用單個(gè)字符串來(lái)描述匹配一系列符合某個(gè)句法規(guī)則的字符串
  • 是對(duì)字符串操作的一種邏輯公式
  • 應(yīng)用場(chǎng)景:處理文本和數(shù)據(jù)
  • 正則表達(dá)式過(guò)程:依次拿出表達(dá)式好文本中的字符比較倔幼,如果沒(méi)一個(gè)字符都能匹配盖腿,則匹配成功;否則匹配失敗。

正則表達(dá)式匹配流程

正則表達(dá)式元字符和語(yǔ)法

3翩腐、python開(kāi)發(fā)簡(jiǎn)單爬蟲(chóng)(輕量級(jí)爬蟲(chóng)鸟款、不需要登錄的靜態(tài)加載網(wǎng)頁(yè)抓取)

  • URL管理器:管理待爬取URL集合和已抓取URL集合(防止重復(fù)抓取茂卦、防止循環(huán)抓群问病)


  • 網(wǎng)頁(yè)下載器:將互聯(lián)網(wǎng)上URL對(duì)應(yīng)的網(wǎng)頁(yè)下載到本地的工具,有urllib2(python官方基礎(chǔ)模塊)和requests(第三方包更強(qiáng)大)

以下為urllib2網(wǎng)頁(yè)下載方法的三種方法示例:

# coding:utf-8
import urllib2, cookielib

url='http://www.baidu.com'

print"1)urllib2下載網(wǎng)頁(yè)方法1"
# 直接請(qǐng)求
response1 = urllib2.urlopen(url)
# 獲取狀態(tài)碼,如果是200表示獲取成功
print response1.getcode()
# 讀取網(wǎng)頁(yè)內(nèi)容的長(zhǎng)度
print len(response1.read())

print"2)urllib2下載網(wǎng)頁(yè)方法1"
# 創(chuàng)建Request對(duì)象
request = urllib2.Request(url)
# 添加數(shù)據(jù)
# request.add_data('a', '1')
# 添加http的header
request.add_header('User-Agent', 'Mozilla/5.0')
# 發(fā)送請(qǐng)求獲取結(jié)果
response2 = urllib2.urlopen(request)
print response2.getcode()
print len(response2.read())

print"3)添加特殊情景的處理器"
# 創(chuàng)建cookie容器
cj = cookielib.CookieJar()
# 創(chuàng)建1個(gè)opener
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
# 給urllib2安裝opener
urllib2.install_opener(opener)
# 使用帶有cookie的urllib2訪問(wèn)網(wǎng)頁(yè)
response3 = urllib2.urlopen(url)
print response3.getcode()
print cj
print response3.read()
  • 網(wǎng)頁(yè)解析器


下面介紹一下beautifulsoup4(Python第三方庫(kù)等龙,用于從HTML或XML中提取數(shù)據(jù))
首先处渣,安裝beautifulsoup4


測(cè)試代碼

測(cè)試成功

下面我們來(lái)看看Beautifulsoup的實(shí)例分析

# coding:utf-8
from bs4 import BeautifulSoup
import re

#舉例:解析網(wǎng)頁(yè)文檔字符串
html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>

<p class="story">Once upon a time there were three little sisters; and their names were
<a  class="sister" id="link1">Elsie</a>,
<a  class="sister" id="link2">Lacie</a> and
<a  class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>

<p class="story">...</p>
"""

# 創(chuàng)建Beautifulsoup對(duì)象
soup = BeautifulSoup(html_doc,               #HTML文檔字符
                     'html.parser',          #HTML解析器
                     from_encoding='utf-8')  #HTML文檔的編碼
#方法find_all(name,attrs,string) 節(jié)點(diǎn)名稱、節(jié)點(diǎn)屬性蛛砰、節(jié)點(diǎn)內(nèi)容
print '獲取所有的鏈接'
links=soup.find_all('a')
for link in links:
    print link.name,link['href'],link.get_text()

print '獲取Lacie的鏈接'
link_code = soup.find('a',)
print link_code.name,link_code['href'],link_code.get_text()

# bs4之強(qiáng)大:支持正則匹配
print'正則匹配'
link_node = soup.find('a',href=re.compile(r"ill"))
print link_node.name,link_node['href'],link_node.get_text()

print '獲取P段落文字'
p_node = soup.find('p',class_="title")  #class要加下劃線
print p_node.name,p_node.get_text()

4罐栈、實(shí)戰(zhàn)演練:爬取百度百科1000個(gè)頁(yè)面的數(shù)據(jù)

  • 確定目標(biāo):確定要抓取哪個(gè)網(wǎng)站的哪些網(wǎng)頁(yè)的哪些數(shù)據(jù)
  • 分析目標(biāo):制定抓取這些網(wǎng)站數(shù)據(jù)的策略(URL格式、數(shù)據(jù)格式泥畅、頁(yè)面編碼)[ 實(shí)際操作:打開(kāi)網(wǎng)站荠诬,鎖定位置,右鍵審查元素]

以下是我在慕課網(wǎng)學(xué)習(xí)簡(jiǎn)單爬蟲(chóng)來(lái)爬取百度百科的總結(jié):

  • 思路:一個(gè)url管理器位仁,來(lái)獲取和管理所有需要爬取的鏈接a柑贞,比如在這里我們先獲取https://baike.baidu.com/item/Python這個(gè)頁(yè)面的所有a標(biāo)簽,將其存入一個(gè)容器(new_urls)中聂抢,然后依次爬取這個(gè)容器中的所有url钧嘶,每爬一次,把爬取過(guò)的url從這個(gè)容器中刪去琳疏,加入到old_urls容器中, 并且加入到new_urls時(shí)要判斷這個(gè)url是否在new_urls和old_urls已經(jīng)存在有决,若存在,不加入轿亮,防止重復(fù)爬取疮薇。然后通過(guò)頁(yè)面下載器利用urllib2下載我們需要的頁(yè)面代碼,頁(yè)面解析器html_parse利用beautifulsoup獲取我們需要的數(shù)據(jù)我注。

    目錄展示

  • 具體代碼
    1.主函數(shù) spider_main.py

# coding:utf-8
from baike_spider import url_manager, html_downloader, html_parser, html_outputer


class SpiderMain(object):
    def __init__(self):
        self.urls = url_manager.UrlManager()
        self.downloader = html_downloader.HtmlDownloader()
        self.parser = html_parser.HtmlParser()
        self.outputer = html_outputer.HtmlOutputer()

    def craw(self, root_url):
        count = 1
        self.urls.add_new_url(root_url)

        while self.urls.has_new_url():
            try:
                new_url = self.urls.get_new_url()
                print 'craw %d : %s' % (count, new_url)
                html_cont = self.downloader.download(new_url)
                new_urls, new_data = self.parser.parse(new_url, html_cont)
                self.urls.add_new_urls(new_urls)
                self.outputer.collect_data(new_data)

                if count == 1000:
                    break
                count = count + 1
            except:
                print 'craw failed'

        self.outputer.output_html()

if __name__ == "__main__":
    # 爬蟲(chóng)入口頁(yè)面
    root_url = "https://baike.baidu.com/item/Python/407313"
    obj_spider = SpiderMain()
    # 啟動(dòng)爬蟲(chóng)
    obj_spider.craw(root_url)

2.url管理器 url_manager.py

# coding:utf-8

class UrlManager(object):
    def __init__(self):
        self.new_urls = set()
        self.old_urls = set()

    #向管理器中添加新的url
    def add_new_url(self, url):
        if url is None:
            return
        if url not in self.new_urls and url not in self.old_urls:
            self.new_urls.add(url)

    #向管理器中添加批量的url
    def add_new_urls(self, urls):
        if urls is None or len(urls) == 0:
            return
        for url in urls:
            self.add_new_url(url)

    #判斷管理器中是否有新的url
    def has_new_url(self):
        return len(self.new_urls) != 0

    #獲取新的帶爬取的url
    def get_new_url(self):
        new_url = self.new_urls.pop()  # 獲取并移除
        self.old_urls.add(new_url)
        return new_url

3.頁(yè)面下載器 html_downloader.py

# coding:utf-8
import urllib2

class HtmlDownloader(object):

    def download(self,url):
        if url is None:
            return None

        response=urllib2.urlopen(url) #因?yàn)榘俣劝倏票容^簡(jiǎn)單按咒,所以只使用了urllib2這個(gè)模塊最簡(jiǎn)單的方法

        if response.getcode() != 200:
            return None

        return response.read()

4.頁(yè)面解析器 html_parser.py

# coding:utf-8

from bs4 import BeautifulSoup
import re
import urlparse

class HtmlParser(object):
    def _get_new_urls(self, page_url, soup):
        new_urls = set()
        # /view/123.htm
        # links = soup.find_all('a', href=re.compile(r"/item/\d+\.html"))
        links = soup.find_all('a', href=re.compile(r"/item/(.*)"))
        for link in links:
            new_url = link['href']
            new_full_url = urlparse.urljoin(page_url, new_url)  # 拼接url
            new_urls.add(new_full_url)
        return new_urls

    def _get_new_data(self, page_url, soup):
        res_data = {}  # 字典

        # url
        res_data['url'] = page_url

        # <dd class="lemmaWgt-lemmaTitle-title"><h1>Python</h1>
        title_node = soup.find('dd', class_="lemmaWgt-lemmaTitle-title").find("h1")
        res_data['title'] = title_node.get_text()

        # <div class="lemma-summary" label-module="lemmaSummary">
        summary_node = soup.find('div', class_="lemma-summary")
        res_data['summary'] = summary_node.get_text()
        return res_data

    def parse(self, page_url, html_cont):
        if page_url is None or html_cont is None:
            return

        soup = BeautifulSoup(html_cont, 'html.parser', from_encoding='utf-8')
        new_urls = self._get_new_urls(page_url, soup)
        new_data = self._get_new_data(page_url, soup)
        return new_urls, new_data

4.頁(yè)面輸出器 html_outputer.py

# coding:utf-8

class HtmlOutputer(object):
    def     __init__(self):
        self.datas = []

    def collect_data(self, data):
        if data is None:
            return
        self.datas.append(data)

    def output_html(self):
        fout = open('output.html', "w")

        fout.write("<html>")
        fout.write("<body>")
        fout.write("<table>")

        # ascii
        for data in self.datas:
            fout.write("<tr>")
            fout.write("<td>%s</td>" % data['url'])
            fout.write("<td>%s</td>" % data['title'].encode('utf-8'))
            fout.write("<td>%s</td>" % data['summary'].encode('utf-8'))
            fout.write("</tr>")

        fout.write("</html>")
        fout.write("</body>")
        fout.write("</table>")

        fout.close()

運(yùn)行后,會(huì)在目錄下產(chǎn)生output.html但骨,這個(gè)文件即是爬取結(jié)果的展示励七。



成功爬取完1000個(gè)頁(yè)面的數(shù)據(jù)!

5奔缠、可以再深入理解一下爬蟲(chóng)的意義了

大家可以觀看這篇大話爬蟲(chóng)這篇文章掠抬!
然后就是知乎這篇文章如何入門python爬蟲(chóng)

下面稍微做一下總結(jié):

1、Python基礎(chǔ)準(zhǔn)備(可以去看廖雪峰老師的教程校哎,2.7的两波。至少這些功能和語(yǔ)法你要有基本的掌握 )

  • list瞳步,dict:用來(lái)序列化你爬的東西
  • 切片:用來(lái)對(duì)爬取的內(nèi)容進(jìn)行分割,生成
  • 條件判斷(if等):用來(lái)解決爬蟲(chóng)過(guò)程中哪些要哪些不要的問(wèn)題
  • 循環(huán)和迭代(for while ):用來(lái)循環(huán)腰奋,重復(fù)爬蟲(chóng)動(dòng)作
  • 文件讀寫操作:用來(lái)讀取參數(shù)单起、保存爬下來(lái)的內(nèi)容等

2、網(wǎng)頁(yè)基本知識(shí)

  • 基本的HTML語(yǔ)言知識(shí)(知道href等大學(xué)計(jì)算機(jī)一級(jí)內(nèi)容即可)
  • 理解網(wǎng)站的發(fā)包和收包的概念(POST GET)
  • 稍微一點(diǎn)點(diǎn)的js知識(shí)劣坊,用于理解動(dòng)態(tài)網(wǎng)頁(yè)(當(dāng)然如果本身就懂當(dāng)然更好啦)

3嘀倒、分析語(yǔ)言

  • NO.1 正則表達(dá)式:扛把子技術(shù),總得會(huì)最基礎(chǔ)的
  • NO.2 XPATH:高效的分析語(yǔ)言局冰,表達(dá)清晰簡(jiǎn)單测蘑,掌握了以后基本可以不用正則
    參考:XPath 教程
  • NO.3 Beautifulsoup:
    美麗湯模塊解析網(wǎng)頁(yè)神器,一款神器,如果不用一些爬蟲(chóng)框架(如后文講到的scrapy)康二,配合request碳胳,urllib等模塊(后面會(huì)詳細(xì)講),可以編寫各種小巧精干的爬蟲(chóng)腳本
    官網(wǎng)文檔:Beautiful Soup 4.2.0 文檔

4沫勿、高效工具輔助

  • NO.1 F12 開(kāi)發(fā)者工具:
    看源代碼:快速定位元素
    分析xpath:1固逗、此處建議谷歌系瀏覽器,可以在源碼界面直接右鍵看
  • NO.2 抓包工具:
    推薦httpfox,火狐瀏覽器下的插件,比谷歌火狐系自帶的F12工具都要好藕帜,可以方便查看網(wǎng)站收包發(fā)包的信息
  • NO.3 XPATH CHECKER (火狐插件):
    非常不錯(cuò)的xpath測(cè)試工具,但是有幾個(gè)坑惜傲,都是個(gè)人踩過(guò)的洽故,在此告誡大家:
    1、xpath checker生成的是絕對(duì)路徑盗誊,遇到一些動(dòng)態(tài)生成的圖標(biāo)(常見(jiàn)的有列表翻頁(yè)按鈕等)时甚,飄忽不定的絕對(duì)路徑很有可能造成錯(cuò)誤,所以這里建議在真正分析的時(shí)候哈踱,只是作為參考
    2荒适、記得把如下圖xpath框里的“x:”去掉,貌似這個(gè)是早期版本xpath的語(yǔ)法开镣,目前已經(jīng)和一些模塊不兼容(比如scrapy)刀诬,還是刪去避免報(bào)錯(cuò)
  • NO.4 正則表達(dá)測(cè)試工具:
    在線正則表達(dá)式測(cè)試 ,拿來(lái)多練練手邪财,也輔助分析陕壹!里面有很多現(xiàn)成的正則表達(dá)式可以用,也可以進(jìn)行參考树埠!

5糠馆、更多

  • 模塊:python的火,很大原因就是各種好用的模塊怎憋,這些模塊是居家旅行爬網(wǎng)站常備的又碌。
    urllib
    urllib2
    requests
  • 框架:不想重復(fù)造輪子九昧,有沒(méi)有現(xiàn)成的框架?
    華麗麗的scrapy
  • 遇到動(dòng)態(tài)頁(yè)面怎么辦毕匀?
    selenium(會(huì)了這個(gè)配合scrapy無(wú)往不利铸鹰,是居家旅行爬網(wǎng)站又一神器,下一版更新的時(shí)候會(huì)著重安利期揪,因?yàn)檫@塊貌似目前網(wǎng)上的教程還很少)
    phantomJS(不顯示網(wǎng)頁(yè)的selenium)
  • 遇到反爬蟲(chóng)策略驗(yàn)證碼之類咋整掉奄?
    PIL
    opencv
    pybrain
    打碼平臺(tái)
  • 數(shù)據(jù)庫(kù):這里我認(rèn)為開(kāi)始并不需要非常深入,在需要的時(shí)候再學(xué)習(xí)即可凤薛。
    mysql
    mongodb
    sqllite
  • 爬來(lái)的東西怎么用姓建?
    numpy 數(shù)據(jù)分析,類似matlab的模塊
    pandas(基于numpy的數(shù)據(jù)分析模塊缤苫,相信我速兔,如果你不是專門搞TB級(jí)數(shù)據(jù)的,這個(gè)就夠了)
  • 進(jìn)階技術(shù):
    多線程
    分布式

三活玲、后期思考與改進(jìn)

1)效率
如果你直接加工一下上面的代碼直接運(yùn)行的話涣狗,你需要一整年才能爬下整個(gè)豆瓣的內(nèi)容。更別說(shuō)Google這樣的搜索引擎需要爬下全網(wǎng)的內(nèi)容了舒憾。

問(wèn)題出在哪呢镀钓?需要爬的網(wǎng)頁(yè)實(shí)在太多太多了,而上面的代碼太慢太慢了镀迂。設(shè)想全網(wǎng)有N個(gè)網(wǎng)站丁溅,那么分析一下判重的復(fù)雜度就是N*log(N),因?yàn)樗芯W(wǎng)頁(yè)要遍歷一次探遵,而每次判重用set的話需要log(N)的復(fù)雜度窟赏。OK,OK箱季,我知道python的set實(shí)現(xiàn)是hash——不過(guò)這樣還是太慢了涯穷,至少內(nèi)存使用效率不高。

通常的判重做法是怎樣呢藏雏?Bloom Filter. 簡(jiǎn)單講它仍然是一種hash的方法拷况,但是它的特點(diǎn)是,它可以使用固定的內(nèi)存(不隨url的數(shù)量而增長(zhǎng))以O(shè)(1)的效率判定url是否已經(jīng)在set中掘殴◎鸺危可惜天下沒(méi)有白吃的午餐,它的唯一問(wèn)題在于杯巨,如果這個(gè)url不在set中蚤告,BF可以100%確定這個(gè)url沒(méi)有看過(guò)。但是如果這個(gè)url在set中服爷,它會(huì)告訴你:這個(gè)url應(yīng)該已經(jīng)出現(xiàn)過(guò)杜恰,不過(guò)我有2%的不確定性获诈。注意這里的不確定性在你分配的內(nèi)存足夠大的時(shí)候,可以變得很小很少心褐。一個(gè)簡(jiǎn)單的教程:Bloom Filters by Example
注意到這個(gè)特點(diǎn)舔涎,url如果被看過(guò),那么可能以小概率重復(fù)看一看(沒(méi)關(guān)系逗爹,多看看不會(huì)累死)亡嫌。但是如果沒(méi)被看過(guò),一定會(huì)被看一下(這個(gè)很重要掘而,不然我們就要漏掉一些網(wǎng)頁(yè)了P凇)。 [IMPORTANT: 此段有問(wèn)題袍睡,請(qǐng)暫時(shí)略過(guò)]
好知染,現(xiàn)在已經(jīng)接近處理判重最快的方法了。另外一個(gè)瓶頸——你只有一臺(tái)機(jī)器斑胜。不管你的帶寬有多大控淡,只要你的機(jī)器下載網(wǎng)頁(yè)的速度是瓶頸的話,那么你只有加快這個(gè)速度止潘。用一臺(tái)機(jī)子不夠的話——用很多臺(tái)吧掺炭!當(dāng)然,我們假設(shè)每臺(tái)機(jī)子都已經(jīng)進(jìn)了最大的效率——使用多線程(python的話凭戴,多進(jìn)程吧)竹伸。

2)集群化抓取
爬取豆瓣的時(shí)候,我(這不是我hh)總共用了100多臺(tái)機(jī)器晝夜不停地運(yùn)行了一個(gè)月簇宽。想象如果只用一臺(tái)機(jī)子你就得運(yùn)行100個(gè)月了...
那么,假設(shè)你現(xiàn)在有100臺(tái)機(jī)器可以用吧享,怎么用python實(shí)現(xiàn)一個(gè)分布式的爬取算法呢魏割?
我們把這100臺(tái)中的99臺(tái)運(yùn)算能力較小的機(jī)器叫作slave,另外一臺(tái)較大的機(jī)器叫作master钢颂,那么回顧上面代碼中的url_queue钞它,如果我們能把這個(gè)queue放到這臺(tái)master機(jī)器上,所有的slave都可以通過(guò)網(wǎng)絡(luò)跟master聯(lián)通殊鞭,每當(dāng)一個(gè)slave完成下載一個(gè)網(wǎng)頁(yè)遭垛,就向master請(qǐng)求一個(gè)新的網(wǎng)頁(yè)來(lái)抓取。而每次slave新抓到一個(gè)網(wǎng)頁(yè)操灿,就把這個(gè)網(wǎng)頁(yè)上所有的鏈接送到master的queue里去锯仪。同樣,bloom filter也放到master上趾盐,但是現(xiàn)在master只發(fā)送確定沒(méi)有被訪問(wèn)過(guò)的url給slave庶喜。Bloom Filter放到master的內(nèi)存里小腊,而被訪問(wèn)過(guò)的url放到運(yùn)行在master上的Redis里,這樣保證所有操作都是O(1)久窟。(至少平攤是O(1)秩冈,Redis的訪問(wèn)效率見(jiàn):LINSERT – Redis)

3)后續(xù)處理

  • 有效地存儲(chǔ)(數(shù)據(jù)庫(kù)應(yīng)該怎樣安排)
  • 有效地判重(這里指網(wǎng)頁(yè)判重,咱可不想把人民日?qǐng)?bào)和抄襲它的大民日?qǐng)?bào)都爬一遍)
  • 有效地信息抽瘸饪浮(比如怎么樣抽取出網(wǎng)頁(yè)上所有的地址抽取出來(lái)入问,“朝陽(yáng)區(qū)奮進(jìn)路-
    中華道”),搜索引擎通常不需要存儲(chǔ)所有的信息稀颁,比如圖片我存來(lái)干嘛...
  • 及時(shí)更新(預(yù)測(cè)這個(gè)網(wǎng)頁(yè)多久會(huì)更新一次)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末芬失,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子峻村,更是在濱河造成了極大的恐慌麸折,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件粘昨,死亡現(xiàn)場(chǎng)離奇詭異垢啼,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)张肾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門芭析,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人吞瞪,你說(shuō)我怎么就攤上這事馁启。” “怎么了芍秆?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵惯疙,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我妖啥,道長(zhǎng)霉颠,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任荆虱,我火速辦了婚禮蒿偎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘怀读。我一直安慰自己诉位,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布菜枷。 她就那樣靜靜地躺著苍糠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪啤誊。 梳的紋絲不亂的頭發(fā)上椿息,一...
    開(kāi)封第一講書(shū)人閱讀 51,190評(píng)論 1 299
  • 那天歹袁,我揣著相機(jī)與錄音,去河邊找鬼寝优。 笑死条舔,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的乏矾。 我是一名探鬼主播孟抗,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼钻心!你這毒婦竟也來(lái)了凄硼?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤捷沸,失蹤者是張志新(化名)和其女友劉穎摊沉,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體痒给,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡说墨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了苍柏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尼斧。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖试吁,靈堂內(nèi)的尸體忽然破棺而出棺棵,到底是詐尸還是另有隱情,我是刑警寧澤熄捍,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布烛恤,位于F島的核電站,受9級(jí)特大地震影響余耽,放射性物質(zhì)發(fā)生泄漏缚柏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一宾添、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧柜裸,春花似錦缕陕、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至铐然,卻和暖如春蔬崩,著一層夾襖步出監(jiān)牢的瞬間恶座,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工沥阳, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留跨琳,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓桐罕,卻偏偏與公主長(zhǎng)得像脉让,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子功炮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

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