精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一只node爬蟲的升級打怪之路

開發 前端
我一直覺得,爬蟲是許多web開發人員難以回避的點。我們也應該或多或少的去接觸這方面,因為可以從爬蟲中學習到web開發中應當掌握的一些基本知識。而且,它還很有趣。

我一直覺得,爬蟲是許多web開發人員難以回避的點。我們也應該或多或少的去接觸這方面,因為可以從爬蟲中學習到web開發中應當掌握的一些基本知識。而且,它還很有趣。

我是一個知乎輕微重度用戶,之前寫了一只爬蟲幫我爬取并分析它的數據,我感覺這個過程還是挺有意思,因為這是一個不斷給自己創造問題又去解決問題的過程。其中遇到了一些點,今天總結一下跟大家分享分享。

它都爬了什么?

先簡單介紹下我的爬蟲。它能夠定時抓取一個問題的關注量、瀏覽量、回答數,以便于我將這些數據繪成圖表展現它的熱點趨勢。為了不讓我錯過一些熱門事件,它還會定時去獲取我關注話題下的熱門問答,并推送到我的郵箱。

作為一個前端開發人員,我必須為這個爬蟲系統做一個界面,能讓我登陸知乎帳號,添加關注的題目、話題,看到可視化的數據。所以這只爬蟲還有登陸知乎、搜索題目的功能。

然后來看下界面。

一只node爬蟲的升級打怪之路

一只node爬蟲的升級打怪之路

下面正兒八經講它的開發歷程。

技術選型

Python得益于其簡單快捷的語法、以及豐富的爬蟲庫,一直是爬蟲開發人員的***。可惜我不熟。當然最重要的是,作為一名前端開發人員,node能滿足爬蟲需求的話,自然更是***。而且隨著node的發展,也有許多好用的爬蟲庫,甚至有 puppeteer 這樣直接能模擬Chrome訪問網頁的工具的推出,node在爬蟲方面應該是妥妥能滿足我所有的爬蟲需求了。

于是我選擇從零搭建一個基于koa2的服務端。為什么不直接選擇egg,express,thinkjs這些更加全面的框架呢?因為我愛折騰嘛。而且這也是一個學習的過程。如果以前不了解node,又對搭建node服務端有興趣,可以看我之前的一篇文章-從零搭建Koa2 Server。

爬蟲方面我選擇了 request + cheerio 。雖然知乎有很多地方用到了react,但得益于它絕大部分頁面還是服務端渲染,所以只要能請求網頁與接口(request),解析頁面(cherrio)即可滿足我的爬蟲需求。

其他不一一舉例了,我列個技術棧

服務端

  1. koajs 做node server框架;
  2. request + cheerio 做爬蟲服務;
  3. mongodb 做數據存儲;
  4. node-schedule 做任務調度;
  5. nodemailer 做郵件推送。

客戶端

  1. vuejs 前端框架;
  2. museui Material Design UI庫;
  3. chart.js 圖表庫。

技術選型妥善后,我們就要關心業務了。首要任務就是真正的爬取到頁面。

如何能爬取網站的數據?

知乎并沒有對外開放接口能讓用戶獲取數據,所以想獲取數據,就得自己去爬取網頁信息。我們知道即使是網頁,它本質上也是個GET請求的接口,我們只要在服務端去請求對應網頁的地址(客戶端請求會跨域),再把html結構解析下,獲取想要的數據即可。

那為什么我要搞一個登陸呢?因為非登陸帳號獲取信息,知乎只會展現有限的數據,而且也無法得知自己知乎帳戶關注的話題、問題等信息。而且若是想自己的系統也給其他朋友使用,也必須搞一個帳戶系統。

模擬登陸

大家都會用Chrome等現代瀏覽器看請求信息,我們在知乎的登錄頁進行登陸,然后查看捕獲接口信息就能知道,登陸無非就是向一個登陸api發送賬戶、密碼等信息,如果成功。服務端會向客戶端設置一個cookie,這個cookie即是登陸憑證。

所以我們的思路也是如此,通過爬蟲服務端去請求接口,帶上我們的帳號密碼信息,成功后再將返回的cookie存到我們的系統數據庫,以后再去爬取其他頁面時,帶上此cookie即可。

