爬蟲(爬蟲原理和數(shù)據(jù)抓绕;帧)

通用爬蟲和聚焦爬蟲

根據(jù)使用場景笨蚁,網(wǎng)絡(luò)爬蟲可分為 通用爬蟲 和 聚焦爬蟲 兩種.

通用爬蟲

通用網(wǎng)絡(luò)爬蟲 是 捜索引擎抓取系統(tǒng)(Baidu睹晒、Google、Yahoo等)的重要組成部分括细。主要目的是將互聯(lián)網(wǎng)上的網(wǎng)頁下載到本地伪很,形成一個互聯(lián)網(wǎng)內(nèi)容的鏡像備份。

通用搜索引擎(Search Engine)工作原理

通用網(wǎng)絡(luò)爬蟲 從互聯(lián)網(wǎng)中搜集網(wǎng)頁勒极,采集信息是掰,這些網(wǎng)頁信息用于為搜索引擎建立索引從而提供支持,它決定著整個引擎系統(tǒng)的內(nèi)容是否豐富辱匿,信息是否即時,因此其性能的優(yōu)劣直接影響著搜索引擎的效果炫彩。

第一步:抓取網(wǎng)頁

搜索引擎網(wǎng)絡(luò)爬蟲的基本工作流程如下:

  1. 首先選取一部分的種子URL匾七,將這些URL放入待抓取URL隊列;

  2. 取出待抓取URL江兢,解析DNS得到主機的IP昨忆,并將URL對應(yīng)的網(wǎng)頁下載下來,存儲進已下載網(wǎng)頁庫中杉允,并且將這些URL放進已抓取URL隊列邑贴。

  3. 分析已抓取URL隊列中的URL席里,分析其中的其他URL,并且將URL放入待抓取URL隊列拢驾,從而進入下一個循環(huán)....

[圖片上傳失敗...(image-7a4383-1599745420885)]

image
搜索引擎如何獲取一個新網(wǎng)站的URL:
1. 新網(wǎng)站向搜索引擎主動提交網(wǎng)址:(如百度http://zhanzhang.baidu.com/linksubmit/url
2. 在其他網(wǎng)站上設(shè)置新網(wǎng)站外鏈(盡可能處于搜索引擎爬蟲爬取范圍)
3. 搜索引擎和DNS解析服務(wù)商(如DNSPod等)合作奖磁,新網(wǎng)站域名將被迅速抓取。

但是搜索引擎蜘蛛的爬行是被輸入了一定的規(guī)則的繁疤,它需要遵從一些命令或文件的內(nèi)容咖为,如標(biāo)注為nofollow的鏈接,或者是Robots協(xié)議稠腊。

Robots協(xié)議(也叫爬蟲協(xié)議躁染、機器人協(xié)議等),全稱是“網(wǎng)絡(luò)爬蟲排除標(biāo)準(zhǔn)”(Robots Exclusion Protocol)架忌,網(wǎng)站通過Robots協(xié)議告訴搜索引擎哪些頁面可以抓取吞彤,哪些頁面不能抓取,例如:

淘寶網(wǎng):https://www.taobao.com/robots.txt

騰訊網(wǎng): http://www.qq.com/robots.txt

第二步:數(shù)據(jù)存儲

搜索引擎通過爬蟲爬取到的網(wǎng)頁叹放,將數(shù)據(jù)存入原始頁面數(shù)據(jù)庫饰恕。其中的頁面數(shù)據(jù)與用戶瀏覽器得到的HTML是完全一樣的。

搜索引擎蜘蛛在抓取頁面時许昨,也做一定的重復(fù)內(nèi)容檢測懂盐,一旦遇到訪問權(quán)重很低的網(wǎng)站上有大量抄襲另凌、采集或者復(fù)制的內(nèi)容庆揪,很可能就不再爬行。

第三步:預(yù)處理

搜索引擎將爬蟲抓取回來的頁面赊级,進行各種步驟的預(yù)處理速那。

  • 提取文字
  • 中文分詞
  • 消除噪音(比如版權(quán)聲明文字俐银、導(dǎo)航條、廣告等……)
  • 索引處理
  • 鏈接關(guān)系計算
  • 特殊文件處理
  • ....

除了HTML文件外端仰,搜索引擎通常還能抓取和索引以文字為基礎(chǔ)的多種文件類型捶惜,如 PDF、Word荔烧、WPS吱七、XLS、PPT鹤竭、TXT 文件等踊餐。我們在搜索結(jié)果中也經(jīng)常會看到這些文件類型。

但搜索引擎還不能處理圖片臀稚、視頻吝岭、Flash 這類非文字內(nèi)容,也不能執(zhí)行腳本和程序。

第四步:提供檢索服務(wù)窜管,網(wǎng)站排名

搜索引擎在對信息進行組織和處理后散劫,為用戶提供關(guān)鍵字檢索服務(wù),將用戶檢索相關(guān)的信息展示給用戶幕帆。

同時會根據(jù)頁面的PageRank值(鏈接的訪問量排名)來進行網(wǎng)站排名获搏,這樣Rank值高的網(wǎng)站在搜索結(jié)果中會排名較前,當(dāng)然也可以直接使用 Money 購買搜索引擎網(wǎng)站排名蜓肆,簡單粗暴颜凯。

[圖片上傳失敗...(image-41a646-1599745420884)]

image

但是,這些通用性搜索引擎也存在著一定的局限性:

  1. 通用搜索引擎所返回的結(jié)果都是網(wǎng)頁仗扬,而大多情況下症概,網(wǎng)頁里90%的內(nèi)容對用戶來說都是無用的。

  2. 不同領(lǐng)域早芭、不同背景的用戶往往具有不同的檢索目的和需求彼城,搜索引擎無法提供針對具體某個用戶的搜索結(jié)果。

  3. 萬維網(wǎng)數(shù)據(jù)形式的豐富和網(wǎng)絡(luò)技術(shù)的不斷發(fā)展退个,圖片募壕、數(shù)據(jù)庫、音頻语盈、視頻多媒體等不同數(shù)據(jù)大量出現(xiàn)舱馅,通用搜索引擎對這些文件無能為力,不能很好地發(fā)現(xiàn)和獲取刀荒。

  4. 通用搜索引擎大多提供基于關(guān)鍵字的檢索代嗤,難以支持根據(jù)語義信息提出的查詢,無法準(zhǔn)確理解用戶的具體需求缠借。

針對這些情況干毅,聚焦爬蟲技術(shù)得以廣泛使用。

聚焦爬蟲

聚焦爬蟲泼返,是"面向特定主題需求"的一種網(wǎng)絡(luò)爬蟲程序硝逢,它與通用搜索引擎爬蟲的區(qū)別在于: 聚焦爬蟲在實施網(wǎng)頁抓取時會對內(nèi)容進行處理篩選,盡量保證只抓取與需求相關(guān)的網(wǎng)頁信息绅喉。

而我們今后要學(xué)習(xí)的渠鸽,就是聚焦爬蟲。

HTTP和HTTPS

HTTP協(xié)議(HyperText Transfer Protocol柴罐,超文本傳輸協(xié)議):是一種發(fā)布和接收 HTML頁面的方法拱绑。

HTTPS(Hypertext Transfer Protocol over Secure Socket Layer)簡單講是HTTP的安全版,在HTTP下加入SSL層丽蝎。

SSL(Secure Sockets Layer 安全套接層)主要用于Web的安全傳輸協(xié)議,在傳輸層對網(wǎng)絡(luò)連接進行加密,保障在Internet上數(shù)據(jù)傳輸?shù)陌踩?/p>

  • HTTP的端口號為80屠阻,
  • HTTPS的端口號為443

