Scrapy框架學(xué)習(xí)從基礎(chǔ)到分布式搭建

一要糊、什么是Scrapy?

Scrapy是一個(gè)為了爬取網(wǎng)站數(shù)據(jù)妆丘,提取結(jié)構(gòu)性數(shù)據(jù)而編寫的應(yīng)用框架锄俄,非常出名,非常強(qiáng)悍勺拣。所謂的框架就是一個(gè)已經(jīng)被集成了各種功能(高性能異步下載奶赠,隊(duì)列,分布式药有,解析毅戈,持久化等)的具有很強(qiáng)通用性的項(xiàng)目模板。對(duì)于框架的學(xué)習(xí)愤惰,重點(diǎn)是要學(xué)習(xí)其框架的特性苇经、各個(gè)功能的用法即可。

二宦言、安裝Scrapy:

Linux:
pip3 install scrapy

Windows:
a. pip3 install wheel
b. 下載twisted http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
c. 進(jìn)入下載目錄扇单,執(zhí)行 pip3 install Twisted?17.1.0?cp35?cp35m?win_amd64.whl
d. pip3 install pywin32
e. pip3 install scrapy

三、Scrapy基礎(chǔ)使用步驟:

1.創(chuàng)建項(xiàng)目:scrapy startproject 項(xiàng)目名稱
  項(xiàng)目結(jié)構(gòu):
project_name/
  scrapy.cfg:
  project_name/
    _init.py
    items.py
    pipelines.py
    settings.py
    spiders/
      _init