當然,等我們真正嘗試時,會受到更多挫折,因為會遇到token、驗證碼等問題。不過,由于我們有客戶端了,可以將驗證碼的識別交給真正的 人 ,而不是服務端去解析圖片字符,這降低了我們實現登陸的難度。

一波三折的是,即使你把正確驗證碼提交了,還是會提示驗證碼錯誤。如果我們自己做過驗證碼提交的系統就能夠迅速的定位原因。如果沒做過,我們再次查看登陸時涉及的請求與響應,我們也能猜到:

在客戶端獲取驗證碼時,知乎服務端還會往客戶端設置一個新cookie,提交登陸請求時,必須把驗證碼與此cookie一同提交,來驗證此次提交的驗證碼確實是當時給予用戶的驗證碼。

語言描述有些繞,我以圖的形式來表達一個登陸請求的完整流程。

一只node爬蟲的升級打怪之路

注:我編寫爬蟲時,知乎還部分采取圖片字符驗證碼,現已全部改為“點擊倒立文字”的形式。這樣會加大提交正確驗證碼的難度,但也并非無計可施。獲取圖片后,由 人工 識別并點擊倒立文字,將點擊的坐標提交到登陸接口即可。當然有興趣有能力的同學也可以自己編寫算法識別驗證碼。

爬取數據

上一步中,我們已經獲取到了登陸后的憑證cookie。用戶登陸成功后,我們把登陸的帳戶信息與其憑證cookie存到mongo中。以后此用戶發起的爬取需求,包括對其跟蹤問題的數據爬取都根據此cookie爬取。

當然cookie是有時間期限的,所以當我們存cookie時,應該把過期時間也記錄下來,當后面再獲取此cookie時,多加一步過期校驗,若過期了則返回過期提醒。

爬蟲的基礎搞定后,就可以真正去獲取想要的數據了。我的需求是想知道某個知乎問題的熱點趨勢。先用瀏覽器去看看一個問題頁面下都有哪些數據,可以被我爬取分析。舉個例子,比如這個問題: 有哪些令人拍案叫絕的推理橋段 。