HTTP工作原理

網(wǎng)絡(luò)爬蟲抓取過程可以理解為模擬瀏覽器操作的過程红省。

瀏覽器的主要功能是向服務(wù)器發(fā)出請求,在瀏覽器窗口中展示您選擇的網(wǎng)絡(luò)資源国觉,HTTP是一套計算機通過網(wǎng)絡(luò)進行通信的規(guī)則吧恃。

HTTP的請求與響應(yīng)

HTTP通信由兩部分組成: 客戶端請求消息 與 服務(wù)器響應(yīng)消息

image

[圖片上傳失敗...(image-bc7496-1599745459627)]

瀏覽器發(fā)送HTTP請求的過程:

  1. 當(dāng)用戶在瀏覽器的地址欄中輸入一個URL并按回車鍵之后,瀏覽器會向HTTP服務(wù)器發(fā)送HTTP請求麻诀。HTTP請求主要分為“Get”和“Post”兩種方法痕寓。

  2. 當(dāng)我們在瀏覽器輸入URL http://www.baidu.com 的時候,瀏覽器發(fā)送一個Request請求去獲取 http://www.baidu.com 的html文件蝇闭,服務(wù)器把Response文件對象發(fā)送回給瀏覽器呻率。

  3. 瀏覽器分析Response中的 HTML,發(fā)現(xiàn)其中引用了很多其他文件呻引,比如Images文件礼仗,CSS文件,JS文件逻悠。 瀏覽器會自動再次發(fā)送Request去獲取圖片元践,CSS文件,或者JS文件童谒。

  4. 當(dāng)所有的文件都下載成功后单旁,網(wǎng)頁會根據(jù)HTML語法結(jié)構(gòu),完整的顯示出來了饥伊。

URL(Uniform / Universal Resource Locator的縮寫):統(tǒng)一資源定位符象浑,是用于完整地描述Internet上網(wǎng)頁和其他資源的地址的一種標(biāo)識方法。

image

[圖片上傳失敗...(image-38fa96-1599745459627)]

基本格式:scheme://host[:port#]/path/…/[?query-string][#anchor]

  • scheme:協(xié)議(例如:http, https, ftp)
  • host:服務(wù)器的IP地址或者域名
  • port#:服務(wù)器的端口(如果是走協(xié)議默認端口撵渡,缺省端口80)
  • path:訪問資源的路徑
  • query-string:參數(shù)融柬,發(fā)送給http服務(wù)器的數(shù)據(jù)
  • anchor:錨(跳轉(zhuǎn)到網(wǎng)頁的指定錨點位置)

例如:

客戶端HTTP請求

URL只是標(biāo)識資源的位置,而HTTP是用來提交和獲取資源趋距×Q酰客戶端發(fā)送一個HTTP請求到服務(wù)器的請求消息,包括以下格式:

請求行节腐、請求頭部外盯、空行請求數(shù)據(jù)

四個部分組成翼雀,下圖給出了請求報文的一般格式饱苟。

image

[圖片上傳失敗...(image-cf840f-1599745459626)]

一個典型的HTTP請求示例
GET https://www.baidu.com/ HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Referer: http://www.baidu.com/
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6
Cookie: BAIDUID=04E4001F34EA74AD4601512DD3C41A7B:FG=1; BIDUPSID=04E4001F34EA74AD4601512DD3C41A7B; PSTM=1470329258; MCITY=-343%3A340%3A; BDUSS=nF0MVFiMTVLcUh-Q2MxQ0M3STZGQUZ4N2hBa1FFRkIzUDI3QlBCZjg5cFdOd1pZQVFBQUFBJCQAAAAAAAAAAAEAAADpLvgG0KGyvLrcyfrG-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFaq3ldWqt5XN; H_PS_PSSID=1447_18240_21105_21386_21454_21409_21554; BD_UPN=12314753; sug=3; sugstore=0; ORIGIN=0; bdime=0; H_PS_645EC=7e2ad3QHl181NSPbFbd7PRUCE1LlufzxrcFmwYin0E6b%2BW8bbTMKHZbDP0g; BDSVRTM=0