.py
scrapy.cfg 項(xiàng)目的主配置信息蜡励。(真正爬蟲相關(guān)的配置信息在settings.py文件中)
items.py 設(shè)置數(shù)據(jù)存儲(chǔ)模板令花,用于結(jié)構(gòu)化數(shù)據(jù),如:Django的Model
pipelines 數(shù)據(jù)持久化處理
settings.py 配置文件凉倚,如:遞歸的層數(shù)兼都、并發(fā)數(shù),延遲下載等
spiders 爬蟲目錄稽寒,如:創(chuàng)建文件扮碧,編寫爬蟲解析規(guī)則
.
2.創(chuàng)建爬蟲應(yīng)用程序:
   cd project_name(進(jìn)入項(xiàng)目目錄)
   scrapy genspider 應(yīng)用名稱 爬取網(wǎng)頁的起始url (例如:scrapy genspider qiubai www.qiushibaike.com
.
3.編寫爬蟲文件:在步驟2執(zhí)行完畢后,會(huì)在項(xiàng)目的spiders中生成一個(gè)應(yīng)用名的py爬蟲文件,文件源碼如下:

Scrapy.png

4.設(shè)置修改settings.py配置文件相關(guān)配置:
相關(guān)配置

5.執(zhí)行爬蟲程序:scrapy crawl 應(yīng)用名稱

流程演示代碼示例:

import scrapy

class QiubaiSpider(scrapy.Spider):
    name = 'qiubai'
    allowed_domains = ['https://www.qiushibaike.com/']
    start_urls = ['https://www.qiushibaike.com/']

    def parse(self, response):
        // xpath為response中的方法慎王,可以將xpath表達(dá)式直接作用于該函數(shù)中
        odiv = response.xpath('//div[@id="content-left"]/div')
        with open('./data.txt', 'w') as fp:
            for div in odiv:

                 // xpath函數(shù)返回的為列表蚓土,列表中存放的數(shù)據(jù)為Selector類型的數(shù)據(jù)。我們解析到的
                 //內(nèi)容被封裝在了Selector對(duì)象中赖淤,需要調(diào)用extract()函數(shù)將解析的內(nèi)容從Selecor中取出蜀漆。
                 author = div.xpath('.//div[@class="author clearfix"]/a/h2/text()')[0].extract()
                 content=div.xpath('.//div[@class="content"]/span/text()')[0].extract()

                 // 持久化存儲(chǔ)爬取到的內(nèi)容
                 fp.write(author + ':' + content + '\n')

上述代碼表示的持久化操作是我們自己通過IO操作將數(shù)據(jù)進(jìn)行的文件存儲(chǔ)。在scrapy框架中已經(jīng)為我們專門集成好了高效咱旱、便捷的持久化操作功能确丢,我們直接使用即可。要想使用scrapy的持久化操作功能吐限,我們首先來認(rèn)識(shí)如下兩個(gè)文件:
  items.py:數(shù)據(jù)結(jié)構(gòu)模板文件鲜侥。定義數(shù)據(jù)屬性。
  pipelines.py:管道文件诸典。接收數(shù)據(jù)(items)描函,進(jìn)行持久化操作。
.
持久化流程:
  1.爬蟲文件爬取到數(shù)據(jù)后狐粱,需要將數(shù)據(jù)封裝到items對(duì)象中舀寓。
  2.使用yield關(guān)鍵字將items對(duì)象提交給pipelines管道進(jìn)行持久化操作。
  3.settings.py配置文件中開啟管道

小試牛刀:
將糗事百科首頁中的段子和作者數(shù)據(jù)爬取下來肌蜻,然后進(jìn)行持久化存儲(chǔ)

爬蟲文件:qiubaiDemo.py

import scrapy
from secondblood.items import SecondbloodItem

class QiubaidemoSpider(scrapy.Spider):
    name = 'qiubaiDemo'
    allowed_domains = ['www.qiushibaike.com']
    start_urls = ['http://www.qiushibaike.com/']

    def parse(self, response):
        odiv = response.xpath('//div[@id="content-left"]/div')
        for div in odiv:
            //xpath函數(shù)返回的為列表基公,列表中存放的數(shù)據(jù)為Selector類型的數(shù)據(jù)。我們解析到的內(nèi)
            //容被封裝在了Selector對(duì)象中宋欺,需要調(diào)用extract()函數(shù)將解析的內(nèi)容從Selecor中取出轰豆。
            author = div.xpath('.//div[@class="author clearfix"]//h2/text()').extract_first()
            author = author.strip('\n')#過濾空行
            content = div.xpath('.//div[@class="content"]/span/text()').extract_first()
            content = content.strip('\n')#過濾空行

            // 將解析到的數(shù)據(jù)封裝至items對(duì)象中
            item = SecondbloodItem()
            item['author'] = author
            item['content'] = content
            // 提交item到管道文件(pipelines.py)
            yield item

items文件:items.py

import scrapy

class SecondbloodItem(scrapy.Item):
     //存儲(chǔ)作者
    author = scrapy.Field() 
    //存儲(chǔ)段子內(nèi)容
    content = scrapy.Field() 

管道文件:pipelines.py

class SecondbloodPipeline(object):
    // 構(gòu)造方法
    def __init__(self):
        self.fp = None  #定義一個(gè)文件描述符屬性
  // 下列都是在重寫父類的方法:
    // 開始爬蟲時(shí),執(zhí)行一次
    def open_spider(self,spider):
        print('爬蟲開始')
        self.fp = open('./data.txt', 'w')

   // 因?yàn)樵摲椒〞?huì)被執(zhí)行調(diào)用多次齿诞,所以文件的開啟和關(guān)閉操作寫在了另外兩個(gè)只會(huì)各自執(zhí)行一次的方法中酸休。
    def process_item(self, item, spider):
        // 將爬蟲程序提交的item進(jìn)行持久化存儲(chǔ)
        self.fp.write(item['author'] + ':' + item['content'] + '\n')
        return item

    // 結(jié)束爬蟲時(shí),執(zhí)行一次
    def close_spider(self,spider):
        self.fp.close()
        print('爬蟲結(jié)束')

配置文件:settings.py

// 開啟管道
ITEM_PIPELINES = {
    'secondblood.pipelines.SecondbloodPipeline': 300, #300表示為優(yōu)先級(jí)祷杈,值越小優(yōu)先級(jí)越高
}

四斑司、Scrapy遞歸爬取多頁數(shù)據(jù):

需求:將糗事百科所有頁碼的作者和段子內(nèi)容數(shù)據(jù)進(jìn)行爬取且持久化存儲(chǔ):

import scrapy
from qiushibaike.items import QiushibaikeItem

class QiushiSpider(scrapy.Spider):
    name = 'qiushi'
    allowed_domains = ['www.qiushibaike.com']
    start_urls = ['https://www.qiushibaike.com/text/']

    // 爬取多頁
    pageNum = 1 #起始頁碼
    url = 'https://www.qiushibaike.com/text/page/%s/' #每頁的url

    def parse(self, response):
        div_list=response.xpath('//*[@id="content-left"]/div')
        for div in div_list:
            // //*[@id="qiushi_tag_120996995"]/div[1]/a[2]/h2
            author=div.xpath('.//div[@class="author clearfix"]//h2/text()').extract_first()
            author=author.strip('\n')
            content=div.xpath('.//div[@class="content"]/span/text()').extract_first()
            content=content.strip('\n')
            item=QiushibaikeItem()
            item['author']=author
            item['content']=content

            yield item #提交item到管道進(jìn)行持久化

         // 爬取所有頁碼數(shù)據(jù)
        if self.pageNum <= 13: #一共爬取13頁(共13頁)
            self.pageNum += 1
            url = format(self.url % self.pageNum)

            //遞歸爬取數(shù)據(jù):callback參數(shù)的值為回調(diào)函數(shù)(將url請(qǐng)求后,
            //得到的相應(yīng)數(shù)據(jù)繼續(xù)進(jìn)行parse解析)但汞,遞歸調(diào)用parse函數(shù)
            yield scrapy.Request(url=url,callback=self.parse)

五宿刮、Scrapy核心組件介紹:

Scrapy核心組件
image.png

引擎(Scrapy)
用來處理整個(gè)系統(tǒng)的數(shù)據(jù)流處理, 觸發(fā)事務(wù)(框架核心)
調(diào)度器(Scheduler)
用來接受引擎發(fā)過來的請(qǐng)求, 壓入隊(duì)列中, 并在引擎再次請(qǐng)求的時(shí)候返回. 可以想像成一個(gè)URL(抓取網(wǎng)頁的網(wǎng)址或者說是鏈接)的優(yōu)先隊(duì)列, 由它來決定下一個(gè)要抓取的網(wǎng)址是什么, 同時(shí)去除重復(fù)的網(wǎng)址
下載器(Downloader)
用于下載網(wǎng)頁內(nèi)容, 并將網(wǎng)頁內(nèi)容返回給蜘蛛(Scrapy下載器是建立在twisted這個(gè)高效的異步模型上的)
爬蟲(Spiders)
爬蟲是主要干活的, 用于從特定的網(wǎng)頁中提取自己需要的信息, 即所謂的實(shí)體(Item)。用戶也可以從中提取出鏈接,讓Scrapy繼續(xù)抓取下一個(gè)頁面
項(xiàng)目管道(Pipeline)
負(fù)責(zé)處理爬蟲從網(wǎng)頁中抽取的實(shí)體私蕾,主要的功能是持久化實(shí)體僵缺、驗(yàn)證實(shí)體的有效性、清除不需要的信息踩叭。當(dāng)頁面被爬蟲解析后磕潮,將被發(fā)送到項(xiàng)目管道翠胰,并經(jīng)過幾個(gè)特定的次序處理數(shù)據(jù)。

面試題:
如果最終需要將爬取到的數(shù)據(jù)值一份存儲(chǔ)到磁盤文件自脯,一份存儲(chǔ)到數(shù)據(jù)庫中之景,則應(yīng)該如何操作scrapy?

答案:
管道文件中的代碼為:

管道文件

在settings.py開啟管道操作代碼為:
settings配置代碼

六膏潮、Scrapy發(fā)起post請(qǐng)求:

- 問題:在之前代碼中锻狗,我們從來沒有手動(dòng)的對(duì)start_urls列表中存儲(chǔ)的起始url進(jìn)行過請(qǐng)求的發(fā)送,但是起始url的確是進(jìn)行了請(qǐng)求的發(fā)送焕参,那這是如何實(shí)現(xiàn)的呢屋谭?

- 解答:其實(shí)是因?yàn)榕老x文件中的爬蟲類繼承到了Spider父類中的start_requests(self)這個(gè)方法,該方法就可以對(duì)start_urls列表中的url發(fā)起請(qǐng)求
屏幕快照 2018-11-02 下午4.29.33.png

