Python爬蟲(chóng)的N種姿勢(shì)

問(wèn)題的由來(lái)

??前幾天抬探,在微信公眾號(hào)(Python爬蟲(chóng)及算法)上有個(gè)人問(wèn)了筆者一個(gè)問(wèn)題针史,如何利用爬蟲(chóng)來(lái)實(shí)現(xiàn)如下的需求劝枣,需要爬取的網(wǎng)頁(yè)如下(網(wǎng)址為:https://www.wikidata.org/w/index.php?title=Special:WhatLinksHere/Q5&limit=500&from=0):

??我們的需求為爬取紅色框框內(nèi)的名人(有500條記錄男韧,圖片只展示了一部分)的 名字以及其介紹氢哮,關(guān)于其介紹皇型,點(diǎn)擊該名人的名字即可诬烹,如下圖:

name和description

這就意味著我們需要爬取500個(gè)這樣的頁(yè)面助析,即500個(gè)HTTP請(qǐng)求(暫且這么認(rèn)為吧),然后需要提取這些網(wǎng)頁(yè)中的名字和描述椅您,當(dāng)然有些不是名人外冀,也沒(méi)有描述,我們可以跳過(guò)掀泳。最后雪隧,這些網(wǎng)頁(yè)的網(wǎng)址在第一頁(yè)中的名人后面可以找到,如George Washington的網(wǎng)頁(yè)后綴為Q23.
??爬蟲(chóng)的需求大概就是這樣员舵。

爬蟲(chóng)的4種姿勢(shì)

??首先脑沿,分析來(lái)爬蟲(chóng)的思路:先在第一個(gè)網(wǎng)頁(yè)(https://www.wikidata.org/w/index.php?title=Special:WhatLinksHere/Q5&limit=500&from=0)中得到500個(gè)名人所在的網(wǎng)址,接下來(lái)就爬取這500個(gè)網(wǎng)頁(yè)中的名人的名字及描述马僻,如無(wú)描述庄拇,則跳過(guò)。
??接下來(lái)韭邓,我們將介紹實(shí)現(xiàn)這個(gè)爬蟲(chóng)的4種方法措近,并分析它們各自的優(yōu)缺點(diǎn),希望能讓讀者對(duì)爬蟲(chóng)有更多的體會(huì)女淑。實(shí)現(xiàn)爬蟲(chóng)的方法為:

  • 一般方法(同步瞭郑,requests+BeautifulSoup)
  • 并發(fā)(使用concurrent.futures模塊以及requests+BeautifulSoup)
  • 異步(使用aiohttp+asyncio+requests+BeautifulSoup)
  • 使用框架Scrapy

一般方法

??一般方法即為同步方法,主要使用requests+BeautifulSoup鸭你,按順序執(zhí)行屈张。完整的Python代碼如下:

import requests
from bs4 import BeautifulSoup
import time

# 開(kāi)始時(shí)間
t1 = time.time()
print('#' * 50)

url = "http://www.wikidata.org/w/index.php?title=Special:WhatLinksHere/Q5&limit=500&from=0"
# 請(qǐng)求頭部
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36'}
# 發(fā)送HTTP請(qǐng)求
req = requests.get(url, headers=headers)
# 解析網(wǎng)頁(yè)
soup = BeautifulSoup(req.text, "lxml")
# 找到name和Description所在的記錄
human_list = soup.find(id='mw-whatlinkshere-list')('li')

urls = []
# 獲取網(wǎng)址
for human in human_list:
    url = human.find('a')['href']
    urls.append('https://www.wikidata.org'+url)

# 獲取每個(gè)網(wǎng)頁(yè)的name和description
def parser(url):
    req = requests.get(url)
    # 利用BeautifulSoup將獲取到的文本解析成HTML
    soup = BeautifulSoup(req.text, "lxml")
    # 獲取name和description
    name = soup.find('span', class_="wikibase-title-label")
    desc = soup.find('span', class_="wikibase-descriptionview-text")
    if name is not None and desc is not None:
        print('%-40s,\t%s'%(name.text, desc.text))

for url in urls:
    parser(url)

t2 = time.time() # 結(jié)束時(shí)間
print('一般方法,總共耗時(shí):%s' % (t2 - t1))
print('#' * 50)

輸出的結(jié)果如下(省略中間的輸出袱巨,以......代替):

##################################################
George Washington                       ,   first President of the United States
Douglas Adams                           ,   British author and humorist (1952–2001)
......
Willoughby Newton                       ,   Politician from Virginia, USA
Mack Wilberg                            ,   American conductor
一般方法阁谆,總共耗時(shí):724.9654655456543
##################################################

使用同步方法,總耗時(shí)約725秒愉老,即12分鐘多场绿。
??一般方法雖然思路簡(jiǎn)單,容易實(shí)現(xiàn)俺夕,但效率不高裳凸,耗時(shí)長(zhǎng)。那么劝贸,使用并發(fā)試試看姨谷。

并發(fā)方法

??并發(fā)方法使用多線(xiàn)程來(lái)加速一般方法,我們使用的并發(fā)模塊為concurrent.futures模塊映九,設(shè)置多線(xiàn)程的個(gè)數(shù)為20個(gè)(實(shí)際不一定能達(dá)到梦湘,視計(jì)算機(jī)而定)。完整的Python代碼如下:

import requests
from bs4 import BeautifulSoup
import time
from concurrent.futures import ThreadPoolExecutor, wait, ALL_COMPLETED

# 開(kāi)始時(shí)間
t1 = time.time()
print('#' * 50)

url = "http://www.wikidata.org/w/index.php?title=Special:WhatLinksHere/Q5&limit=500&from=0"
# 請(qǐng)求頭部
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36'}
# 發(fā)送HTTP請(qǐng)求
req = requests.get(url, headers=headers)
# 解析網(wǎng)頁(yè)
soup = BeautifulSoup(req.text, "lxml")
# 找到name和Description所在的記錄
human_list = soup.find(id='mw-whatlinkshere-list')('li')

urls = []
# 獲取網(wǎng)址
for human in human_list:
    url = human.find('a')['href']
    urls.append('https://www.wikidata.org'+url)

# 獲取每個(gè)網(wǎng)頁(yè)的name和description
def parser(url):
    req = requests.get(url)
    # 利用BeautifulSoup將獲取到的文本解析成HTML
    soup = BeautifulSoup(req.text, "lxml")
    # 獲取name和description
    name = soup.find('span', class_="wikibase-title-label")
    desc = soup.find('span', class_="wikibase-descriptionview-text")
    if name is not None and desc is not None:
        print('%-40s,\t%s'%(name.text, desc.text))

# 利用并發(fā)加速爬取
executor = ThreadPoolExecutor(max_workers=20)
# submit()的參數(shù): 第一個(gè)為函數(shù), 之后為該函數(shù)的傳入?yún)?shù)捌议,允許有多個(gè)
future_tasks = [executor.submit(parser, url) for url in urls]
# 等待所有的線(xiàn)程完成哼拔,才進(jìn)入后續(xù)的執(zhí)行
wait(future_tasks, return_when=ALL_COMPLETED)

t2 = time.time() # 結(jié)束時(shí)間
print('并發(fā)方法,總共耗時(shí):%s' % (t2 - t1))
print('#' * 50)

輸出的結(jié)果如下(省略中間的輸出瓣颅,以......代替):

##################################################
Larry Sanger                            ,   American former professor, co-founder of Wikipedia, founder of Citizendium and other projects
Ken Jennings                            ,   American game show contestant and writer
......
Antoine de Saint-Exupery                ,   French writer and aviator
Michael Jackson                         ,   American singer, songwriter and dancer
并發(fā)方法倦逐,總共耗時(shí):226.7499692440033
##################################################

使用多線(xiàn)程并發(fā)后的爬蟲(chóng)執(zhí)行時(shí)間約為227秒,大概是一般方法的三分之一的時(shí)間宫补,速度有了明顯的提升懊世选!多線(xiàn)程在速度上有明顯提升粉怕,但執(zhí)行的網(wǎng)頁(yè)順序是無(wú)序的健民,在線(xiàn)程的切換上開(kāi)銷(xiāo)也比較大,線(xiàn)程越多贫贝,開(kāi)銷(xiāo)越大秉犹。
??關(guān)于多線(xiàn)程與一般方法在速度上的比較,可以參考文章:Python爬蟲(chóng)之多線(xiàn)程下載豆瓣Top250電影圖片稚晚。

異步方法

??異步方法在爬蟲(chóng)中是有效的速度提升手段崇堵,使用aiohttp可以異步地處理HTTP請(qǐng)求,使用asyncio可以實(shí)現(xiàn)異步IO蜈彼,需要注意的是筑辨,aiohttp只支持3.5.3以后的Python版本。使用異步方法實(shí)現(xiàn)該爬蟲(chóng)的完整Python代碼如下:

import requests
from bs4 import BeautifulSoup
import time
import aiohttp
import asyncio

# 開(kāi)始時(shí)間
t1 = time.time()
print('#' * 50)

url = "http://www.wikidata.org/w/index.php?title=Special:WhatLinksHere/Q5&limit=500&from=0"
# 請(qǐng)求頭部
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36'}
# 發(fā)送HTTP請(qǐng)求
req = requests.get(url, headers=headers)
# 解析網(wǎng)頁(yè)
soup = BeautifulSoup(req.text, "lxml")
# 找到name和Description所在的記錄
human_list = soup.find(id='mw-whatlinkshere-list')('li')

urls = []
# 獲取網(wǎng)址
for human in human_list:
    url = human.find('a')['href']
    urls.append('https://www.wikidata.org'+url)

# 異步HTTP請(qǐng)求
async def fetch(session, url):
    async with session.get(url) as response:
        return await response.text()
        
# 解析網(wǎng)頁(yè)
async def parser(html):
    # 利用BeautifulSoup將獲取到的文本解析成HTML
    soup = BeautifulSoup(html, "lxml")
    # 獲取name和description
    name = soup.find('span', class_="wikibase-title-label")
    desc = soup.find('span', class_="wikibase-descriptionview-text")
    if name is not None and desc is not None:
        print('%-40s,\t%s'%(name.text, desc.text))

# 處理網(wǎng)頁(yè)幸逆,獲取name和description
async def download(url):
    async with aiohttp.ClientSession() as session:
        try:
            html = await fetch(session, url)
            await parser(html)
        except Exception as err:
            print(err)

# 利用asyncio模塊進(jìn)行異步IO處理
loop = asyncio.get_event_loop()
tasks = [asyncio.ensure_future(download(url)) for url in urls]
tasks = asyncio.gather(*tasks)
loop.run_until_complete(tasks)

t2 = time.time() # 結(jié)束時(shí)間
print('使用異步,總共耗時(shí):%s' % (t2 - t1))
print('#' * 50)

輸出結(jié)果如下(省略中間的輸出暮现,以......代替):

##################################################
Frédéric Tadde?                         ,   French journalist and TV host
Gabriel Gonzáles Videla                 ,   Chilean politician
......
Denmark                                 ,   sovereign state and Scandinavian country in northern Europe
Usain Bolt                              ,   Jamaican sprinter and soccer player
使用異步还绘,總共耗時(shí):126.9002583026886
##################################################

顯然,異步方法使用了異步和并發(fā)兩種提速方法栖袋,自然在速度有明顯提升拍顷,大約為一般方法的六分之一。異步方法雖然效率高塘幅,但需要掌握異步編程昔案,這需要學(xué)習(xí)一段時(shí)間。
??關(guān)于異步方法與一般方法在速度上的比較电媳,可以參考文章:利用aiohttp實(shí)現(xiàn)異步爬蟲(chóng)踏揣。
??如果有人覺(jué)得127秒的爬蟲(chóng)速度還是慢,可以嘗試一下異步代碼(與之前的異步代碼的區(qū)別在于:僅僅使用了正則表達(dá)式代替BeautifulSoup來(lái)解析網(wǎng)頁(yè)匾乓,以提取網(wǎng)頁(yè)中的內(nèi)容):

import requests
from bs4 import BeautifulSoup
import time
import aiohttp
import asyncio
import re

# 開(kāi)始時(shí)間
t1 = time.time()
print('#' * 50)

url = "http://www.wikidata.org/w/index.php?title=Special:WhatLinksHere/Q5&limit=500&from=0"
# 請(qǐng)求頭部
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36'}
# 發(fā)送HTTP請(qǐng)求
req = requests.get(url, headers=headers)
# 解析網(wǎng)頁(yè)
soup = BeautifulSoup(req.text, "lxml")
# 找到name和Description所在的記錄
human_list = soup.find(id='mw-whatlinkshere-list')('li')

urls = []
# 獲取網(wǎng)址
for human in human_list:
    url = human.find('a')['href']
    urls.append('https://www.wikidata.org' + url)

# 異步HTTP請(qǐng)求
async def fetch(session, url):
    async with session.get(url) as response:
        return await response.text()

# 解析網(wǎng)頁(yè)
async def parser(html):
    # 利用正則表達(dá)式解析網(wǎng)頁(yè)
    try:
        name = re.findall(r'<span class="wikibase-title-label">(.+?)</span>', html)[0]
        desc = re.findall(r'<span class="wikibase-descriptionview-text">(.+?)</span>', html)[0]
        print('%-40s,\t%s' % (name, desc))
    except Exception as err:
        pass

# 處理網(wǎng)頁(yè)捞稿,獲取name和description
async def download(url):
    async with aiohttp.ClientSession() as session:
        try:
            html = await fetch(session, url)
            await parser(html)
        except Exception as err:
            print(err)

# 利用asyncio模塊進(jìn)行異步IO處理
loop = asyncio.get_event_loop()
tasks = [asyncio.ensure_future(download(url)) for url in urls]
tasks = asyncio.gather(*tasks)
loop.run_until_complete(tasks)

t2 = time.time()  # 結(jié)束時(shí)間
print('使用異步(正則表達(dá)式),總共耗時(shí):%s' % (t2 - t1))
print('#' * 50)

輸出的結(jié)果如下(省略中間的輸出,以......代替):

##################################################
Dejen Gebremeskel                       ,   Ethiopian long-distance runner
Erik Kynard                             ,   American high jumper
......
Buzz Aldrin                             ,   American astronaut
Egon Krenz                              ,   former General Secretary of the Socialist Unity Party of East Germany
使用異步(正則表達(dá)式)娱局,總共耗時(shí):16.521944999694824
##################################################

16.5秒彰亥,僅僅為一般方法的43分之一,速度如此之快衰齐,令人咋舌(感謝某人提供的嘗試)任斋。筆者雖然自己實(shí)現(xiàn)了異步方法,但用的是BeautifulSoup來(lái)解析網(wǎng)頁(yè)耻涛,耗時(shí)127秒废酷,沒(méi)想到使用正則表達(dá)式就取得了如此驚人的效果∪冢可見(jiàn)锦积,BeautifulSoup解析網(wǎng)頁(yè)雖然快,但在異步方法中歉嗓,還是限制了速度丰介。但這種方法的缺點(diǎn)為,當(dāng)你需要爬取的內(nèi)容比較復(fù)雜時(shí)鉴分,一般的正則表達(dá)式就難以勝任了哮幢,需要另想辦法。

爬蟲(chóng)框架Scrapy

??最后志珍,我們使用著名的Python爬蟲(chóng)框架Scrapy來(lái)解決這個(gè)爬蟲(chóng)橙垢。我們創(chuàng)建的爬蟲(chóng)項(xiàng)目為wikiDataScrapy,項(xiàng)目結(jié)構(gòu)如下:

wikiDataScrapy項(xiàng)目

在settings.py中設(shè)置“ROBOTSTXT_OBEY = False”. 修改items.py伦糯,代碼如下:

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

import scrapy

class WikidatascrapyItem(scrapy.Item):
    # define the fields for your item here like:
    name = scrapy.Field()
    desc = scrapy.Field()

然后柜某,在spiders文件夾下新建wikiSpider.py,代碼如下:

import scrapy.cmdline
from wikiDataScrapy.items import WikidatascrapyItem
import requests
from bs4 import BeautifulSoup

# 獲取請(qǐng)求的500個(gè)網(wǎng)址敛纲,用requests+BeautifulSoup搞定
def get_urls():
    url = "http://www.wikidata.org/w/index.php?title=Special:WhatLinksHere/Q5&limit=500&from=0"
    # 請(qǐng)求頭部
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36'}
    # 發(fā)送HTTP請(qǐng)求
    req = requests.get(url, headers=headers)
    # 解析網(wǎng)頁(yè)
    soup = BeautifulSoup(req.text, "lxml")
    # 找到name和Description所在的記錄
    human_list = soup.find(id='mw-whatlinkshere-list')('li')

    urls = []
    # 獲取網(wǎng)址
    for human in human_list:
        url = human.find('a')['href']
        urls.append('https://www.wikidata.org' + url)

    # print(urls)
    return urls

# 使用scrapy框架爬取
class bookSpider(scrapy.Spider):
    name = 'wikiScrapy'  # 爬蟲(chóng)名稱(chēng)
    start_urls = get_urls()  # 需要爬取的500個(gè)網(wǎng)址

    def parse(self, response):
        item = WikidatascrapyItem()
        # name and description
        item['name'] = response.css('span.wikibase-title-label').xpath('text()').extract_first()
        item['desc'] = response.css('span.wikibase-descriptionview-text').xpath('text()').extract_first()

        yield item

# 執(zhí)行該爬蟲(chóng)喂击,并轉(zhuǎn)化為csv文件
scrapy.cmdline.execute(['scrapy', 'crawl', 'wikiScrapy', '-o', 'wiki.csv', '-t', 'csv'])

輸出結(jié)果如下(只包含最后的Scrapy信息總結(jié)部分):

{'downloader/request_bytes': 166187,
 'downloader/request_count': 500,
 'downloader/request_method_count/GET': 500,
 'downloader/response_bytes': 18988798,
 'downloader/response_count': 500,
 'downloader/response_status_count/200': 500,
 'finish_reason': 'finished',
 'finish_time': datetime.datetime(2018, 10, 16, 9, 49, 15, 761487),
 'item_scraped_count': 500,
 'log_count/DEBUG': 1001,
 'log_count/INFO': 8,
 'response_received_count': 500,
 'scheduler/dequeued': 500,
 'scheduler/dequeued/memory': 500,
 'scheduler/enqueued': 500,
 'scheduler/enqueued/memory': 500,
 'start_time': datetime.datetime(2018, 10, 16, 9, 48, 44, 58673)}

可以看到,已成功爬取500個(gè)網(wǎng)頁(yè)淤翔,耗時(shí)31秒翰绊,速度也相當(dāng)OK。再來(lái)看一下生成的wiki.csv文件旁壮,它包含了所有的輸出的name和description监嗜,如下圖:

輸出的CSV文件(部分)

可以看到,輸出的CSV文件的列并不是有序的抡谐。至于如何解決Scrapy輸出的CSV文件有換行的問(wèn)題裁奇,請(qǐng)參考stackoverflow上的回答:https://stackoverflow.com/questions/39477662/scrapy-csv-file-has-uniform-empty-rows/43394566#43394566

??Scrapy來(lái)制作爬蟲(chóng)的優(yōu)勢(shì)在于它是一個(gè)成熟的爬蟲(chóng)框架童叠,支持異步框喳,并發(fā)课幕,容錯(cuò)性較好(比如本代碼中就沒(méi)有處理找不到name和description的情形),但如果需要頻繁地修改中間件五垮,則還是自己寫(xiě)個(gè)爬蟲(chóng)比較好乍惊,而且它在速度上沒(méi)有超過(guò)我們自己寫(xiě)的異步爬蟲(chóng),至于能自動(dòng)導(dǎo)出CSV文件這個(gè)功能放仗,還是相當(dāng)實(shí)在的润绎。

總結(jié)

??本文內(nèi)容較多,比較了4種爬蟲(chóng)方法诞挨,每種方法都有自己的利弊莉撇,已在之前的陳述中給出,當(dāng)然惶傻,在實(shí)際的問(wèn)題中棍郎,并不是用的工具或方法越高級(jí)就越好,具體問(wèn)題具體分析嘛~
??本文到此結(jié)束银室,感謝閱讀哦~

注意:本人現(xiàn)已開(kāi)通微信公眾號(hào): Python爬蟲(chóng)與算法(微信號(hào)為:easy_web_scrape)涂佃, 歡迎大家關(guān)注哦~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蜈敢,隨后出現(xiàn)的幾起案子辜荠,更是在濱河造成了極大的恐慌,老刑警劉巖抓狭,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伯病,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡否过,警方通過(guò)查閱死者的電腦和手機(jī)午笛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)苗桂,“玉大人季研,你說(shuō)我怎么就攤上這事∮欤” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵惹谐,是天一觀(guān)的道長(zhǎng)持偏。 經(jīng)常有香客問(wèn)我,道長(zhǎng)氨肌,這世上最難降的妖魔是什么鸿秆? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮怎囚,結(jié)果婚禮上卿叽,老公的妹妹穿的比我還像新娘桥胞。我一直安慰自己,他們只是感情好考婴,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布贩虾。 她就那樣靜靜地躺著,像睡著了一般沥阱。 火紅的嫁衣襯著肌膚如雪缎罢。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,692評(píng)論 1 305
  • 那天考杉,我揣著相機(jī)與錄音策精,去河邊找鬼。 笑死崇棠,一個(gè)胖子當(dāng)著我的面吹牛咽袜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播枕稀,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼询刹,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了抽莱?” 一聲冷哼從身側(cè)響起范抓,我...
    開(kāi)封第一講書(shū)人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎食铐,沒(méi)想到半個(gè)月后匕垫,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡虐呻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年象泵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片斟叼。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡偶惠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出朗涩,到底是詐尸還是另有隱情忽孽,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布谢床,位于F島的核電站兄一,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏识腿。R本人自食惡果不足惜出革,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望渡讼。 院中可真熱鬧骂束,春花似錦耳璧、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至析藕,卻和暖如春召廷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背账胧。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工竞慢, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人治泥。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓筹煮,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親居夹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子败潦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

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

  • 爬蟲(chóng)文章 in 簡(jiǎn)書(shū)程序員專(zhuān)題: like:128-Python 爬取落網(wǎng)音樂(lè) like:127-【圖文詳解】py...
    喜歡吃栗子閱讀 21,757評(píng)論 4 411
  • 爬蟲(chóng)文章 in 簡(jiǎn)書(shū)程序員專(zhuān)題: like:128 - Python 爬取落網(wǎng)音樂(lè) like:127 - 【圖文詳...
    treelake閱讀 29,554評(píng)論 33 638
  • 首先,開(kāi)始了自我介紹准脂。 想象一種顏色劫扒,來(lái)表達(dá)自己當(dāng)下的心情。 好特別的方式狸膏!我感覺(jué)到什么顏色呢沟饥?心情好復(fù)雜…… 到...
    384b82bbc76b閱讀 200評(píng)論 0 0
  • 2017/11/29日 陰 今天早上我剛起床,正準(zhǔn)備做飯湾戳,兒子就醒了贤旷,我說(shuō)你怎么起那么早,兒子說(shuō)做了一個(gè)夢(mèng)砾脑,夢(mèng)見(jiàn)遲...
    石榴_cfbb閱讀 218評(píng)論 0 0
  • 開(kāi)始的開(kāi)始 踽踽獨(dú)行中時(shí)光太瘦 煢煢孑立里偶然相遇 其次的其次 適逢其會(huì)中猝不及防 無(wú)法言語(yǔ)里指縫太寬 然后的然后...
    潩水瀠洄閱讀 159評(píng)論 2 4