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

基于TypeScript從0到1搭建一款爬蟲工具

系統(tǒng)
今天,我們將使用TS這門語言搭建一款爬蟲工具。

[[378604]]

前言

今天,我們將使用TS這門語言搭建一款爬蟲工具。目標(biāo)網(wǎng)址是什么呢?我們?nèi)ド暇W(wǎng)一搜,經(jīng)過幾番排查之后,我們選定了這一個網(wǎng)站。

https://www.hanju.run/

一個視頻網(wǎng)站,我們的目的主要是爬取這個網(wǎng)站上視頻的播放鏈接。下面,我們就開始進(jìn)行第一步。

第一步

俗話說,萬事開頭難。不過對于這個項目而言,恰恰相反。你需要做以下幾個事情:

1.我們需要創(chuàng)建一個項目文件夾

2.鍵入命令,初始化項目

  1. npm init -y 

3.局部安裝typescript

  1. npm install typescript -D 

4.接著鍵入命令,生成ts配置文件

  1. tsc --init 

5.局部安裝ts-node,用于命令行輸出命令

  1. npm install -D ts-node 

6.在項目文件夾中創(chuàng)建一個src文件夾

然后我們在src文件夾中創(chuàng)建一個crawler.ts文件。

7.在package.json文件中修改快捷啟動命令

  1. "scripts": { 
  2.     "dev-t""ts-node ./src/crawler.ts" 
  3.   } 

第二步

接下來,我們將進(jìn)行實戰(zhàn)操作,也就是上文中crawler.ts文件是我們的主戰(zhàn)場。

我們首先需要引用的這幾個依賴,分別是

  1. import superagent from "superagent"
  2. import cheerio from "cheerio"
  3. import fs from "fs"
  4. import path from "path"

所以,我們會這樣安裝依賴:

superagent作用是獲取遠(yuǎn)程網(wǎng)址html的內(nèi)容。

  1. npm install superagent 

cheerio作用是可以通過jQ語法獲取頁面節(jié)點的內(nèi)容。

  1. npm install cheerio 

剩余兩個依賴fs,path。它們是node內(nèi)置依賴,直接引入即可。

我們完成了安裝依賴,但是會發(fā)現(xiàn)你安裝的依賴上會有紅色報錯。原因是這樣的,superagent和cheerio內(nèi)部都是用JS寫的,并不是TS寫的,而我們現(xiàn)在的環(huán)境是TS。所以我們需要翻譯一下,我們將這種翻譯文件又稱類型定義文件(以.d.ts為后綴)。我們可以使用以下命令安裝類型定義文件。

  1. npm install -D @types/superagent 

  1. npm install -D @types/cheerio 

接下來,我們就認(rèn)認(rèn)真真看源碼了。