【注意】該方法默認(rèn)的實(shí)現(xiàn)龟糕,是對(duì)起始的url發(fā)起get請(qǐng)求,如果想發(fā)起post請(qǐng)求悔耘,則需要子類重寫該方法讲岁。

-方法: 重寫start_requests方法,讓其發(fā)起post請(qǐng)求:
屏幕快照 2018-11-02 下午4.36.19.png

七衬以、scrapy框架之日志等級(jí)和請(qǐng)求傳參

Scrapy的日志等級(jí)
  - 在使用scrapy crawl spiderFileName運(yùn)行程序時(shí)缓艳,在終端里打印輸出的就是scrapy的日志信息。
  - 日志信息的種類:
        ERROR : 一般錯(cuò)誤
        WARNING : 警告
        INFO : 一般的信息
        DEBUG : 調(diào)試信息
        默認(rèn)的顯示級(jí)別是DEBUG
  - 設(shè)置日志信息指定輸出:
    在settings.py配置文件中看峻,加入LOG_LEVEL = ‘指定日志信息種類’即可阶淘。LOG_FILE = 'log.txt'則表示將日志信息寫入到指定文件中進(jìn)行存儲(chǔ)。

請(qǐng)求傳參
  - 在某些情況下互妓,我們爬取的數(shù)據(jù)不在同一個(gè)頁面中溪窒,例如,我們爬取一個(gè)電影網(wǎng)站队寇,電影的名稱璧诵,評(píng)分在一級(jí)頁面墅冷,而要爬取的其他電影詳情在其二級(jí)子頁面中。這時(shí)我們就需要用到請(qǐng)求傳參宛瞄。