請求方法

GET https://www.baidu.com/ HTTP/1.1

根據(jù)HTTP標(biāo)準(zhǔn),HTTP請求可以使用多種請求方法狼渊。

HTTP 0.9:只有基本的文本 GET 功能箱熬。

HTTP 1.0:完善的請求/響應(yīng)模型类垦,并將協(xié)議補充完整,定義了三種請求方法: GET, POST 和 HEAD方法城须。

HTTP 1.1:在 1.0 基礎(chǔ)上進行更新蚤认,新增了五種請求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

HTTP 2.0(未普及):請求/響應(yīng)首部的定義基本沒有改變糕伐,只是所有首部鍵必須全部小寫砰琢,而且請求行要獨立為 :method、:scheme良瞧、:host陪汽、:path這些鍵值對。

序號 方法 描述
1 GET 請求指定的頁面信息褥蚯,并返回實體主體挚冤。
2 HEAD 類似于get請求,只不過返回的響應(yīng)中沒有具體的內(nèi)容遵岩,用于獲取報頭
3 POST 向指定資源提交數(shù)據(jù)進行處理請求(例如提交表單或者上傳文件)你辣,數(shù)據(jù)被包含在請求體中。POST請求可能會導(dǎo)致新的資源的建立和/或已有資源的修改尘执。
4 PUT 從客戶端向服務(wù)器傳送的數(shù)據(jù)取代指定的文檔的內(nèi)容舍哄。
5 DELETE 請求服務(wù)器刪除指定的頁面。
6 CONNECT HTTP/1.1協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器誊锭。
7 OPTIONS 允許客戶端查看服務(wù)器的性能表悬。
8 TRACE 回顯服務(wù)器收到的請求,主要用于測試或診斷丧靡。

HTTP請求主要分為GetPost兩種方法

  • GET是從服務(wù)器上獲取數(shù)據(jù)蟆沫,POST是向服務(wù)器傳送數(shù)據(jù)

  • GET請求參數(shù)顯示,都顯示在瀏覽器網(wǎng)址上温治,HTTP服務(wù)器根據(jù)該請求所包含URL中的參數(shù)來產(chǎn)生響應(yīng)內(nèi)容饭庞,即“Get”請求的參數(shù)是URL的一部分。 例如: http://www.baidu.com/s?wd=Chinese

  • POST請求參數(shù)在請求體當(dāng)中熬荆,消息長度沒有限制而且以隱式的方式進行發(fā)送舟山,通常用來向HTTP服務(wù)器提交量比較大的數(shù)據(jù)(比如請求中包含許多參數(shù)或者文件上傳操作等),請求的參數(shù)包含在“Content-Type”消息頭里卤恳,指明該消息體的媒體類型和編碼累盗,

注意:避免使用Get方式提交表單,因為有可能會導(dǎo)致安全問題突琳。 比如說在登陸表單中用Get方式若债,用戶輸入的用戶名和密碼將在地址欄中暴露無遺。

常用的請求報頭

1. Host (主機和端口號)

Host:對應(yīng)網(wǎng)址URL中的Web名稱和端口號拆融,用于指定被請求資源的Internet主機和端口號蠢琳,通常屬于URL的一部分啊终。

2. Connection (鏈接類型)

Connection:表示客戶端與服務(wù)連接類型

  1. Client 發(fā)起一個包含 Connection:keep-alive 的請求,HTTP/1.1使用 keep-alive 為默認值挪凑。

  2. Server收到請求后:

    • 如果 Server 支持 keep-alive孕索,回復(fù)一個包含 Connection:keep-alive 的響應(yīng),不關(guān)閉連接躏碳;
    • 如果 Server 不支持 keep-alive,回復(fù)一個包含 Connection:close 的響應(yīng)散怖,關(guān)閉連接菇绵。
  3. 如果client收到包含 Connection:keep-alive 的響應(yīng),向同一個連接發(fā)送下一個請求镇眷,直到一方主動關(guān)閉連接咬最。

keep-alive在很多情況下能夠重用連接,減少資源消耗欠动,縮短響應(yīng)時間永乌,比如當(dāng)瀏覽器需要多個文件時(比如一個HTML文件和相關(guān)的圖形文件),不需要每次都去請求建立連接具伍。

3. Upgrade-Insecure-Requests (升級為HTTPS請求)

Upgrade-Insecure-Requests:升級不安全的請求翅雏,意思是會在加載 http 資源時自動替換成 https 請求,讓瀏覽器不再顯示https頁面中的http請求警報人芽。

HTTPS 是以安全為目標(biāo)的 HTTP 通道望几,所以在 HTTPS 承載的頁面上不允許出現(xiàn) HTTP 請求,一旦出現(xiàn)就是提示或報錯萤厅。

4. User-Agent (瀏覽器名稱)

User-Agent:是客戶瀏覽器的名稱橄抹,以后會詳細講。

5. Accept (傳輸文件類型)

Accept:指瀏覽器或其他客戶端可以接受的MIME(Multipurpose Internet Mail Extensions(多用途互聯(lián)網(wǎng)郵件擴展))文件類型惕味,服務(wù)器可以根據(jù)它判斷并返回適當(dāng)?shù)奈募袷健?/p>

舉例:

Accept: */*:表示什么都可以接收楼誓。

Accept:image/gif:表明客戶端希望接受GIF圖像格式的資源;

Accept:text/html:表明客戶端希望接受html文本名挥。

Accept: text/html, application/xhtml+xml;q=0.9, image/*;q=0.8:表示瀏覽器支持的 MIME 類型分別是 html文本疟羹、xhtml和xml文檔、所有的圖像格式資源躺同。

q是權(quán)重系數(shù)阁猜,范圍 0 =< q <= 1,q 值越大蹋艺,請求越傾向于獲得其“;”之前的類型表示的內(nèi)容剃袍。若沒有指定q值,則默認為1捎谨,按從左到右排序順序民效;若被賦值為0憔维,則用于表示瀏覽器不接受此內(nèi)容類型。

Text:用于標(biāo)準(zhǔn)化地表示的文本信息畏邢,文本消息可以是多種字符集和或者多種格式的业扒;Application:用于傳輸應(yīng)用程序數(shù)據(jù)或者二進制數(shù)據(jù)。詳細請點擊

6. Referer (頁面跳轉(zhuǎn)處)

Referer:表明產(chǎn)生請求的網(wǎng)頁來自于哪個URL舒萎,用戶是從該 Referer頁面訪問到當(dāng)前請求的頁面程储。這個屬性可以用來跟蹤Web請求來自哪個頁面,是從什么網(wǎng)站來的等臂寝。

有時候遇到下載某網(wǎng)站圖片章鲤,需要對應(yīng)的referer,否則無法下載圖片咆贬,那是因為人家做了防盜鏈败徊,原理就是根據(jù)referer去判斷是否是本網(wǎng)站的地址,如果不是掏缎,則拒絕皱蹦,如果是,就可以下載眷蜈;

7. Accept-Encoding(文件編解碼格式)

Accept-Encoding:指出瀏覽器可以接受的編碼方式沪哺。編碼方式不同于文件格式,它是為了壓縮文件并加速文件傳遞速度端蛆。瀏覽器在接收到Web響應(yīng)之后先解碼凤粗,然后再檢查文件格式,許多情形下這可以減少大量的下載時間今豆。

舉例:Accept-Encoding:gzip;q=1.0, identity; q=0.5, *;q=0

如果有多個Encoding同時匹配, 按照q值順序排列嫌拣,本例中按順序支持 gzip, identity壓縮編碼,支持gzip的瀏覽器會返回經(jīng)過gzip編碼的HTML頁面呆躲。 如果請求消息中沒有設(shè)置這個域服務(wù)器假定客戶端對各種內(nèi)容編碼都可以接受异逐。

8. Accept-Language(語言種類)

Accept-Langeuage:指出瀏覽器可以接受的語言種類,如en或en-us指英語插掂,zh或者zh-cn指中文灰瞻,當(dāng)服務(wù)器能夠提供一種以上的語言版本時要用到。

9. Accept-Charset(字符編碼)

Accept-Charset:指出瀏覽器可以接受的字符編碼辅甥。

舉例:Accept-Charset:iso-8859-1,gb2312,utf-8
  • ISO8859-1:通常叫做Latin-1酝润。Latin-1包括了書寫所有西方歐洲語言不可缺少的附加字符,英文瀏覽器的默認值是ISO-8859-1.
  • gb2312:標(biāo)準(zhǔn)簡體中文字符集;
  • utf-8:UNICODE 的一種變長字符編碼璃弄,可以解決多種語言文本顯示問題要销,從而實現(xiàn)應(yīng)用國際化和本地化。

如果在請求消息中沒有設(shè)置這個域夏块,缺省是任何字符集都可以接受疏咐。

10. Cookie (Cookie)

Cookie:瀏覽器用這個屬性向服務(wù)器發(fā)送Cookie纤掸。Cookie是在瀏覽器中寄存的小型數(shù)據(jù)體,它可以記載和服務(wù)器相關(guān)的用戶信息浑塞,也可以用來實現(xiàn)會話功能借跪,以后會詳細講。

11. Content-Type (POST數(shù)據(jù)類型)

Content-Type:POST請求里用來表示的內(nèi)容類型酌壕。

舉例:Content-Type = Text/XML; charset=gb2312:

指明該請求的消息體中包含的是純文本的XML類型的數(shù)據(jù)掏愁,字符編碼采用“gb2312”。

服務(wù)端HTTP響應(yīng)

HTTP響應(yīng)也由四個部分組成仅孩,分別是: 狀態(tài)行托猩、消息報頭空行辽慕、響應(yīng)正文

[圖片上傳失敗...(image-a8d073-1599745493447)]

HTTP/1.1 200 OK
Server: Tengine
Connection: keep-alive
Date: Wed, 30 Nov 2016 07:58:21 GMT
Cache-Control: no-cache
Content-Type: text/html;charset=UTF-8
Keep-Alive: timeout=20
Vary: Accept-Encoding
Pragma: no-cache
X-NWS-LOG-UUID: bd27210a-24e5-4740-8f6c-25dbafa9c395
Content-Length: 180945

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ....

常用的響應(yīng)報頭(了解)

理論上所有的響應(yīng)頭信息都應(yīng)該是回應(yīng)請求頭的。但是服務(wù)端為了效率赦肃,安全溅蛉,還有其他方面的考慮,會添加相對應(yīng)的響應(yīng)頭信息他宛,從上圖可以看到:

1. Cache-Control:must-revalidate, no-cache, private船侧。

這個值告訴客戶端,服務(wù)端不希望客戶端緩存資源厅各,在下次請求資源時镜撩,必須要從新請求服務(wù)器,不能從緩存副本中獲取資源队塘。

  • Cache-Control是響應(yīng)頭中很重要的信息袁梗,當(dāng)客戶端請求頭中包含Cache-Control:max-age=0請求,明確表示不會緩存服務(wù)器資源時,Cache-Control作為作為回應(yīng)信息憔古,通常會返回no-cache遮怜,意思就是說,"那就不緩存唄"鸿市。

  • 當(dāng)客戶端在請求頭中沒有包含Cache-Control時锯梁,服務(wù)端往往會定,不同的資源不同的緩存策略,比如說oschina在緩存圖片資源的策略就是Cache-Control:max-age=86400,這個意思是焰情,從當(dāng)前時間開始陌凳,在86400秒的時間內(nèi),客戶端可以直接從緩存副本中讀取資源内舟,而不需要向服務(wù)器請求合敦。

2. Connection:keep-alive

這個字段作為回應(yīng)客戶端的Connection:keep-alive,告訴客戶端服務(wù)器的tcp連接也是一個長連接谒获,客戶端可以繼續(xù)使用這個tcp連接發(fā)送http請求蛤肌。

3. Content-Encoding:gzip

告訴客戶端壁却,服務(wù)端發(fā)送的資源是采用gzip編碼的,客戶端看到這個信息后裸准,應(yīng)該采用gzip對資源進行解碼展东。

4. Content-Type:text/html;charset=UTF-8

告訴客戶端,資源文件的類型炒俱,還有字符編碼盐肃,客戶端通過utf-8對資源進行解碼,然后對資源進行html解析权悟。通常我們會看到有些網(wǎng)站是亂碼的砸王,往往就是服務(wù)器端沒有返回正確的編碼。

5. Date:Sun, 21 Sep 2016 06:18:21 GMT

這個是服務(wù)端發(fā)送資源時的服務(wù)器時間峦阁,GMT是格林尼治所在地的標(biāo)準(zhǔn)時間谦铃。http協(xié)議中發(fā)送的時間都是GMT的,這主要是解決在互聯(lián)網(wǎng)上榔昔,不同時區(qū)在相互請求資源的時候驹闰,時間混亂問題。

6. Expires:Sun, 1 Jan 2000 01:00:00 GMT

這個響應(yīng)頭也是跟緩存有關(guān)的撒会,告訴客戶端在這個時間前嘹朗,可以直接訪問緩存副本,很顯然這個值會存在問題诵肛,因為客戶端和服務(wù)器的時間不一定會都是相同的屹培,如果時間不同就會導(dǎo)致問題。所以這個響應(yīng)頭是沒有Cache-Control:max-age=*這個響應(yīng)頭準(zhǔn)確的怔檩,因為max-age=date中的date是個相對時間褪秀,不僅更好理解,也更準(zhǔn)確珠洗。

7. Pragma:no-cache

這個含義與Cache-Control等同溜歪。

8.Server:Tengine/1.4.6

這個是服務(wù)器和相對應(yīng)的版本,只是告訴客戶端服務(wù)器的信息许蓖。

9. Transfer-Encoding:chunked

這個響應(yīng)頭告訴客戶端蝴猪,服務(wù)器發(fā)送的資源的方式是分塊發(fā)送的。一般分塊發(fā)送的資源都是服務(wù)器動態(tài)生成的膊爪,在發(fā)送時還不知道發(fā)送資源的大小自阱,所以采用分塊發(fā)送,每一塊都是獨立的米酬,獨立的塊都能標(biāo)示自己的長度沛豌,最后一塊是0長度的,當(dāng)客戶端讀到這個0長度的塊時,就可以確定資源已經(jīng)傳輸完了加派。

10. Vary: Accept-Encoding

告訴緩存服務(wù)器叫确,緩存壓縮文件和非壓縮文件兩個版本,現(xiàn)在這個字段用處并不大芍锦,因為現(xiàn)在的瀏覽器都是支持壓縮的竹勉。

響應(yīng)狀態(tài)碼

響應(yīng)狀態(tài)代碼有三位數(shù)字組成,第一個數(shù)字定義了響應(yīng)的類別娄琉,且有五種可能取值次乓。

常見狀態(tài)碼:

  • 100~199:表示服務(wù)器成功接收部分請求,要求客戶端繼續(xù)提交其余請求才能完成整個處理過程孽水。

  • 200~299:表示服務(wù)器成功接收請求并已完成整個處理過程票腰。常用200(OK 請求成功)。

  • 300~399:為完成請求女气,客戶需進一步細化請求杏慰。例如:請求的資源已經(jīng)移動一個新地址、常用302(所請求的頁面已經(jīng)臨時轉(zhuǎn)移至新的url)炼鞠、307和304(使用緩存資源)逃默。

  • 400~499:客戶端的請求有錯誤,常用404(服務(wù)器無法找到被請求的頁面)簇搅、403(服務(wù)器拒絕訪問,權(quán)限不夠)软吐。

  • 500~599:服務(wù)器端出現(xiàn)錯誤瘩将,常用500(請求未完成。服務(wù)器遇到不可預(yù)知的情況)凹耙。

Cookie 和 Session:

服務(wù)器和客戶端的交互僅限于請求/響應(yīng)過程姿现,結(jié)束之后便斷開,在下一次請求時肖抱,服務(wù)器會認為新的客戶端备典。

為了維護他們之間的鏈接,讓服務(wù)器知道這是前一個用戶發(fā)送的請求意述,必須在一個地方保存客戶端的信息提佣。

Cookie:通過在 客戶端 記錄的信息確定用戶的身份。

Session:通過在 服務(wù)器端 記錄的信息確定用戶的身份荤崇。

Fiddler界面

設(shè)置好后拌屏,本機HTTP通信都會經(jīng)過127.0.0.1:8888代理,也就會被Fiddler攔截到术荤。

image

[圖片上傳失敗...(image-7cb0dd-1599745493447)]

請求 (Request) 部分詳解

  1. Headers —— 顯示客戶端發(fā)送到服務(wù)器的 HTTP 請求的 header倚喂,顯示為一個分級視圖,包含了 Web 客戶端信息瓣戚、Cookie端圈、傳輸狀態(tài)等焦读。
  2. Textview —— 顯示 POST 請求的 body 部分為文本。
  3. WebForms —— 顯示請求的 GET 參數(shù) 和 POST body 內(nèi)容舱权。
  4. HexView —— 用十六進制數(shù)據(jù)顯示請求矗晃。
  5. Auth —— 顯示響應(yīng) header 中的 Proxy-Authorization(代理身份驗證) 和 Authorization(授權(quán)) 信息.
  6. Raw —— 將整個請求顯示為純文本。
  7. JSON - 顯示JSON格式文件刑巧。
  8. XML —— 如果請求的 body 是 XML 格式喧兄,就是用分級的 XML 樹來顯示它。

響應(yīng) (Response) 部分詳解

  1. Transformer —— 顯示響應(yīng)的編碼信息啊楚。
  2. Headers —— 用分級視圖顯示響應(yīng)的 header吠冤。
  3. TextView —— 使用文本顯示相應(yīng)的 body。
  4. ImageVies —— 如果請求是圖片資源恭理,顯示響應(yīng)的圖片拯辙。
  5. HexView —— 用十六進制數(shù)據(jù)顯示響應(yīng)。
  6. WebView —— 響應(yīng)在 Web 瀏覽器中的預(yù)覽效果颜价。
  7. Auth —— 顯示響應(yīng) header 中的 Proxy-Authorization(代理身份驗證) 和 Authorization(授權(quán)) 信息涯保。
  8. Caching —— 顯示此請求的緩存信息。
  9. Privacy —— 顯示此請求的私密 (P3P) 信息周伦。
  10. Raw —— 將整個響應(yīng)顯示為純文本夕春。
  11. JSON - 顯示JSON格式文件。
  12. XML —— 如果響應(yīng)的 body 是 XML 格式及志,就是用分級的 XML 樹來顯示它 。

HTTP/HTTPS的GETPOST方法

urllib.parse.urlencode()

# IPython 中的測試結(jié)果
In [1]: import urllib.parse

In [2]: word = {"wd" : "傳智播客"}

# 通過urllib.parse.urlencode()方法倚搬,將字典鍵值對按URL編碼轉(zhuǎn)換,從而能被web服務(wù)器接受盆犁。
In [3]: urllib..parse.urlencode(word)  
Out[3]: "wd=%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2"

# 通過urllib.parse.unquote()方法,把 URL編碼字符串伊佃,轉(zhuǎn)換回原先字符串塞祈。
In [4]: print (urllib.parse.unquote("wd=%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2"))
wd=傳智播客

一般HTTP請求提交數(shù)據(jù)帅涂,需要編碼成 URL編碼格式媳友,然后做為url的一部分醇锚,或者作為參數(shù)傳到Request對象中焊唬。

Get方式

GET請求一般用于我們向服務(wù)器獲取數(shù)據(jù)赶促,比如說矩屁,我們用百度搜索傳智播客https://www.baidu.com/s?wd=傳智播客

瀏覽器的url會跳轉(zhuǎn)成如圖所示:

https://www.baidu.com/s?wd=%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2

在其中我們可以看到在請求部分里泊脐,http://www.baidu.com/s? 之后出現(xiàn)一個長長的字符串秕铛,其中就包含我們要查詢的關(guān)鍵詞傳智播客但两,于是我們可以嘗試用默認的Get方式來發(fā)送請求谨湘。

# urllib_get.py

import urllib.parse      #負責(zé)url編碼處理
import urllib.request

url = "http://www.baidu.com/s"
word = {"wd":"傳智播客"}
word = urllib.parse.urlencode(word) #轉(zhuǎn)換成url編碼格式(字符串)
newurl = url + "?" + word    # url首個分隔符就是 ?

headers={ "User-Agent": "
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36
"} 
request = urllib.request.Request(newurl, headers=headers) 
response = urllib.request.urlopen(request) 

print (response.read()) 

批量爬取貼吧頁面數(shù)據(jù)

首先我們創(chuàng)建一個python文件, tiebaSpider.py,我們要完成的是紧阔,輸入一個百度貼吧的地址,比如:

百度貼吧LOL吧第一頁:http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=0

第二頁: http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=50

第三頁: http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=100

發(fā)現(xiàn)規(guī)律了吧擅耽,貼吧中每個頁面不同之處,就是url最后的pn的值乖仇,其余的都是一樣的憾儒,我們可以抓住這個規(guī)律乃沙。

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import urllib.request
import urllib.parse

def loadPage(url, filename):
    """
        作用:根據(jù)url發(fā)送請求崔涂,獲取服務(wù)器響應(yīng)文件
        url: 需要爬取的url地址
        filename : 處理的文件名
    """
    print ("正在下載 " + filename)
    headers = {"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36"}

    request = urllib.request.Request(url, headers = headers)
    return urllib.request.urlopen(request).read()

def writePage(html, filename):
    """
        作用:將html內(nèi)容寫入到本地
        html:服務(wù)器相應(yīng)文件內(nèi)容
    """
    print ("正在保存 " + filename)
    # 文件寫入
    with open(filename, "wb+") as f:
        f.write(html)
    print ("-" * 30)

def tiebaSpider(url, beginPage, endPage):
    """
        作用:貼吧爬蟲調(diào)度器,負責(zé)組合處理每個頁面的url
        url : 貼吧url的前部分
        beginPage : 起始頁
        endPage : 結(jié)束頁
    """
    for page in range(beginPage, endPage + 1):
        pn = (page - 1) * 50
        filename = "第" + str(page) + "頁.html"
        fullurl = url + "&pn=" + str(pn)
        #print fullurl
        html = loadPage(fullurl, filename)
        #print html
        writePage(html, filename)
        print ('謝謝使用')

if __name__ == "__main__":
    kw = input("請輸入需要爬取的貼吧名:")
    beginPage = int(input("請輸入起始頁:"))
    endPage = int(input("請輸入結(jié)束頁:"))

    url = "http://tieba.baidu.com/f?"
    key = urllib.parse.urlencode({"kw": kw})
    fullurl = url + key
    tiebaSpider(fullurl, beginPage, endPage)

其實很多網(wǎng)站都是這樣的蝙茶,同類網(wǎng)站下的html頁面編號钳恕,分別對應(yīng)網(wǎng)址后的網(wǎng)頁序號,只要發(fā)現(xiàn)規(guī)律就可以批量爬取頁面了蹄衷。

POST方式:

上面我們說了Request請求對象的里有data參數(shù)忧额,它就是用在POST里的,我們要傳送的數(shù)據(jù)就是這個參數(shù)data愧口,data是一個字典睦番,里面要匹配鍵值對。

有道詞典翻譯網(wǎng)站:

輸入測試數(shù)據(jù)耍属,再通過使用Fiddler觀察托嚣,其中有一條是POST請求,而向服務(wù)器發(fā)送的請求數(shù)據(jù)并不是在url里厚骗,那么我們可以試著模擬這個POST請求示启。

[圖片上傳失敗...(image-9a9c6c-1599746015652)]

于是,我們可以嘗試用POST方式發(fā)送請求领舰。

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import urllib.request
import urllib.parse

# 通過抓包的方式獲取的url夫嗓,并不是瀏覽器上顯示的url
url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null"

# 完整的headers
headers = {
        "Accept" : "application/json, text/javascript, */*; q=0.01",
        "X-Requested-With" : "XMLHttpRequest",
        "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36",
        "Content-Type" : "application/x-www-form-urlencoded; charset=UTF-8",
    }