打開鏈接后,頁面上最直接展現出來的有 關注者 , 被瀏覽 , 1xxxx個回答 ,還要默認展示的幾個高贊回答及其點贊評論數量。右鍵查看網站源代碼,確認這些數據是服務端渲染出來的,我們就可以通過request請求網頁,再通過cherrio,使用css選擇器定位到數據節點,獲取并存儲下來。代碼示例如下:

 

  1. async getData (cookie, qid) { 
  2.   const options = { 
  3.     url: `${zhihuRoot}/question/${qid}`, 
  4.     method: 'GET'
  5.     headers: { 
  6.       'Cookie': cookie, 
  7.       'Accept-Encoding''deflate, sdch, br' // 不允許gzip,開啟gzip會開啟知乎客戶端渲染,導致無法爬取 
  8.     } 
  9.   } 
  10.   const rs = await this.request(options) 
  11.   if (rs.error) { 
  12.     return this.failRequest(rs) 
  13.   } 
  14.   const $ = cheerio.load(rs) 
  15.   const NumberBoard = $('.NumberBoard-item .NumberBoard-value'
  16.   const $title = $('.QuestionHeader-title'
  17.   $title.find('button').remove() 
  18.   return { 
  19.     success: true
  20.     title: $title.text(), 
  21.     data: { 
  22.       qid: qid, 
  23.       followers: Number($(NumberBoard[0]).text()), 
  24.       readers: Number($(NumberBoard[1]).text()), 
  25.       answers: Number($('h4.List-headerText span').text().replace(' 個回答''')) 
  26.     } 
  27.   } 

這樣我們就爬取了一個問題的數據,只要我們能夠按一定時間間隔不斷去執行此方法獲取數據,最終我們就能繪制出一個題目的數據曲線,分析起熱點趨勢。

那么問題來了,如何去做這個定時任務呢?

定時任務

我使用了 node-schedule 做任務調度。如果之前做過定時任務的同學,可能對其類似cron的語法比較熟悉,不熟悉也沒關系,它提供了not-cron-like的,更加直觀的設置去配置任務,看下文檔就能大致了解。

當然這個定時任務不是簡單的不斷去執行上述的爬取方法 getData 。因為這個爬蟲系統不僅是一個用戶,一個用戶不僅只跟蹤了一個問題。

所以我們此處的完整任務應該是遍歷系統的每個cookie未過期用戶,再遍歷每個用戶的跟蹤問題,再去獲取這些問題的數據。

系統還有另外兩個定時任務,一個是定時爬取用戶關注話題的熱門回答,另一個是推送這個話題熱門回答給相應的用戶。這兩個任務跟上述任務大致流程一樣,就不細講了。

但是在我們做定時任務時會有個細節問題,就是如何去控制爬取時的并發問題。具體舉例來說:如果爬蟲請求并發太高,知乎可能是會限制此IP的訪問的,所以我們需要讓爬蟲請求一個一個的,或者若干個若干個的進行。

簡單思考下,我們會采取循環await。我不假思索的寫下了如下代碼:

 

  1. // 爬蟲方法 
  2. async function getQuestionData () { 
  3.   // do spider action 
  4.  
  5. // questions為獲取到的關注問答 
  6. questions.forEach(await getQuestionData) 

然而執行之后,我們會發現這樣其實還是并發執行的,為什么呢?其實仔細想下就明白了。forEach只是循環的語法糖,如果沒有這個方法,讓你來實現它,你會怎么寫呢?你大概也寫的出來:

 

  1. Array.prototype.forEach = function (callback) { 
  2.   for (let i = 0; i < this.length; i++) { 
  3.     callback(this[i], i, this) 
  4.   } 

雖然 forEach 本身會更復雜點,但大致就是這樣吧。這時候我們把一個異步方法作為參數 callback 傳遞進去,然后循環執行它,這個執行依舊是并發執行,并非是同步的。

所以我們如果想實現真正的同步請求,還是需要用for循環去執行,如下:

 

  1. async function getQuestionData () { 
  2.   // do spider action 
  3. for (let i = 0; i < questions.length; i++) { 
  4.   await getQuestionData() 

除了for循環,還可以通過for-of,如果對這方面感興趣,可以去多了解下數組遍歷的幾個方法,順便研究下ES6的迭代器 Iterator 。

其實如果業務量大,即使這樣做也是不夠的。還需要更加細分任務顆粒度,甚至要加代理IP來分散請求。

合理搭建服務端

下面說的點跟爬蟲本身沒有太大關系了,屬于服務端架構的一些分享,如果只關心爬蟲本身的話,可以不用再往下閱讀了。

我們把爬蟲功能都寫的差不多了,后面只要編寫相應的路由,能讓前端訪問到數據就好了。但是編寫一個沒那么差勁的服務端,還是需要我們深思熟慮的。

合理分層

我看過一些前端同學寫的node服務,經常就會把系統所有的接口(router action)都寫到一個文件中,好一點的會根據模塊分幾個對于文件。

但是如果我們接觸過其他成熟的后端框架、或者大學學過一些J2EE等知識,就會本能意識的進行一些分層:

 

  1. model 
  2. service 
  3. controller 

當然也有些框架或者人會將業務邏輯 service 實現在 controller 中,亦或者是 model 層中。我個人認為一個稍微復雜的項目,應該是單獨抽離出抽象的業務邏輯的。

比如在我這個爬蟲系統中,我將數據庫的添刪改查操作按 model 層對應抽離出 service ,另外再將爬取頁面的服務、郵件推送的服務、用戶鑒權的服務抽離到對應的 service 。

最終我們的 api 能夠設計的更加易讀,整個系統也更加易拓展。

分層在koa上的實踐

如果是直接使用一個成熟的后端框架,分層這事我們是不用多想的。node這樣的框架也有,我之前介紹的我廠開源的 api-mocker 采用的 egg.js ,也幫我們做好了合理的分層。

但是如果自己基于koa從零搭建一個服務端,在這方面上就會遇到一些挫折。koa本身邏輯非常簡單,就是調取一系列中間件(就是一個個function),來處理請求。官方自己提供的 koa-router ,即是幫助我們識別請求路徑,然后加載對應的接口方法。

我們為了區分業務模塊,會把一些接口方法寫在同一個 controller 中,比如我的 questionController 負責處理問題相關的接口; topicController 負責處理話題相關的接口。

那么我們可能會這樣編寫路由文件:

 

  1. const Router = require('koa-router'
  2. const router = new Router() 
  3.  
  4. const question = require('./controller/question'
  5. const topic = require('./controller/topic'
  6.  
  7. router.post('/api/question', question.create
  8. router.get('/api/question', question.get) 
  9.  
  10. router.get('/api/topic', topic.get) 
  11. router.post('/api/topic/follow', topic.follow) 
  12.  
  13. module.exports = router 

我的question文件可能是這樣寫的:

 

  1. class Question { 
  2.   async get () { 
  3.     // return data 
  4.   } 
  5.   async create () { 
  6.     // create question and return data 
  7.   } 
  8.  
  9. module.exports = new Question() 

那么問題就來了

單純這樣寫是沒有辦法真正的以面向對象的形式來編寫 controller 的。為什么呢?

因為我們將question對象的屬性方法作為中間件傳遞到了 koa-router 中,然后由 koa 底層來合并這些中間件方法,作為參數傳遞到 http.createServer 方法中,最終由node底層監聽請求時調用。那這個 this 到底會是誰,不進行調試,或者查看koa與node源代碼,是無從得知的。但是無論如何方法調用者肯定不是這個對象自身了(實際上它會是 undefined )。

也就是說,我們不能通過 this 來獲取對象自身的屬性或方法。

那怎么辦呢?有的同學可能會選擇將自身一些公共方法,直接寫在 class 外部,或者寫在某個 utils 文件中,然后在接口方法中使用。比如這樣:

 

  1. const error = require('utils/error'
  2.  
  3. const success = (ctx, data) => { 
  4.   ctx.body = { 
  5.     success: true
  6.     data: data 
  7.   } 
  8.  
  9. class Question { 
  10.   async get () { 
  11.     success(data) 
  12.   } 
  13.   async create () { 
  14.     error(result) 
  15.   } 
  16.  
  17. module.exports = new Question() 

這樣確實ok,但是又會有新的問題---這些方法就不是對象自己的屬性,也就沒辦法被子類繼承了。

為什么需要繼承呢?因為有時候我們希望一些不同的 controller 有著公共的方法或屬性,舉個例子:我希望我所有的成功or失敗都是這樣的格式:

 

  1.   success: false
  2.   message: '對應的錯誤消息' 
  3.   success: true
  4.   data: '對應的數據' 

按照 koa 的核心思想,這個通用的格式轉化,應該是專門編寫一個中間件,在路由中間件之后(即執行完controller里的方法之后)去做專門處理并response。

然而這樣會導致每有一個公共方法,就必須要加一個中間件。而且 controller 本身已經失去了對這些方法的控制權。這個中間件是執行自身還是直接 next() 將會非常難判斷。

如果是抽離成 utils 方法再引用,也不是不可以,就是方法多的話,聲明引用稍微麻煩些,而且沒有抽象類的意義。

更理想的狀態應該是如剛才所說的,大家都繼承一個抽象的父類,然后去調用父類的公共相應方法即可,如:

 

  1. class AbstractController { 
  2.   success (ctx, data) { 
  3.     ctx.body = { 
  4.       success: true
  5.       data: data 
  6.     } 
  7.   } 
  8.   error (ctx, error) { 
  9.     ctx.body = { 
  10.       success: false
  11.       msg: error 
  12.     } 
  13.   } 
  14. class Question extends AbstractController { 
  15.   async get (ctx) { 
  16.     const data = await getData(ctx.params.id) 
  17.     return super.success(ctx, data) 
  18.   } 

這樣就方便多了,不過如果寫過koa的人可能會有這樣的煩惱,一個上下文 ctx 總是要作為參數傳遞來傳遞去。比如上述控制器的所有中間件方法都得傳 ctx 參數,調用父類方法時,又要傳它,還會使得方法損失一些可讀性。

所以總結一下,我們有如下問題:

 

  1. controller 
  2. ctx 

解決它

其實解決的辦法很簡單,我們只要想辦法讓 controller 方法中的this指向實例化對象自身,再把 ctx 掛在到這個 this 上即可。

怎么做呢?我們只要再封裝一下 koa-router 就好了,如下所示:

 

  1. const Router = require('koa-router'
  2. const router = new Router() 
  3. const question = require('./controller/question'
  4. const topic = require('./controller/topic'
  5.  
  6. const routerMap = [ 
  7.   ['post''/api/question', question, 'create'], 
  8.   ['get''/api/question', question, 'get'], 
  9.   ['get''/api/topic', topic, 'get'], 
  10.   ['post''/api/topic/follow', topic, 'follow'
  11.  
  12. routerMap.map(route => { 
  13.   const [ method, path, controller, action ] = route 
  14.  
  15.   router[method](path, async (ctx, next) => 
  16.     controller[action].bind(Object.assign(controller, { ctx }))(ctx, next
  17.   ) 
  18. }) 
  19.  
  20. module.exports = router 

大意就是在路由傳遞 controller 方法時,將 controller 自身與 ctx 合并,通過 bind 指定該方法的 this 。這樣我們就能通過 this 獲取方法所屬 controller 對象的其他方法。此外子類方法與父類方法也能通過 this.ctx 來獲取上下文對象 ctx 。

但是 bind 之前我們其實應該考慮以下,其他中間件以及koa本身會不會也干了類似的事,修改了this的值。如何判斷呢,兩個辦法:

  1. 調試。在我們未 bind 之前,在中間件方法中打印一下 this ,是 undefined 的話自然就沒被綁定。
  2. 看koa-router/koa/node的源代碼。

事實是,自然是沒有的。那我們就放心的 bind 吧。

寫在***

上述大概就是編寫這個小工具時,遇到的一些點,感覺可以總結的。也并沒有什么技術難點,不過可以借此學習學習一些相關的知識,包括網站安全、爬與反爬、、koa底層原理等等。

這個工具本身非常的個人色彩,不一定滿足大家的需要。而且它在半年前就寫好了,只不過最近被我挖墳拿出來總結。而且就在我即將寫完文章時,我發現知乎提示我的賬號不安全了。我估計是以為同一IP同一賬戶發起過多的網絡請求,我這臺服務器IP已經被認為是不安全的IP了,在這上面登錄的賬戶都會被提示不安全。所以我不建議大家將其直接拿來使用。

當然,如果還是對其感興趣,本地測試下或者學習使用,還是沒什么大問題的。或者還有更深的興趣的話,可以自己嘗試去繞開知乎的安全策略。

責任編輯:未麗燕 來源: SegmentFault
相關推薦

2016-10-31 20:13:41

大數據數據分析

2014-02-19 11:12:35

2019-10-30 15:27:28

Google谷歌Alphabet

2022-10-18 22:20:36

CSS矩形border

2018-07-27 09:52:10

監控阿里智能

2022-03-02 09:40:26

微軟Windows 8ASCII 貓

2015-04-15 10:29:38

Linux 4.0

2017-09-13 11:49:11

有孚網絡上云專有云

2009-11-24 09:31:38

2017-09-12 12:13:57

夢想 咸魚

2018-05-14 14:02:41

Python爬蟲網易云音樂

2015-07-28 17:28:15

程序員技能

2020-07-15 07:40:20

Linux命令JavaScript

2010-04-19 11:53:28

富士康

2017-09-29 09:22:02

2023-12-18 08:42:49

Cat.1窄帶通信

2023-08-02 08:00:00

JavaScriptWeb

2010-09-30 11:17:22

2019-01-28 08:31:47

360架構系統

2021-05-28 11:10:18

區塊鏈加密貨幣比特幣
點贊
收藏

51CTO技術棧公眾號

亚洲欧美一区二区久久| 久久字幕精品一区| 精品国产伦一区二区三区观看体验| 国产一区二区三区小说| 西西人体44www大胆无码| 日韩成人午夜电影| 欧美日韩免费观看一区=区三区| 欧美一级淫片007| 日本免费黄视频| 在线免费av网站| 99视频国产精品| 成人午夜在线影院| 国产视频1区2区| 综合激情视频| 一区二区三区四区精品| 成人啪啪18免费游戏链接| 久久91导航| 夜夜精品视频一区二区| 亚洲国产一区二区三区在线播 | 国产在线三区| 国产精品亚洲专一区二区三区| 欧洲精品毛片网站| 青娱乐免费在线视频| 成人免费电影网址| 337p日本欧洲亚洲大胆精品| 狠狠操狠狠干视频| 在线观看的黄色| 亚洲综合图片区| 中文字幕一区二区三区四区五区| 日本不卡免费播放| 成人永久看片免费视频天堂| 成人性生交xxxxx网站| 激情网站在线观看| 亚洲一区久久| 97精品国产97久久久久久春色| 久久福利免费视频| 日韩激情图片| 亚洲香蕉伊综合在人在线视看| 亚洲av成人片色在线观看高潮 | 日本成人在线电影网| 97在线视频观看| 国产第一页在线播放| 欧美成人有码| 欧美成aaa人片免费看| 麻豆一区在线观看| 国产又粗又猛又黄视频| 国产一区二区三区探花| 亚洲国产精彩中文乱码av在线播放| 亚洲综合在线一区二区| 四虎地址8848精品| 欧美在线观看视频一区二区 | 欧美日韩在线观看免费| 欧美成人激情| 日韩一中文字幕| 五月天免费网站| 成人精品视频| 在线视频国产日韩| 久久久久999| 国产亚洲黄色片| av网址在线播放| 尤物在线观看一区| av一区二区三区免费观看| www.久久久久.com| 亚洲一区二区欧美日韩| 成年人看的毛片| 成人黄色动漫| 精品久久久久久| 国产亚洲天堂网| 国产成人精品一区二三区在线观看 | 日韩免费视频一区| 中文字幕99页| 青青草这里只有精品| 亚洲精品少妇网址| 免费黄在线观看| 亚洲成人一区| 久久男人的天堂| 狠狠人妻久久久久久综合| 日韩精品乱码av一区二区| 国产成人拍精品视频午夜网站| 亚洲免费视频二区| 国产毛片精品视频| 精品不卡在线| 成人精品福利| 一区二区在线观看视频在线观看| 免费无码毛片一区二三区| 秋霞伦理一区| 欧美日韩国产不卡| 88av在线播放| 日韩av有码| 欧美激情a在线| 久久久久在线视频| 韩国av一区二区三区| 狠狠色综合色区| 9191在线观看| 亚洲成av人片观看| 九热视频在线观看| 88久久精品| 正在播放亚洲1区| 久久久精品99| 日本少妇一区二区| 成人在线视频网址| eeuss影院在线观看| 亚洲精品视频在线观看网站| 男女激情无遮挡| 四虎精品一区二区免费| 日韩精品在线播放| www欧美com| 日本中文字幕一区二区有限公司| 成人自拍爱视频| 日本在线免费中文字幕| 欧美日韩美女在线| 欧美精品 - 色网| 国产日产精品一区二区三区四区的观看方式 | 亚洲成人人体| 欧美mv日韩mv国产网站| 天天干天天操天天拍| 亚洲精品一级| 91中文字幕在线| 国产精品二线| 午夜不卡av在线| 特种兵之深入敌后| 成人影院在线| 欧洲一区二区视频| 亚洲av无码乱码国产麻豆| 欧美激情在线一区二区| 日韩欧美一区二| 亚洲性视频在线| 久久亚洲私人国产精品va| 欧美人一级淫片a免费播放| 黄a在线观看| 中文字幕亚洲电影| 久久久久久久久久久久久国产精品| 免费欧美网站| 乱亲女秽乱长久久久| 91禁在线观看| 中文字幕av免费专区久久| 成人观看免费完整观看| 国内精品麻豆美女在线播放视频| 欧美老少配视频| 99久久精品无免国产免费| 国产精品色噜噜| 无需播放器的av| 日韩精品网站| 国产免费一区二区三区在线能观看| 你懂得在线网址| 精品毛片网大全| 少妇饥渴放荡91麻豆| 亚洲免费高清| 裸模一区二区三区免费| 在线观看v片| 亚洲欧美资源在线| 日本视频网站在线观看| 久久久久久夜精品精品免费| 无遮挡又爽又刺激的视频| 美女久久久久| 国产成人在线一区二区| 福利在线观看| 欧美日韩一区高清| 亚洲女人久久久| 国产一区二区三区在线观看免费视频| 在线观看免费黄色片| 日韩精品三级| 韩国精品美女www爽爽爽视频| 男人天堂网在线视频| 精品久久久久久久久久| 日本黄色网址大全| 葵司免费一区二区三区四区五区| 日韩福利影院| 97色婷婷成人综合在线观看| 久久国产精品久久精品| 少妇喷水在线观看| 色狠狠色噜噜噜综合网| 中文国语毛片高清视频| 国内久久婷婷综合| 国产一区二区三区小说| 伊人久久大香线蕉综合网站 | www.久久草.com| 欧美国产视频一区二区| 亚洲欧美日韩动漫| 一本色道久久综合亚洲精品酒店| 久久这里有精品视频| 蜜桃视频在线观看www| 欧美丝袜一区二区三区| 国产又粗又猛又爽又黄的视频四季| 狠狠色狠狠色综合日日91app| 欧美激情亚洲天堂| 亚洲人成网站77777在线观看| 国产精品永久在线| ririsao久久精品一区| 亚洲香蕉成人av网站在线观看| 97成人免费视频| 亚洲一二三区不卡| 国产精品久久久久久久av| 国产老妇另类xxxxx| 六月丁香激情网| 99tv成人| 麻豆精品蜜桃一区二区三区| 欧洲亚洲精品久久久久| 91爱视频在线| 成人在线app| 亚洲欧美日韩爽爽影院| 99视频国产精品免费观看a| 狠狠躁天天躁日日躁欧美| 好吊日在线视频| 不卡视频一二三| gai在线观看免费高清| 免费在线欧美黄色| 国产成人三级视频| 国产精品嫩草影院在线看| 99精品国产一区二区| 国产亚洲一区二区手机在线观看| 欧美黑人极品猛少妇色xxxxx | 久久久精品国产| 欧美日韩国产中文字幕在线| 日韩三级免费观看| 亚洲天堂网视频| 精品久久中文字幕| 久草免费新视频| 亚洲欧美综合色| www..com.cn蕾丝视频在线观看免费版 | 中国特级黄色大片| 精品一区二区在线观看| 久久久久国产精品熟女影院| 亚洲精品三级| 欧美中日韩在线| 综合久久一区| 一级做a爰片久久| 欧美人妖在线| 蜜桃传媒视频麻豆第一区免费观看 | 国内av一区二区三区| 亚洲高清av在线| 国产网站无遮挡| 久久99高清| 99久久99久久精品国产片| 99久久精品一区二区成人| 欧美一级视频在线观看| 岛国av在线播放| 久久久久久久一区二区| 视频在线观看入口黄最新永久免费国产 | 亚洲a区在线视频| 日韩大陆av| 国产精品中文字幕久久久| 日韩成人动漫| 国产成人亚洲综合91| 欧美日韩视频免费观看| 国产999精品| 欧美va视频| 国产精品视频在线播放| 欧美a视频在线| 91色中文字幕| 日本高清久久| 成人国产一区二区| 国产伦精品一区二区三区免费优势 | 久久久另类综合| 免费看91的网站| 国产精品美女久久久久久久 | 91久久久亚洲精品| 国产精品久久久久久av公交车| 亚洲a一级视频| 国产suv精品一区二区四区视频| 国产伦一区二区三区色一情| 美女网站色精品尤物极品姐弟| 精品午夜一区二区三区| 亚洲涩涩av| 亚洲精品高清国产一线久久| 97国产精品| 欧美中文字幕在线观看视频| 夜夜嗨网站十八久久| 久久综合久久色| 美女脱光内衣内裤视频久久网站| 五月天视频在线观看| 国产成人精品免费视频网站| 亚洲av无码一区二区三区网址 | 久久r热视频| 国产精品美女久久久免费| 亚洲成人精品综合在线| 北条麻妃高清一区| 亚洲黄页网站| 国产成人精品免费看在线播放| 欧美成人午夜| 成熟老妇女视频| 看片的网站亚洲| 欧美性生交xxxxx| 国产日韩欧美电影| 午夜国产福利一区二区| 亚洲自拍偷拍图区| 亚洲黄网在线观看| 91精品国产综合久久久久久漫画| 亚洲精品中文字幕成人片| 亚洲伦理中文字幕| 黄在线免费看| 欧美在线亚洲在线| 四虎影视国产精品| 快播亚洲色图| 亚洲精品成人| 波多野结衣家庭教师视频| 国产一区二区中文字幕| a毛片毛片av永久免费| 伊人夜夜躁av伊人久久| 美日韩一二三区| 日韩一区二区三区四区五区六区| 日本精品999| 日韩在线播放一区| 欧美成人精品一区二区男人小说| 亚洲一区二区三区乱码aⅴ蜜桃女| 免费观看久久av| 成人免费网站入口| 精品一区二区三区视频| 国产精品1000部啪视频| 亚洲一线二线三线视频| 亚洲一级片免费看| 日韩久久精品电影| 黑人极品ⅴideos精品欧美棵| 国产精品专区一| 久久理论电影网| 日韩精品一区二区三区丰满 | 亚洲欧美日韩国产成人综合一二三区 | 久久精品一二区| 日韩视频123| 性开放的欧美大片| 日本不卡免费高清视频| 亚洲高清999| 中文字幕在线观看一区二区三区| 午夜亚洲影视| 国产精品边吃奶边做爽| 亚洲午夜在线视频| 国产成人精品无码高潮| 日韩在线观看免费高清完整版| 老司机2019福利精品视频导航| 国产一区二区高清不卡| 欧美国产三级| 麻豆网站免费观看| 中文字幕一区二区视频| 波多野结衣小视频| 亚洲欧美精品伊人久久| 国产夫妻在线播放| 九九九九九九精品| 精品电影一区| 亚洲精品国产成人av在线| 夜夜操天天操亚洲| xxxwww在线观看| 欧美国产视频日韩| 凹凸成人在线| 日韩极品视频在线观看| 岛国精品在线播放| 九九热只有精品| 精品久久久久久综合日本欧美| 色呦呦在线播放| 国产高清一区二区三区| 在线看片一区| 亚洲精品在线视频免费观看| 亚洲6080在线| 四虎影院在线播放| 欧美一级免费视频| 久久99国内| 久久人人爽av| 亚洲免费伊人电影| 亚洲第一天堂影院| 久久人91精品久久久久久不卡| 欧美激情15p| 99久久国产宗和精品1上映| 日本一区二区三级电影在线观看| 少妇无套内谢久久久久| 最近2019中文字幕在线高清| 亚洲精品777| 亚洲色欲久久久综合网东京热| 99久久久免费精品国产一区二区 | 欧美日韩国产不卡| 成人片在线看| 国产亚洲精品久久飘花| 免费亚洲网站| 小泽玛利亚一区| 亚洲а∨天堂久久精品9966| 欧美自拍电影| 一区二区精品在线观看| 成人性生交大合| aaa在线视频| 欧美成人网在线| 欧美顶级毛片在线播放| 亚洲免费av一区二区三区| 亚洲免费在线视频一区 二区| 亚洲色图欧美视频| 国产精品久久久久久亚洲调教 | 欧美极品xxx| 亚洲av色香蕉一区二区三区| 欧洲日韩成人av| 亚洲成人日韩| 欧美做受xxxxxⅹ性视频| 69堂成人精品免费视频| av漫画网站在线观看| 日韩成人在线资源| 高清国产午夜精品久久久久久| 免费看毛片网站| 九色成人免费视频| 色综合综合网| 亚洲黄色小说在线观看| 欧美三级中文字| 超碰在线cao| 加勒比海盗1在线观看免费国语版| 久久久久久久久99精品|