傳參代碼示例:

// spider.py文件
import scrapy
from moviePro.items import MovieproItem

class MovieSpider(scrapy.Spider):
   name = 'movie'
   allowed_domains = ['www.id97.com']
   start_urls = ['http://www.id97.com/']

   def parse(self, response):
       div_list = response.xpath('//div[@class="col-xs-1-5 movie-item"]')

       for div in div_list:
           item = MovieproItem()
           item['name'] = div.xpath('.//h1/a/text()').extract_first()
           item['score'] = div.xpath('.//h1/em/text()').extract_first()
           #xpath(string(.))表示提取當(dāng)前節(jié)點(diǎn)下所有子節(jié)點(diǎn)中的數(shù)據(jù)值(.)表示當(dāng)前節(jié)點(diǎn)
           item['kind'] = div.xpath('.//div[@class="otherinfo"]').xpath('string(.)').extract_first()
           item['detail_url'] = div.xpath('./div/a/@href').extract_first()
           #請(qǐng)求二級(jí)詳情頁面,解析二級(jí)頁面中的相應(yīng)內(nèi)容,通過meta參數(shù)進(jìn)行Request的數(shù)據(jù)傳遞
           yield scrapy.Request(url=item['detail_url'],callback=self.parse_detail,meta={'item':item})

   def parse_detail(self,response):
       #通過response獲取item
       item = response.meta['item']
       item['actor'] = response.xpath('//div[@class="row"]//table/tr[1]/a/text()').extract_first()
       item['time'] = response.xpath('//div[@class="row"]//table/tr[7]/td[2]/text()').extract_first()
       item['long'] = response.xpath('//div[@class="row"]//table/tr[8]/td[2]/text()').extract_first()
       #提交item到管道
       yield item
//items.py文件

import scrapy

class MovieproItem(scrapy.Item):
    # define the fields for your item here like:
    name = scrapy.Field()
    score = scrapy.Field()
    time = scrapy.Field()
    long = scrapy.Field()
    actor = scrapy.Field()
    kind = scrapy.Field()
    detail_url = scrapy.Field()
//pipelines.py文件
import json

class MovieproPipeline(object):
    def __init__(self):
        self.fp = open('data.txt','w')
    def process_item(self, item, spider):
        dic = dict(item)
        print(dic)
        json.dump(dic,self.fp,ensure_ascii=False)
        return item
    def close_spider(self,spider):
        self.fp.close()

八交胚、Scrapy框架之CrawlSpider操作

提問:如果想要通過爬蟲程序去爬取”糗百“全站數(shù)據(jù)新聞數(shù)據(jù)的話份汗,有幾種實(shí)現(xiàn)方法?
  方法一:基于Scrapy框架中的Spider的遞歸爬取進(jìn)行實(shí)現(xiàn)(Request模塊遞歸回調(diào)parse方法)蝴簇。
  方法二:基于CrawlSpider的自動(dòng)爬取進(jìn)行實(shí)現(xiàn)(更加簡(jiǎn)潔和高效)杯活。

CrawlSpider簡(jiǎn)介
  CrawlSpider其實(shí)是Spider的一個(gè)子類,除了繼承到Spider的特性和功能外熬词,還派生除了其自己獨(dú)有的更加強(qiáng)大的特性和功能轩猩。其中最顯著的功能就是”LinkExtractors鏈接提取器“。Spider是所有爬蟲的基類,其設(shè)計(jì)原則只是為了爬取start_url列表中網(wǎng)頁均践,而從爬取到的網(wǎng)頁中提取出的url進(jìn)行繼續(xù)的爬取工作使用CrawlSpider更合適晤锹。