# 用戶接口輸入

# 發(fā)送到web服務(wù)器的表單數(shù)據(jù)
formdata = {
"type" : "AUTO",
"i" : "我愛你",
"doctype" : "json",
"xmlVersion" : "1.6",
"keyfrom" : "fanyi.web",
"ue" : "UTF-8",
"typoResult" : "true"
}

# 經(jīng)過urlencode轉(zhuǎn)碼
data = urllib.parse.urlencode(formdata).encode('utf-8')

# 如果Request()方法里的data參數(shù)有值迟螺,那么這個請求就是POST
# 如果沒有,就是Get
#request = urllib.request.Request(url, data = data, headers = headers)
response = urllib.request.urlopen(url,data)

html = response.read().decode('utf-8')

print(html)
#print (urllib.request.urlopen(req).read())
發(fā)送POST請求時啤月,需要特別注意headers的一些屬性:
Content-Length: 144: 是指發(fā)送的表單數(shù)據(jù)長度為144煮仇,也就是字符個數(shù)是144個。

X-Requested-With: XMLHttpRequest :表示Ajax異步請求谎仲。

Content-Type: application/x-www-form-urlencoded : 表示瀏覽器提交 Web 表單時使用浙垫,表單數(shù)據(jù)會按照 name1=value1&name2=value2 鍵值對形式進行編碼。