1.安裝完兩個依賴后,我們需要創(chuàng)建一個Crawler類,并且將其實例化。

  1. import superagent from "superagent"
  2. import cheerio from "cheerio"
  3. import fs from "fs"
  4. import path from "path"
  5.  
  6. class Crawler { 
  7.   constructor() { 
  8.      
  9.   } 
  10.  
  11. const crawler = new Crawler(); 

2.我們確定下要爬取的網(wǎng)址,然后賦給一個私有變量。最后我們會封裝一個getRawHtml方法來獲取對應(yīng)網(wǎng)址的內(nèi)容。

getRawHtml方法中我們使用了async/await關(guān)鍵字,主要用于異步獲取頁面內(nèi)容,然后返回值。

  1. import superagent from "superagent"
  2. import cheerio from "cheerio"
  3. import fs from "fs"
  4. import path from "path"
  5.  
  6. class Crawler { 
  7.   private url = "https://www.hanju.run/play/39221-4-0.html"
  8.  
  9.   async getRawHtml() { 
  10.     const result = await superagent.get(this.url); 
  11.     return result.text; 
  12.   } 
  13.  
  14.   async initSpiderProcess() { 
  15.     const html = await this.getRawHtml(); 
  16.   } 
  17.  
  18.   constructor() { 
  19.     this.initSpiderProcess(); 
  20.   } 
  21.  
  22. const crawler = new Crawler(); 

3.使用cheerio依賴內(nèi)置的方法獲取對應(yīng)的節(jié)點內(nèi)容。

我們通過getRawHtml方法異步獲取網(wǎng)頁的內(nèi)容,然后我們傳給getJsonInfo這個方法,注意是string類型。我們這里通過cheerio.load(html)這條語句處理,就可以通過jQ語法來獲取對應(yīng)的節(jié)點內(nèi)容。我們獲取到了網(wǎng)頁中視頻的標(biāo)題以及鏈接,通過鍵值對的方式添加到一個對象中。注:我們在這里定義了一個接口,定義鍵值對的類型。

  1. import superagent from "superagent"
  2. import cheerio from "cheerio"
  3. import fs from "fs"
  4. import path from "path"
  5.  
  6. interface Info { 
  7.   name: string; 
  8.   url: string; 
  9.  
  10. class Crawler { 
  11.   private url = "https://www.hanju.run/play/39221-4-0.html"
  12.  
  13.   getJsonInfo(html: string) { 
  14.     const $ = cheerio.load(html); 
  15.     const info: Info[] = []; 
  16.     const scpt: string = String($(".play>script:nth-child(1)").html()); 
  17.     const url = unescape( 
  18.       scpt.split(";")[3].split("(")[1].split(")")[0].replace(/\"/g, "") 
  19.     ); 
  20.     const name: string = String($("title").html()); 
  21.     info.push({ 
  22.       name
  23.       url, 
  24.     }); 
  25.     const result = { 
  26.       time: new Date().getTime(), 
  27.       data: info, 
  28.     }; 
  29.     return result; 
  30.   } 
  31.  
  32.   async getRawHtml() { 
  33.     const result = await superagent.get(this.url); 
  34.     return result.text; 
  35.   } 
  36.  
  37.   async initSpiderProcess() { 
  38.     const html = await this.getRawHtml(); 
  39.     const info = this.getJsonInfo(html); 
  40.   } 
  41.  
  42.   constructor() { 
  43.     this.initSpiderProcess(); 
  44.   } 
  45.  
  46. const crawler = new Crawler(); 

4.我們首先要在項目根目錄下創(chuàng)建一個data文件夾。然后我們將獲取的內(nèi)容我們存入文件夾內(nèi)的url.json文件(文件自動生成)中。

我們將其封裝成getJsonContent方法,在這里我們使用了path.resolve來獲取文件的路徑。fs.readFileSync來讀取文件內(nèi)容,fs.writeFileSync來將內(nèi)容寫入文件。注:我們分別定義了兩個接口objJson與InfoResult。

  1. import superagent from "superagent"
  2. import cheerio from "cheerio"
  3. import fs from "fs"
  4. import path from "path"
  5.  
  6. interface objJson { 
  7.   [propName: number]: Info[]; 
  8.  
  9. interface Info { 
  10.   name: string; 
  11.   url: string; 
  12.  
  13. interface InfoResult { 
  14.   time: number; 
  15.   data: Info[]; 
  16.  
  17. class Crawler { 
  18.   private url = "https://www.hanju.run/play/39221-4-0.html"
  19.  
  20.   getJsonInfo(html: string) { 
  21.     const $ = cheerio.load(html); 
  22.     const info: Info[] = []; 
  23.     const scpt: string = String($(".play>script:nth-child(1)").html()); 
  24.     const url = unescape( 
  25.       scpt.split(";")[3].split("(")[1].split(")")[0].replace(/\"/g, "") 
  26.     ); 
  27.     const name: string = String($("title").html()); 
  28.     info.push({ 
  29.       name
  30.       url, 
  31.     }); 
  32.     const result = { 
  33.       time: new Date().getTime(), 
  34.       data: info, 
  35.     }; 
  36.     return result; 
  37.   } 
  38.  
  39.   async getRawHtml() { 
  40.     const result = await superagent.get(this.url); 
  41.     return result.text; 
  42.   } 
  43.  
  44.   getJsonContent(info: InfoResult) { 
  45.     const filePath = path.resolve(__dirname, "../data/url.json"); 
  46.     let fileContent: objJson = {}; 
  47.     if (fs.existsSync(filePath)) { 
  48.       fileContent = JSON.parse(fs.readFileSync(filePath, "utf-8")); 
  49.     } 
  50.     fileContent[info.time] = info.data; 
  51.     fs.writeFileSync(filePath, JSON.stringify(fileContent)); 
  52.   } 
  53.  
  54.   async initSpiderProcess() { 
  55.     const html = await this.getRawHtml(); 
  56.     const info = this.getJsonInfo(html); 
  57.     this.getJsonContent(info); 
  58.   } 
  59.  
  60.   constructor() { 
  61.     this.initSpiderProcess(); 
  62.   } 
  63.  
  64. const crawler = new Crawler(); 

5.運(yùn)行命令

  1. npm run dev-t 

6.查看生成文件的效果

  1.   "1610738046569": [ 
  2.     { 
  3.       "name""《復(fù)仇者聯(lián)盟4:終局之戰(zhàn)》HD1080P中字m3u8在線觀看-韓劇網(wǎng)"
  4.       "url""https://wuxian.xueyou-kuyun.com/20190728/16820_302c7858/index.m3u8" 
  5.     } 
  6.   ], 
  7.   "1610738872042": [ 
  8.     { 
  9.       "name""《鋼鐵俠2》HD高清m3u8在線觀看-韓劇網(wǎng)"
  10.       "url""https://www.yxlmbbs.com:65/20190920/54uIR9hI/index.m3u8" 
  11.     } 
  12.   ], 
  13.   "1610739069969": [ 
  14.     { 
  15.       "name""《鋼鐵俠2》中英特效m3u8在線觀看-韓劇網(wǎng)"
  16.       "url""https://tv.youkutv.cc/2019/11/12/mjkHyHycfh0LyS4r/playlist.m3u8" 
  17.     } 
  18.   ] 

準(zhǔn)結(jié)語

到這里真的結(jié)束了嗎?

不!不!不!

真的沒有結(jié)束。

我們會看到上面一坨代碼,真的很臭~

我們將分別使用組合模式與單例模式將其優(yōu)化。

優(yōu)化一:組合模式

組合模式(Composite Pattern),又叫部分整體模式,是用于把一組相似的對象當(dāng)作一個單一的對象。組合模式依據(jù)樹形結(jié)構(gòu)來組合對象,用來表示部分以及整體層次。這種類型的設(shè)計模式屬于結(jié)構(gòu)型模式,它創(chuàng)建了對象組的樹形結(jié)構(gòu)。

這種模式創(chuàng)建了一個包含自己對象組的類。該類提供了修改相同對象組的方式。

簡言之,就是可以像處理簡單元素一樣來處理復(fù)雜元素。

首先,我們在src文件夾下創(chuàng)建一個combination文件夾,然后在其文件夾下分別在創(chuàng)建兩個文件crawler.ts和urlAnalyzer.ts。

crawler.ts

crawler.ts文件的作用主要是處理獲取頁面內(nèi)容以及存入文件內(nèi)。

  1. import superagent from "superagent"
  2. import fs from "fs"
  3. import path from "path"
  4. import UrlAnalyzer from "./urlAnalyzer.ts"
  5.  
  6. export interface Analyzer { 
  7.   analyze: (html: string, filePath: string) => string; 
  8.  
  9. class Crowller { 
  10.   private filePath = path.resolve(__dirname, "../../data/url.json"); 
  11.  
  12.   async getRawHtml() { 
  13.     const result = await superagent.get(this.url); 
  14.     return result.text; 
  15.   } 
  16.  
  17.   writeFile(content: string) { 
  18.     fs.writeFileSync(this.filePath, content); 
  19.   } 
  20.  
  21.   async initSpiderProcess() { 
  22.     const html = await this.getRawHtml(); 
  23.     const fileContent = this.analyzer.analyze(html, this.filePath); 
  24.     this.writeFile(fileContent); 
  25.   } 
  26.  
  27.   constructor(private analyzer: Analyzer, private url: string) { 
  28.     this.initSpiderProcess(); 
  29.   } 
  30. const url = "https://www.hanju.run/play/39257-1-1.html"
  31.  
  32. const analyzer = new UrlAnalyzer(); 
  33. new Crowller(analyzer, url); 

urlAnalyzer.ts

urlAnalyzer.ts文件的作用主要是處理獲取頁面節(jié)點內(nèi)容的具體邏輯。

  1. import cheerio from "cheerio"
  2. import fs from "fs"
  3. import { Analyzer } from "./crawler.ts"
  4.  
  5. interface objJson { 
  6.   [propName: number]: Info[]; 
  7. interface InfoResult { 
  8.   time: number; 
  9.   data: Info[]; 
  10. interface Info { 
  11.   name: string; 
  12.   url: string; 
  13.  
  14. export default class UrlAnalyzer implements Analyzer { 
  15.   private getJsonInfo(html: string) { 
  16.     const $ = cheerio.load(html); 
  17.     const info: Info[] = []; 
  18.     const scpt: string = String($(".play>script:nth-child(1)").html()); 
  19.     const url = unescape( 
  20.       scpt.split(";")[3].split("(")[1].split(")")[0].replace(/\"/g, "") 
  21.     ); 
  22.     const name: string = String($("title").html()); 
  23.     info.push({ 
  24.       name
  25.       url, 
  26.     }); 
  27.     const result = { 
  28.       time: new Date().getTime(), 
  29.       data: info, 
  30.     }; 
  31.     return result; 
  32.   } 
  33.  
  34.   private getJsonContent(info: InfoResult, filePath: string) { 
  35.     let fileContent: objJson = {}; 
  36.     if (fs.existsSync(filePath)) { 
  37.       fileContent = JSON.parse(fs.readFileSync(filePath, "utf-8")); 
  38.     } 
  39.     fileContent[info.time] = info.data; 
  40.     return fileContent; 
  41.   } 
  42.  
  43.   public analyze(html: string, filePath: string) { 
  44.     const info = this.getJsonInfo(html); 
  45.     console.log(info); 
  46.     const fileContent = this.getJsonContent(info, filePath); 
  47.     return JSON.stringify(fileContent); 
  48.   } 

可以在package.json文件中定義快捷啟動命令。

  1. "scripts": { 
  2.   "dev-c""ts-node ./src/combination/crawler.ts" 
  3. }, 

然后使用npm run dev-c啟動即可。

優(yōu)化二:單例模式

**單例模式(Singleton Pattern)**是 Java 中最簡單的設(shè)計模式之一。這種類型的設(shè)計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。

這種模式涉及到一個單一的類,該類負(fù)責(zé)創(chuàng)建自己的對象,同時確保只有單個對象被創(chuàng)建。這個類提供了一種訪問其唯一的對象的方式,可以直接訪問,不需要實例化該類的對象。

應(yīng)用實例:

  • 1、一個班級只有一個班主任。
  • 2、Windows 是多進(jìn)程多線程的,在操作一個文件的時候,就不可避免地出現(xiàn)多個進(jìn)程或線程同時操作一個文件的現(xiàn)象,所以所有文件的處理必須通過唯一的實例來進(jìn)行。
  • 3、一些設(shè)備管理器常常設(shè)計為單例模式,比如一個電腦有兩臺打印機(jī),在輸出的時候就要處理不能兩臺打印機(jī)打印同一個文件。

同樣,我們在src文件夾下創(chuàng)建一個singleton文件夾,然后在其文件夾下分別在創(chuàng)建兩個文件crawler1.ts和urlAnalyzer.ts。

這兩個文件的作用與上文同樣,只不過代碼書寫不一樣。

crawler1.ts

  1. import superagent from "superagent"
  2. import fs from "fs"
  3. import path from "path"
  4. import UrlAnalyzer from "./urlAnalyzer.ts"
  5.  
  6. export interface Analyzer { 
  7.   analyze: (html: string, filePath: string) => string; 
  8.  
  9. class Crowller { 
  10.   private filePath = path.resolve(__dirname, "../../data/url.json"); 
  11.  
  12.   async getRawHtml() { 
  13.     const result = await superagent.get(this.url); 
  14.     return result.text; 
  15.   } 
  16.  
  17.   private writeFile(content: string) { 
  18.     fs.writeFileSync(this.filePath, content); 
  19.   } 
  20.  
  21.   private async initSpiderProcess() { 
  22.     const html = await this.getRawHtml(); 
  23.     const fileContent = this.analyzer.analyze(html, this.filePath); 
  24.     this.writeFile(JSON.stringify(fileContent)); 
  25.   } 
  26.  
  27.   constructor(private analyzer: Analyzer, private url: string) { 
  28.     this.initSpiderProcess(); 
  29.   } 
  30. const url = "https://www.hanju.run/play/39257-1-1.html"
  31.  
  32. const analyzer = UrlAnalyzer.getInstance(); 
  33. new Crowller(analyzer, url); 

urlAnalyzer.ts

  1. import cheerio from "cheerio"
  2. import fs from "fs"
  3. import { Analyzer } from "./crawler1.ts"
  4.  
  5. interface objJson { 
  6.   [propName: number]: Info[]; 
  7. interface InfoResult { 
  8.   time: number; 
  9.   data: Info[]; 
  10. interface Info { 
  11.   name: string; 
  12.   url: string; 
  13. export default class UrlAnalyzer implements Analyzer { 
  14.   static instance: UrlAnalyzer; 
  15.  
  16.   static getInstance() { 
  17.     if (!UrlAnalyzer.instance) { 
  18.       UrlAnalyzer.instance = new UrlAnalyzer(); 
  19.     } 
  20.     return UrlAnalyzer.instance; 
  21.   } 
  22.  
  23.   private getJsonInfo(html: string) { 
  24.     const $ = cheerio.load(html); 
  25.     const info: Info[] = []; 
  26.     const scpt: string = String($(".play>script:nth-child(1)").html()); 
  27.     const url = unescape( 
  28.       scpt.split(";")[3].split("(")[1].split(")")[0].replace(/\"/g, "") 
  29.     ); 
  30.     const name: string = String($("title").html()); 
  31.     info.push({ 
  32.       name
  33.       url, 
  34.     }); 
  35.     const result = { 
  36.       time: new Date().getTime(), 
  37.       data: info, 
  38.     }; 
  39.     return result; 
  40.   } 
  41.  
  42.   private getJsonContent(info: InfoResult, filePath: string) { 
  43.     let fileContent: objJson = {}; 
  44.     if (fs.existsSync(filePath)) { 
  45.       fileContent = JSON.parse(fs.readFileSync(filePath, "utf-8")); 
  46.     } 
  47.     fileContent[info.time] = info.data; 
  48.     return fileContent; 
  49.   } 
  50.  
  51.   public analyze(html: string, filePath: string) { 
  52.      const info = this.getJsonInfo(html); 
  53.      console.log(info); 
  54.     const fileContent = this.getJsonContent(info, filePath); 
  55.     return JSON.stringify(fileContent); 
  56.   } 
  57.  
  58.   private constructor() {} 

可以在package.json文件中定義快捷啟動命令。

  1. "scripts": { 
  2.     "dev-s""ts-node ./src/singleton/crawler1.ts"
  3.  }, 

然后使用npm run dev-s啟動即可。

結(jié)語

這下真的結(jié)束了,謝謝閱讀。希望可以幫到你。

完整源碼地址:

https://github.com/maomincoding/TsCrawler

 

責(zé)任編輯:姜華 來源: 前端歷劫之路
相關(guān)推薦

2022-01-27 13:02:46

前端爬蟲工具

2021-02-20 07:02:24

Vue.js組件開發(fā)技術(shù)

2021-09-26 05:00:11

Vscode插件

2020-12-29 05:26:27

視頻播放器Vuevideo

2021-03-30 07:11:22

Vue3parcel-vue-工具

2023-03-06 11:35:55

經(jīng)營分析體系

2023-05-10 10:45:06

開源工具庫項目

2018-01-16 12:31:33

Python爬蟲數(shù)據(jù)

2022-03-15 11:51:00

決策分析模型

2019-07-31 10:18:17

Web 開發(fā)Python

2022-06-13 07:02:02

Zadig平臺自動化

2017-05-27 09:23:10

IOS框架APP框架代碼

2022-05-26 17:40:51

Linux開源

2011-08-31 10:18:09

Template St

2022-04-07 10:02:58

前端檢測工具

2016-11-28 16:23:23

戴爾

2023-11-15 08:14:35

2022-05-09 08:35:43

面試產(chǎn)品互聯(lián)網(wǎng)

2022-08-25 14:41:51

集群搭建

2022-10-09 10:11:30

Python爬蟲神器
點贊
收藏

51CTO技術(shù)棧公眾號

日本一极黄色片| 国产精品无码专区在线观看| 亚洲无在线观看| 超碰caoporn久久| 国产jizzjizz一区二区| 性欧美亚洲xxxx乳在线观看| 欧洲女同同性吃奶| 国产成人免费视频网站视频社区 | 亚洲一区二区三区精品在线观看 | a在线观看免费| 激情综合久久| 在线观看国产成人av片| 国产精品一级无码| 亚洲天堂一区二区| 一区二区在线观看不卡| 欧洲亚洲一区二区三区四区五区| 99国产精品99| 狂野欧美一区| 欧美极品少妇xxxxⅹ喷水| 中国毛片在线观看| 99ri日韩精品视频| 欧美群妇大交群中文字幕| 18禁免费观看网站| caoporm免费视频在线| 久久精品水蜜桃av综合天堂| 色系网站成人免费| 视频在线一区二区| 国产精品久久不卡| 亚洲精品18| 欧美日韩色一区| 青草青青在线视频| 日本视频在线播放| 91色在线porny| 亚洲r级在线观看| 久久久精品视频网站| 亚洲电影在线一区二区三区| 亚洲欧美一区二区三区四区| 性一交一黄一片| www.九色在线| 国产精品高潮久久久久无| av在线不卡一区| 成人黄色三级视频| 国产亚洲精品自拍| 精品国产一区二区三区久久狼黑人| japanese在线观看| 久久久亚洲av波多野结衣| 免费人成在线观看网站| 国产99一区视频免费| 国产精品入口免费视| 国内免费精品视频| 欧美成人综合| 久久偷看各类女兵18女厕嘘嘘| 人妻体内射精一区二区| 亚洲黑人在线| 欧美精品v日韩精品v韩国精品v| 波多野结衣作品集| 黄色免费在线观看| 中文字幕制服丝袜一区二区三区| 久久综合精品一区| 天天射天天操天天干| 国产激情视频一区二区三区欧美| 国产精品人人做人人爽| 狠狠狠狠狠狠狠| 男人的天堂成人在线| 久久免费少妇高潮久久精品99| 东方av正在进入| 我不卡影院28| 久久综合国产精品台湾中文娱乐网| 日本爱爱爱视频| 欧美视频免费| 中文字幕日韩高清| 亚洲AV无码国产成人久久| 亚洲伊人春色| 亚洲丝袜在线视频| 亚洲第一在线视频| 日韩在线观看a| 黄视频在线观看网站| 亚洲欧美日韩系列| 久久亚洲a v| www在线看| 欧美日韩国产区| 日韩网站在线免费观看| 三级中文字幕在线观看| 一区二区在线观看视频在线观看| 国产爆乳无码一区二区麻豆| h片在线观看下载| 精品久久久久久久久久久久久| 可以在线看的av网站| 在线看片福利| 欧美午夜影院一区| 天堂av2020| 欧美专区一区| 亚洲欧美在线播放| 黄色裸体一级片| 午夜日韩av| 国产精品国产三级国产普通话三级 | 91人人爽人人爽人人精88v| 一二三四区视频| 国产精品伊人色| 国内精品久久国产| 大乳在线免费观看| 亚洲欧美日韩国产另类专区| 日本一本中文字幕| 欧洲av不卡| 欧美一区二区网站| 女尊高h男高潮呻吟| 日韩成人免费| 久久久久久久999精品视频| 日韩欧美中文字幕一区二区| 日本一不卡视频| 99在线视频播放| 91网站免费入口| 国产又爽又黄网站亚洲视频123| 国产宾馆实践打屁股91| 99一区二区三区| 黄色美女网站在线观看| 亚洲日穴在线视频| 99热在线这里只有精品| 欧美综合影院| 日韩精品中文字幕久久臀| 久久久久久久久久97| 国产欧美亚洲一区| 成人黄色大片在线免费观看| 蜜桃久久一区二区三区| 国产精品免费网站在线观看| 欧美人与动牲交xxxxbbbb| 韩国成人在线| 亚洲黄色片网站| 精品人妻伦九区久久aaa片| 一区二区国产在线观看| 91精品视频观看| 美女毛片在线看| 亚洲视频你懂的| 丰满少妇在线观看| 国产又粗又猛又爽又黄av| 综合久久亚洲| 国产精品久久久久久久久久尿| 亚洲产国偷v产偷v自拍涩爱| 中文字幕日韩一区| 国产av无码专区亚洲精品| 中文无码日韩欧| 久久亚洲精品网站| 波多野结衣一区二区三区四区| 国产乱对白刺激视频不卡| 欧美日韩最好看的视频| 18视频在线观看网站| 欧美日韩精品三区| 一色道久久88加勒比一| 在线看片欧美| 91成人在线看| 91中文在线| 欧美一区三区四区| 在线观看天堂av| 日韩福利电影在线| 亚洲不卡中文字幕| 久久久黄色大片| 国产成人福利夜色影视| 日韩午夜激情免费电影| 永久免费看片视频教学| 久久精品国产精品亚洲综合| 日本一区二区高清视频| 亚洲优女在线| 亚洲美女在线看| 午夜婷婷在线观看| 97精品视频在线观看自产线路二| 亚洲色欲久久久综合网东京热| 国产精品久久免费视频| 中文字幕亚洲一区在线观看 | 国产精品免费看| 久久久久欧美| 这里有精品可以观看| 亚洲精品天天看| 国产精品久久久久久久久久久久久久久久久| 成人av在线一区二区三区| 日韩一级片免费视频| 国产毛片精品| 99riav久久精品riav| 国产成人精品最新| 韩国三级在线观看久| 色成人在线视频| 国产免费嫩草影院| 日本欧美久久久久免费播放网| 日本视频一区二区不卡| 国产精品久久久久久av公交车| 欧美激情精品久久久久久免费印度| 亚洲av无码国产精品久久不卡| 亚洲自拍与偷拍| 自拍视频一区二区| 老牛国产精品一区的观看方式| 日本一区二区在线| 国产剧情一区二区在线观看| 欧美精品aaa| 国产最新视频在线| 欧美欧美午夜aⅴ在线观看| 日本免费网站视频| 成人免费av网站| aa在线免费观看| 91久久夜色精品国产按摩| 97se亚洲综合| 久久午夜免费视频| 伊人久久大香线蕉av超碰| 欧美高清不卡在线| 你懂的在线网址| 欧美一区二区视频观看视频| 国产真实乱人偷精品视频| 91网上在线视频| 色91精品久久久久久久久| 亚洲国产美女| 亚洲国产精品视频一区| 91精品国产自产精品男人的天堂| 日本高清不卡的在线| 日本亚洲精品| 精品国产乱码久久久久久夜甘婷婷| 亚洲精品一区二三区| 亚洲在线中文字幕| 中文字幕免费高清| 国产不卡免费视频| 亚洲老女人av| 亚洲黄网站黄| 伊人情人网综合| 先锋影音国产精品| 91久久夜色精品国产网站| 忘忧草在线影院两性视频| 久久色精品视频| 男人的天堂在线免费视频| 欧美成a人片在线观看久| 精品国产一区二区三区不卡| 亚洲av综合一区| 亚洲在线视频免费观看| 永久免费观看片现看| 不卡电影免费在线播放一区| av中文字幕网址| 天堂在线亚洲视频| 日本免费a视频| 国产精品99视频| 日本免费高清不卡| 一本久久青青| 国模精品一区二区三区| 久久九九精品视频| 91精品国产综合久久香蕉922| 蜜桃视频动漫在线播放| 日韩在线观看免费全| 九色网友自拍视频手机在线| 国产麻豆久久| 欧美精品videofree1080p| 青青青青在线| 国产亚洲欧洲高清一区| 香港一级纯黄大片| 精品av久久707| www.成人免费视频| 91精品国产综合久久久蜜臀粉嫩| 嫩草影院一区二区三区| 色综合久久中文综合久久牛| 国产一级片免费| 亚洲制服丝袜一区| 青青草国产在线观看| 亚洲免费在线看| 精品国产乱码久久久久久鸭王1| 1区2区3区精品视频| 希岛爱理中文字幕| 亚洲精品一二三区| a在线视频播放观看免费观看| 成人欧美一区二区三区| 疯狂撞击丝袜人妻| 亚洲精品视频免费看| 青青草成人免费| 亚洲国产精品一区二区久久| 精品无码av在线| 亚洲成av人片在线观看| 欧美一二三区视频| 欧美日韩在线免费观看| 国产www在线| 色欧美日韩亚洲| 日本成人一级片| 欧美日韩一区高清| 在线观看黄色国产| 在线成人av网站| 国产xxxx在线观看| 精品久久久久一区二区国产| 日韩中文字幕免费在线观看| 日韩免费一区二区三区在线播放| 精品国产无码一区二区| 精品国产91久久久久久久妲己| 天堂网在线资源| 亚洲日韩欧美视频| 日本韩国在线视频爽| 欧美多人乱p欧美4p久久| 成人av影院在线观看| 欧美与欧洲交xxxx免费观看| 国产精品suv一区二区69| 亚洲高清在线| 久久观看最新视频| 国产亚洲毛片在线| 91女神在线观看| 成人av免费在线播放| 妺妺窝人体色WWW精品| 日韩一区中文字幕| 在线观看亚洲天堂| 欧美午夜理伦三级在线观看| 国产女人爽到高潮a毛片| 精品久久久久久久久久久久久久久 | 国产精品一区二区av交换| 亚洲图片小说在线| 亚洲午夜极品| 中文字幕第36页| www.在线欧美| 国产亚洲精品久久久久久豆腐| 亚洲愉拍自拍另类高清精品| 国产一级一级国产| 日韩一区二区三| 国产女人在线视频| 欧美大码xxxx| 黄色精品视频| 国内视频一区| 日韩精品中文字幕第1页| 黄色一级视频片| 极品少妇xxxx精品少妇| 捆绑裸体绳奴bdsm亚洲| 亚洲欧洲精品天堂一级| 一级片中文字幕| 偷拍亚洲精品| 92国产精品视频| 西野翔中文久久精品字幕| 免费国产成人看片在线| 久久性天堂网| 亚洲成人av免费观看| 中文文精品字幕一区二区| 国产污污视频在线观看 | 国产精品国产av| 亚洲视频在线免费观看| 国产夫妻在线| 91嫩草在线| 久久婷婷蜜乳一本欲蜜臀| 无码人妻h动漫| 成人午夜在线视频| 欧美视频www| 666欧美在线视频| 成人在线免费观看| 91大神福利视频在线| av成人资源| 国产黄色激情视频| 经典三级在线一区| 永久免费看片直接| 欧美日韩在线播放一区| 欧美日韩国产综合视频| 97精品伊人久久久大香线蕉| 亚洲日本va午夜在线电影| 伊人天天久久大香线蕉av色| 天堂影院一区二区| 亚洲人成人无码网www国产| 亚洲午夜羞羞片| 日本人妻丰满熟妇久久久久久| 欧美精品午夜视频| 国产一区二区三区免费观看在线| 日本在线成人一区二区| 久久男女视频| 中文人妻一区二区三区| 天天做天天摸天天爽国产一区| 黄色片一区二区三区| 久久人人爽亚洲精品天堂| 亚洲综合色在线观看| 成人免费高清视频| 久久精品欧美一区二区| 亚洲成人xxx| 女海盗2成人h版中文字幕| 国产综合色一区二区三区| 你懂的国产精品永久在线| 日本免费色视频| 日韩美女精品在线| 精品黑人一区二区三区在线观看| 久久久国产在线视频| 国产一区2区在线观看| 大荫蒂性生交片| eeuss影院一区二区三区| 日韩三级视频在线| 亚洲第一av网站| 成人做爰视频www网站小优视频| 午夜老司机精品| 美女视频黄a大片欧美| 免费黄色激情视频| 欧美性感一类影片在线播放| 一区二区三区视频网站| 亚洲精品日韩激情在线电影| 你懂的网址国产 欧美| 免费看黄色片的网站| 欧美性猛交xxxx黑人猛交| 国产香蕉视频在线看| 国产精品偷伦免费视频观看的| 国产国产精品| 无码人妻aⅴ一区二区三区玉蒲团| 亚洲综合久久久| 青青草手机在线| 国产中文字幕精品| 国产福利精品一区二区三区| 亚洲女同ⅹxx女同tv| 欧美自拍第一页| 国产精品美女主播在线观看纯欲| 久久精品免费一区二区三区| 久草视频福利在线| 91福利视频久久久久|