CrawSpider的使用
  1.創(chuàng)建scrapy工程:scrapy startproject projectName
  2.創(chuàng)建爬蟲文件:scrapy genspider -t crawl spiderName www.xxx.com
    --此指令對(duì)比以前的指令多了 "-t crawl",表示創(chuàng)建的爬蟲文件是
    基于CrawlSpider這個(gè)類的彤委,而不再是Spider這個(gè)基類鞭铆。
  3.settings.py文件配置:
    USER_AGENT、ROBOTSTXT_OBEY焦影、ITEM_PIPELINES
  4.執(zhí)行爬蟲程序:scrapy crawl 應(yīng)用名稱 --nolog

爬蟲文件示例:

from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from redisScrapyPro.items import RedisscrapyproItem

class RedisdemoSpider(CrawlSpider):
    name = 'redisDemo'
    start_urls = ['https://dig.chouti.com/r/scoff/hot/1']

    # 實(shí)例化了一個(gè)鏈接提取器對(duì)象:allow:正則表達(dá)式
    # 作用:將起始url對(duì)應(yīng)的頁面數(shù)據(jù)中符合allow指定的正則表達(dá)式的鏈接進(jìn)行提取
    link = LinkExtractor(allow=r'/r/scoff/hot/\d+')
    rules = (
        # Rule規(guī)則解析器
        # 作用:可以將連接提取器提取到的鏈接對(duì)應(yīng)的頁面數(shù)據(jù)進(jìn)行指定規(guī)則的數(shù)據(jù)進(jìn)行解析
        # 參數(shù)follow作用:將連接提取器繼續(xù)作用到連接提取器提取出的鏈接所對(duì)應(yīng)的頁面中
        Rule(link, callback='parse_item', follow=True),
    )
    def parse_item(self, response):
        div_list = response.xpath('//*[@id="content-list"]/div')
        for div in div_list:
            text = div.xpath('./*[@class="news-content"]/div/a/text()').extract_first().strip("\n")
            item = RedisscrapyproItem()
            item['text'] = text
            yield item

items.py

import scrapy

class RedisscrapyproItem(scrapy.Item):
    text = scrapy.Field()

pipelines.py

class RedisscrapyproPipeline(object):
    def process_item(self, item, spider):
        print(item['text'])

CrawlSpider類和Spider類的最大不同是CrawlSpider多了一個(gè)rules屬性车遂,其作用是定義”提取動(dòng)作“。在rules中可以包含一個(gè)或多個(gè)Rule對(duì)象斯辰,在Rule對(duì)象中包含了LinkExtractor對(duì)象舶担。
參數(shù)介紹:
  LinkExtractor:顧名思義,鏈接提取器彬呻。提取response中符合規(guī)則的鏈接衣陶。
  Rule: 規(guī)則解析器。根據(jù)鏈接提取器中提取到的鏈接闸氮,根據(jù)指定規(guī)則提取解析器鏈接網(wǎng)頁中的內(nèi)容剪况。 Rule(LinkExtractor(allow=r'Items/'), callback='parse_item', follow=True)
    - 參數(shù)介紹:
      參數(shù)1:指定鏈接提取器
      參數(shù)2:指定規(guī)則解析器解析數(shù)據(jù)的規(guī)則(回調(diào)函數(shù))
      參數(shù)3:是否將鏈接提取器繼續(xù)作用到鏈接提取器提取出的鏈接網(wǎng)頁中。當(dāng)callback為None,參數(shù)3的默認(rèn)值為true蒲跨。
  rules=( ):指定不同規(guī)則解析器译断。一個(gè)Rule對(duì)象表示一種提取規(guī)則。
  
CrawlSpider整體爬取流程:
  a)爬蟲文件首先根據(jù)起始url或悲,獲取該url的網(wǎng)頁內(nèi)容
  b)鏈接提取器會(huì)根據(jù)指定提取規(guī)則將步驟a中網(wǎng)頁內(nèi)容中的鏈接進(jìn)行提取
  c)規(guī)則解析器會(huì)根據(jù)指定解析規(guī)則將鏈接提取器中提取到的鏈接中的網(wǎng)頁內(nèi)容根據(jù)指定的規(guī)則進(jìn)行解析
  d)將解析數(shù)據(jù)封裝到item中孙咪,然后提交給管道進(jìn)行持久化存儲(chǔ)

九、Scrapy框架鏈接數(shù)據(jù)庫操作:

數(shù)據(jù)持久化:
1.對(duì)數(shù)據(jù)做持久化可以直接將數(shù)據(jù)寫入文件中巡语,可以在pipelines.py中做IO操作该贾,也可以直接使用終端指令存儲(chǔ)指定文件格式:
    scrapy crawl qiubai -o qiubai.json
    scrapy crawl qiubai -o qiubai.xml
    scrapy crawl qiubai -o qiubai.csv
2.可以通過mysql、redis捌臊、mongodb等數(shù)據(jù)庫來存儲(chǔ)數(shù)據(jù)杨蛋,注意配置settings文件!

Mysql數(shù)據(jù)庫的使用pipelines.py示例:

import pymysql
class QiubaiproPipeline(object):

    conn = None
    cursor = None
    def open_spider(self,spider):
        print('開始爬蟲')
        #1. 鏈接數(shù)據(jù)庫
        self.conn = pymysql.Connect(host='127.0.0.1',port=3306,user='root',
            password='123456',db='qiubai')
    #編寫向數(shù)據(jù)庫中存儲(chǔ)數(shù)據(jù)的相關(guān)代碼
    def process_item(self, item, spider):
        #2. 執(zhí)行sql語句
        sql = 'insert into qiubai values("%s","%s")'%(item['author'],item['content'])
        self.cursor = self.conn.cursor()
        # 3.提交事務(wù)
        try:
            self.cursor.execute(sql)
            self.conn.commit()
        except Exception as e:
            print(e)
            self.conn.rollback()
        return item
    def close_spider(self,spider):
        print('爬蟲結(jié)束')
        self.cursor.close()
        self.conn.close()

redis數(shù)據(jù)庫的使用pipelines.py示例:

import redis

class QiubaiproPipeline(object):
    conn = None
    def open_spider(self,spider):
        print('開始爬蟲')
        self.conn = redis.Redis(host='127.0.0.1',port=6379)
    def process_item(self, item, spider):
        dict = {
            'author':item['author'],
            'content':item['content']
        }
        self.conn.lpush('data', dict)
        return item

十理澎、Scrapy框架的中間件:

中間件的作用
中間件可以攔截請(qǐng)求對(duì)象逞力,可以將請(qǐng)求對(duì)象的UA進(jìn)行偽裝,也可以將請(qǐng)求對(duì)象的url進(jìn)行篡改等糠爬。

settings.py文件配置
DOWNLOADER_MIDDLEWARES = {
  'proxyPro.middlewares.Myproxy': 543,
}

middleware.py文件

from scrapy import signals

class Myproxy(object):
    #該方法被調(diào)用后可以攔截請(qǐng)求對(duì)象
    #將請(qǐng)求對(duì)象的UA進(jìn)行偽裝
    #將請(qǐng)求對(duì)象的url進(jìn)行篡改
    def process_request(self, request, spider):
        #進(jìn)行請(qǐng)求代理ip設(shè)置
        #參數(shù)request就是中間件攔截到的請(qǐng)求對(duì)象
        request.meta['proxy'] = "https://151.106.15.8:1080"

十一寇荧、scrapy框架之分布式操作
兩種分布式爬蟲方案鏈接:http://www.reibang.com/p/5baa1d5eb6d9

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市执隧,隨后出現(xiàn)的幾起案子揩抡,更是在濱河造成了極大的恐慌户侥,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件峦嗤,死亡現(xiàn)場(chǎng)離奇詭異蕊唐,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)烁设,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門替梨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人装黑,你說我怎么就攤上這事副瀑。” “怎么了恋谭?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵糠睡,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我疚颊,道長(zhǎng)狈孔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任串稀,我火速辦了婚禮,結(jié)果婚禮上狮杨,老公的妹妹穿的比我還像新娘母截。我一直安慰自己,他們只是感情好橄教,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布清寇。 她就那樣靜靜地躺著,像睡著了一般护蝶。 火紅的嫁衣襯著肌膚如雪华烟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天持灰,我揣著相機(jī)與錄音盔夜,去河邊找鬼。 笑死堤魁,一個(gè)胖子當(dāng)著我的面吹牛喂链,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播妥泉,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼椭微,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了盲链?” 一聲冷哼從身側(cè)響起蝇率,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤迟杂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后本慕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體排拷,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年间狂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了攻泼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鉴象,死狀恐怖忙菠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情纺弊,我是刑警寧澤牛欢,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站淆游,受9級(jí)特大地震影響傍睹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜犹菱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一拾稳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧腊脱,春花似錦访得、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至杜耙,卻和暖如春搜骡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背佑女。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工记靡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人团驱。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓簸呈,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親店茶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蜕便,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

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