獲取AJAX加載的內(nèi)容
有些網(wǎng)頁內(nèi)容使用AJAX加載郑诺,只要記得夹姥,AJAX一般返回的是JSON,直接對AJAX地址進行post或get,就返回JSON數(shù)據(jù)了辙诞。

"作為一名爬蟲工程師辙售,你最需要關(guān)注的,是數(shù)據(jù)的來源"

import urllib
import urllib2

# demo1

url = "https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action"

headers={"User-Agent": "Mozilla...."}

# 變動的是這兩個參數(shù)飞涂,從start開始往后顯示limit個
formdata = {
    'start':'0',
    'limit':'10'
}
data = urllib.urlencode(formdata)

request = urllib2.Request(url, data = data, headers = headers)
response = urllib2.urlopen(request)

print response.read()


# demo2

url = "https://movie.douban.com/j/chart/top_list?"
headers={"User-Agent": "Mozilla...."}

# 處理所有參數(shù)
formdata = {
    'type':'11',
    'interval_id':'100:90',
    'action':'',
    'start':'0',
    'limit':'10'
}
data = urllib.urlencode(formdata)

request = urllib2.Request(url, data = data, headers = headers)
response = urllib2.urlopen(request)

print response.read()

問題:為什么有時候POST也能在URL內(nèi)看到數(shù)據(jù)旦部?

  • GET方式是直接以鏈接形式訪問,鏈接中包含了所有的參數(shù)较店,服務(wù)器端用Request.QueryString獲取變量的值士八。如果包含了密碼的話是一種不安全的選擇,不過你可以直觀地看到自己提交了什么內(nèi)容梁呈。
  • POST則不會在網(wǎng)址上顯示所有的參數(shù)婚度,服務(wù)器端用Request.Form獲取提交的數(shù)據(jù),在Form提交的時候官卡。但是HTML代碼里如果不指定 method 屬性蝗茁,則默認為GET請求,F(xiàn)orm中提交的數(shù)據(jù)將會附加在url之后寻咒,以?分開與url分開哮翘。
  • 表單數(shù)據(jù)可以作為 URL 字段(method="get")或者 HTTP POST (method="post")的方式來發(fā)送。比如在下面的HTML代碼中毛秘,表單數(shù)據(jù)將因為 (method="get") 而附加到 URL 上:
<form action="form_action.asp" method="get">
    <p>First name: <input type="text" name="fname" /></p>
    <p>Last name: <input type="text" name="lname" /></p>
    <input type="submit" value="Submit" />
</form>

利用cookie模擬登陸

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import urllib.request

url = "http://www.renren.com/410043129/profile"

headers = {
    "Host" : "www.renren.com",
    "Connection" : "keep-alive",
    #"Upgrade-Insecure-Requests" : "1",
    "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36",
    "Accept" : "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
    "Referer" : "http://www.renren.com/SysHome.do",
    #"Accept-Encoding" : "gzip, deflate, sdch",#加上會得到壓縮文件
    "Cookie" : "anonymid=ixrna3fysufnwv; _r01_=1; depovince=GW; jebe_key=f6fb270b-d06d-42e6-8b53-e67c3156aa7e%7Cc13c37f53bca9e1e7132d4b58ce00fa3%7C1484060607478%7C1%7C1484400895379; jebe_key=f6fb270b-d06d-42e6-8b53-e67c3156aa7e%7Cc13c37f53bca9e1e7132d4b58ce00fa3%7C1484060607478%7C1%7C1484400890914; JSESSIONID=abcX8s_OqSGsYeRg5vHMv; jebecookies=0c5f9b0d-03d8-4e6a-b7a9-3845d04a9870|||||; ick_login=8a429d6c-78b4-4e79-8fd5-33323cd9e2bc; _de=BF09EE3A28DED52E6B65F6A4705D973F1383380866D39FF5; p=0cedb18d0982741d12ffc9a0d93670e09; ap=327550029; first_login_flag=1; ln_uact=mr_mao_hacker@163.com; ln_hurl=http://hdn.xnimg.cn/photos/hdn521/20140529/1055/h_main_9A3Z_e0c300019f6a195a.jpg; t=56c0c522b5b068fdee708aeb1056ee819; societyguester=56c0c522b5b068fdee708aeb1056ee819; id=327550029; xnsid=5ea75bd6; loginfrom=syshome",
    "Accept-Language" : "zh-CN,zh;q=0.8,en;q=0.6",
}

request = urllib.request.Request(url, headers = headers)

response = urllib.request.urlopen(request)

print(response.read())

處理HTTPS請求 SSL證書驗證

現(xiàn)在隨處可見 https 開頭的網(wǎng)站饲嗽,urllib2可以為 HTTPS 請求驗證SSL證書搁料,就像web瀏覽器一樣盏浙,如果網(wǎng)站的SSL證書是經(jīng)過CA認證的铜犬,則能夠正常訪問柑肴,如:https://www.baidu.com/等...

如果SSL證書驗證不通過霞揉,或者操作系統(tǒng)不信任服務(wù)器的安全證書,比如瀏覽器在訪問12306網(wǎng)站如:https://www.12306.cn/mormhweb/的時候晰骑,會警告用戶證書不受信任适秩。(據(jù)說 12306 網(wǎng)站證書是自己做的绊序,沒有通過CA認證)

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import urllib.request
import ssl

# 忽略SSL安全認證
context = ssl._create_unverified_context()

url = "https://www.12306.cn/mormhweb/"
#url = "https://www.baidu.com/"

headers = {
    "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"
    }
request = urllib.request.Request(url, headers = headers)

# 添加到context參數(shù)里
response = urllib.request.urlopen(request, context = context)

print (response.read())

關(guān)于CA

CA(Certificate Authority)是數(shù)字證書認證中心的簡稱,是指發(fā)放秽荞、管理骤公、廢除數(shù)字證書的受信任的第三方機構(gòu),如北京數(shù)字認證股份有限公司扬跋、上海市數(shù)字證書認證中心有限公司等...

CA的作用是檢查證書持有者身份的合法性阶捆,并簽發(fā)證書,以防證書被偽造或篡改钦听,以及對證書和密鑰進行管理洒试。

現(xiàn)實生活中可以用身份證來證明身份, 那么在網(wǎng)絡(luò)世界里朴上,數(shù)字證書就是身份證垒棋。和現(xiàn)實生活不同的是,并不是每個上網(wǎng)的用戶都有數(shù)字證書的痪宰,往往只有當(dāng)一個人需要證明自己的身份的時候才需要用到數(shù)字證書叼架。

普通用戶一般是不需要,因為網(wǎng)站并不關(guān)心是誰訪問了網(wǎng)站衣撬,現(xiàn)在的網(wǎng)站只關(guān)心流量乖订。但是反過來,網(wǎng)站就需要證明自己的身份了淮韭。

比如說現(xiàn)在釣魚網(wǎng)站很多的垢粮,比如你想訪問的是www.baidu.com,但其實你訪問的是www.daibu.com”靠粪,所以在提交自己的隱私信息之前需要驗證一下網(wǎng)站的身份蜡吧,要求網(wǎng)站出示數(shù)字證書。

一般正常的網(wǎng)站都會主動出示自己的數(shù)字證書占键,來確蔽羯疲客戶端和網(wǎng)站服務(wù)器之間的通信數(shù)據(jù)是加密安全的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末畔乙,一起剝皮案震驚了整個濱河市君仆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌牲距,老刑警劉巖返咱,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異牍鞠,居然都是意外死亡咖摹,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門难述,熙熙樓的掌柜王于貴愁眉苦臉地迎上來萤晴,“玉大人吐句,你說我怎么就攤上這事〉甓粒” “怎么了嗦枢?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長屯断。 經(jīng)常有香客問我文虏,道長,這世上最難降的妖魔是什么裹纳? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任择葡,我火速辦了婚禮,結(jié)果婚禮上剃氧,老公的妹妹穿的比我還像新娘敏储。我一直安慰自己,他們只是感情好朋鞍,可當(dāng)我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布已添。 她就那樣靜靜地躺著,像睡著了一般滥酥。 火紅的嫁衣襯著肌膚如雪更舞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天坎吻,我揣著相機與錄音缆蝉,去河邊找鬼。 笑死瘦真,一個胖子當(dāng)著我的面吹牛刊头,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播诸尽,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼原杂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了您机?” 一聲冷哼從身側(cè)響起穿肄,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎际看,沒想到半個月后咸产,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡仲闽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年脑溢,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蔼囊。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡焚志,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出畏鼓,到底是詐尸還是另有隱情酱酬,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布云矫,位于F島的核電站膳沽,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏让禀。R本人自食惡果不足惜挑社,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望巡揍。 院中可真熱鬧痛阻,春花似錦、人聲如沸腮敌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽糜工。三九已至弊添,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間捌木,已是汗流浹背油坝。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留刨裆,地道東北人澈圈。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像崔拥,于是被迫代替她去往敵國和親极舔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,092評論 2 355