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

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

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

前言

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

??https://www.hanju.run/ ??

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

第一步

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

  1. 我們需要創(chuàng)建一個項目文件夾
  2. 鍵入命令,初始化項目
npm init -y
  1. 局部安裝typescript
npm install typescript -D
  1. 接著鍵入命令,生成ts配置文件
tsc --init
  1. 局部安裝ts-node,用于命令行輸出命令
npm install -D ts-node
  1. 在項目文件夾中創(chuàng)建一個src文件夾

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

  1. 在package.json文件中修改快捷啟動命令
"scripts": {
"dev-t": "ts-node ./src/crawler.ts"
}

第二步

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

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

import superagent from "superagent";
import cheerio from "cheerio";
import fs from "fs";
import path from "path";

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

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

npm install superagent

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

npm install cheerio

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

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

npm install -D @types/superagent
npm install -D @types/cheerio

接下來,我們就認認真真看源碼了。

  1. 安裝完兩個依賴后,我們需要創(chuàng)建一個Crawler類,并且將其實例化。
import superagent from "superagent";
import cheerio from "cheerio";
import fs from "fs";
import path from "path";
class Crawler {
constructor() {
}
}
const crawler = new Crawler();
  1. 我們確定下要爬取的網(wǎng)址,然后賦給一個私有變量。最后我們會封裝一個getRawHtml方法來獲取對應網(wǎng)址的內(nèi)容。

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

import superagent from "superagent";
import cheerio from "cheerio";
import fs from "fs";
import path from "path";
class Crawler {
private url = "https://www.hanju.run/play/39221-4-0.html";
async getRawHtml() {
const result = await superagent.get(this.url);
return result.text;
}
async initSpiderProcess() {
const html = await this.getRawHtml();
}
constructor() {
this.initSpiderProcess();
}
}
const crawler = new Crawler();
  1. 使用cheerio依賴內(nèi)置的方法獲取對應的節(jié)點內(nèi)容。

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

import superagent from "superagent";
import cheerio from "cheerio";
import fs from "fs";
import path from "path";
interface Info {
name: string;
url: string;
}
class Crawler {
private url = "https://www.hanju.run/play/39221-4-0.html";
getJsonInfo(html: string) {
const $ = cheerio.load(html);
const info: Info[] = [];
const scpt: string = String($(".play>script:nth-child(1)").html());
const url = unescape(
scpt.split(";")[3].split("(")[1].split(")")[0].replace(/\"/g, "")
);
const name: string = String($("title").html());
info.push({
name,
url,
});
const result = {
time: new Date().getTime(),
data: info,
};
return result;
}
async getRawHtml() {
const result = await superagent.get(this.url);
return result.text;
}
async initSpiderProcess() {
const html = await this.getRawHtml();
const info = this.getJsonInfo(html);
}
constructor() {
this.initSpiderProcess();
}
}
const crawler = new Crawler();
  1. 我們首先要在項目根目錄下創(chuàng)建一個data文件夾。然后我們將獲取的內(nèi)容我們存入文件夾內(nèi)的url.json文件(文件自動生成)中。

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

import superagent from "superagent";
import cheerio from "cheerio";
import fs from "fs";
import path from "path";
interface objJson {
[propName: number]: Info[];
}
interface Info {
name: string;
url: string;
}
interface InfoResult {
time: number;
data: Info[];
}
class Crawler {
private url = "https://www.hanju.run/play/39221-4-0.html";
getJsonInfo(html: string) {
const $ = cheerio.load(html);
const info: Info[] = [];
const scpt: string = String($(".play>script:nth-child(1)").html());
const url = unescape(
scpt.split(";")[3].split("(")[1].split(")")[0].replace(/\"/g, "")
);
const name: string = String($("title").html());
info.push({
name,
url,
});
const result = {
time: new Date().getTime(),
data: info,
};
return result;
}
async getRawHtml() {
const result = await superagent.get(this.url);
return result.text;
}
getJsonContent(info: InfoResult) {
const filePath = path.resolve(__dirname, "../data/url.json");
let fileContent: objJson = {};
if (fs.existsSync(filePath)) {
fileContent = JSON.parse(fs.readFileSync(filePath, "utf-8"));
}
fileContent[info.time] = info.data;
fs.writeFileSync(filePath, JSON.stringify(fileContent));
}
async initSpiderProcess() {
const html = await this.getRawHtml();
const info = this.getJsonInfo(html);
this.getJsonContent(info);
}
constructor() {
this.initSpiderProcess();
}
}
const crawler = new Crawler();
  1. 運行命令   
npm run dev-t
  1. 查看生成文件的效果  
{
"1610738046569": [
{
"name": "《復仇者聯(lián)盟4:終局之戰(zhàn)》HD1080P中字m3u8在線觀看-韓劇網(wǎng)",

"url": "https://wuxian.xueyou-kuyun.com/20190728/16820_302c7858/index.m3u8"
}
],
"1610738872042": [
{
"name": "《鋼鐵俠2》HD高清m3u8在線觀看-韓劇網(wǎng)",
"url": "https://www.yxlmbbs.com:65/20190920/54uIR9hI/index.m3u8"
}
],
"1610739069969": [
{
"name": "《鋼鐵俠2》中英特效m3u8在線觀看-韓劇網(wǎng)",

"url": "https://tv.youkutv.cc/2019/11/12/mjkHyHycfh0LyS4r/playlist.m3u8"
}
]
}

準結語

到這里真的結束了嗎?

不!

不!

不!

真的沒有結束。

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

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

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

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

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

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

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

crawler.ts

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

import superagent from "superagent";
import fs from "fs";
import path from "path";
import UrlAnalyzer from "./urlAnalyzer.ts";
export interface Analyzer {
analyze: (html: string, filePath: string) => string;
}
class Crowller {
private filePath = path.resolve(__dirname, "../../data/url.json");
async getRawHtml() {
const result = await superagent.get(this.url);
return result.text;
}
writeFile(content: string) {
fs.writeFileSync(this.filePath, content);
}
async initSpiderProcess() {
const html = await this.getRawHtml();
const fileContent = this.analyzer.analyze(html, this.filePath);
this.writeFile(fileContent);
}
constructor(private analyzer: Analyzer, private url: string) {
this.initSpiderProcess();
}
}
const url = "https://www.hanju.run/play/39257-1-1.html";
const analyzer = new UrlAnalyzer();
new Crowller(analyzer, url);

urlAnalyzer.ts

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

import cheerio from "cheerio";
import fs from "fs";import { Analyzer } from "./crawler.ts";
interface objJson {
[propName: number]: Info[];
}
interface InfoResult {
time: number;
data: Info[];
}
interface Info {
name: string;
url: string;
}
export default class UrlAnalyzer implements Analyzer {
private getJsonInfo(html: string) {
const $ = cheerio.load(html);
const info: Info[] = [];
const scpt: string = String($(".play>script:nth-child(1)").html());
const url = unescape(
scpt.split(";")[3].split("(")[1].split(")")[0].replace(/\"/g, "")
);
const name: string = String($("title").html());
info.push({
name,
url,
});
const result = {
time: new Date().getTime(),
data: info,
};
return result;
}
private getJsonContent(info: InfoResult, filePath: string) {
let fileContent: objJson = {};
if (fs.existsSync(filePath)) {
fileContent = JSON.parse(fs.readFileSync(filePath, "utf-8"));
}
fileContent[info.time] = info.data;
return fileContent;
}
public analyze(html: string, filePath: string) {
const info = this.getJsonInfo(html);
console.log(info);
const fileContent = this.getJsonContent(info, filePath);
return JSON.stringify(fileContent);
}
}

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

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

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

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

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

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

應用實例:

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

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

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

crawler1.ts

import superagent from "superagent";
import fs from "fs";
import path from "path";
import UrlAnalyzer from "./urlAnalyzer.ts";
export interface Analyzer {
analyze: (html: string, filePath: string) => string;
}
class Crowller {
private filePath = path.resolve(__dirname, "../../data/url.json");
async getRawHtml() {
const result = await superagent.get(this.url);
return result.text;
}
private writeFile(content: string) {
fs.writeFileSync(this.filePath, content);
}
private async initSpiderProcess() {
const html = await this.getRawHtml();
const fileContent = this.analyzer.analyze(html, this.filePath);
this.writeFile(JSON.stringify(fileContent));
}
constructor(private analyzer: Analyzer, private url: string) {
this.initSpiderProcess();
}
}
const url = "https://www.hanju.run/play/39257-1-1.html";
const analyzer = UrlAnalyzer.getInstance();
new Crowller(analyzer, url);

urlAnalyzer.ts

import cheerio from "cheerio";
import fs from "fs";
import { Analyzer } from "./crawler1.ts";
interface objJson {
[propName: number]: Info[];
}
interface InfoResult {
time: number;
data: Info[];
}
interface Info {
name: string;
url: string;
}
export default class UrlAnalyzer implements Analyzer {
static instance: UrlAnalyzer;
static getInstance() {
if (!UrlAnalyzer.instance) {
UrlAnalyzer.instance = new UrlAnalyzer();
}
return UrlAnalyzer.instance;
}
private getJsonInfo(html: string) {
const $ = cheerio.load(html);
const info: Info[] = [];
const scpt: string = String($(".play>script:nth-child(1)").html());
const url = unescape(
scpt.split(";")[3].split("(")[1].split(")")[0].replace(/\"/g, "")
);
const name: string = String($("title").html());
info.push({
name,
url,
});
const result = {
time: new Date().getTime(),
data: info,
};
return result;
}
private getJsonContent(info: InfoResult, filePath: string) {
let fileContent: objJson = {};
if (fs.existsSync(filePath)) {
fileContent = JSON.parse(fs.readFileSync(filePath, "utf-8"));
}
fileContent[info.time] = info.data;
return fileContent;
}
public analyze(html: string, filePath: string) {
const info = this.getJsonInfo(html);
console.log(info);
const fileContent = this.getJsonContent(info, filePath);
return JSON.stringify(fileContent);
}
private constructor() {}
}

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

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

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

結語

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

完整源碼地址:

??https://github.com/maomincoding/TsCrawler ??

責任編輯:龐桂玉 來源: 前端大全
相關推薦

2021-01-27 07:24:38

TypeScript工具Java

2021-02-20 07:02:24

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

2021-09-26 05:00:11

Vscode插件

2020-12-29 05:26:27

視頻播放器Vuevideo

2022-02-16 09:01:33

編程工具Node-RED編輯器

2021-04-18 20:46:30

工具代碼編程

2021-03-30 07:11:22

Vue3parcel-vue-工具

2023-03-06 11:35:55

經(jīng)營分析體系

2023-05-10 10:45:06

開源工具庫項目

2022-03-15 11:51:00

決策分析模型

2018-01-16 12:31:33

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

2019-07-31 10:18:17

Web 開發(fā)Python

2017-05-27 09:23:10

IOS框架APP框架代碼

2022-06-13 07:02:02

Zadig平臺自動化

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

戴爾

2022-10-09 10:11:30

Python爬蟲神器

2022-05-09 08:35:43

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

51CTO技術棧公眾號

免费观看久久久久| 中文字幕制服诱惑| 亚洲丝袜啪啪| 欧美三级一区二区| 一区二区三区不卡在线| 国产高清精品软件丝瓜软件| 在线日韩av| 国产亚洲精品一区二555| 久久久精品麻豆| a天堂中文在线官网在线| 成人中文字幕合集| 国产99在线|中文| 亚洲二区在线播放| 欧美亚视频在线中文字幕免费| 一区二区三区欧美在线观看| 久久精品国产精品国产精品污| 依依成人在线视频| 国产精品毛片在线| 久久久999精品免费| 成人免费无码大片a毛片| 日韩午夜视频在线| 欧美视频在线免费看| 伊人婷婷久久| 精品国产va久久久久久久| 欧美日韩 国产精品| 日韩成人xxxx| 超碰人人cao| 亚洲成av在线| 欧美日韩国产麻豆| 精品国产一区二区三区在线| 免费在线观看一级毛片| 成人亚洲一区二区一| 国产中文字幕亚洲| www.欧美色| 亚洲视频大全| 欧美黑人视频一区| 国产中文av在线| 国产欧美一区二区精品久久久| 亚洲а∨天堂久久精品喷水 | 国产精品久久麻豆| 久久久久久免费毛片精品| 国产一区二区不卡视频| 99这里有精品视频| 久久国产精品99久久久久久老狼| 日韩美女毛茸茸| 日韩欧美视频在线免费观看| 欧美在线资源| 久久亚洲精品一区二区| 亚洲一级二级片| 久久精品国产99久久| 亚洲欧洲在线播放| 欧美精品黑人猛交高潮| 精品久久ai| 亚洲а∨天堂久久精品9966| 亚洲一区和二区| 91蝌蚪精品视频| 日韩一区二区三区视频在线| 男生和女生一起差差差视频| 国产精品一区二区三区av | 国产精品入口麻豆原神| 亚洲高清123| aiai在线| 最新国产の精品合集bt伙计| 国产a级片免费看| 久久久久久久久免费视频| 成人欧美一区二区三区1314| 做爰高潮hd色即是空| 免费av毛片在线看| 亚洲精品福利视频网站| 国产精品视频二| 国产天堂在线播放视频| 欧美日韩国产综合视频在线观看中文 | 国内精品一区二区三区| 91看片在线播放| 亚洲综合精品| 国产精品扒开腿爽爽爽视频| 波多野结衣一区二区三区在线 | 欧美电影免费观看高清| 日日噜噜噜夜夜爽亚洲精品| 三级黄色免费观看| 欧美/亚洲一区| 国产做受高潮69| 九九热在线免费观看| 日韩精品亚洲专区| 国产美女91呻吟求| 性做久久久久久久久久| 99这里只有久久精品视频| 免费成人深夜夜行视频| av在线播放免费| 亚洲综合区在线| 黄色片久久久久| 四虎国产精品免费久久5151| 欧美成人精品1314www| 亚洲av无码一区二区二三区| 日韩欧美网站| 久久久这里只有精品视频| 国产成人一级片| 久久99久久久久| 国产精品日本一区二区 | 91丨porny丨首页| 亚洲一区二区三区在线观看视频| 最新国产在线拍揄自揄视频| 大桥未久av一区二区三区| 99热这里只有精品在线播放| 98视频精品全部国产| 尤物99国产成人精品视频| 一级黄色录像视频| 日韩av一区二| 国产精品推荐精品| 午夜视频在线免费观看| 午夜成人免费电影| 日本一二三四区视频| 一本久久青青| 久久久久久久久久久久av| 中文字幕人成人乱码亚洲电影| 成人一区二区三区中文字幕| 天天久久人人| 色网在线免费观看| 日韩精品一区二区三区中文精品| 中文字幕一二三四区| 欧美福利影院| 国产又爽又黄的激情精品视频| 日本免费不卡视频| 亚洲日本一区二区三区| 日本在线视频www| 国产精品巨作av| 久久久91精品| 亚洲影视一区二区| 久久久久久亚洲综合| 欧美精品久久久久久久久久久| 色8久久久久| 国产一区二区三区在线播放免费观看| 日本熟妇一区二区| 国产精品1区2区| 日韩中文一区| 日韩电影免费观| 亚洲精品99久久久久中文字幕| 91杏吧porn蝌蚪| 精品一区二区三区免费观看| 亚洲精品永久www嫩草| 超碰一区二区| 日韩电影视频免费| 国产网友自拍视频| 国产成人精品网址| 色婷婷777777仙踪林| 国产一区高清| 中文字幕v亚洲ⅴv天堂| 中文字幕在线观看视频免费| 91麻豆精品在线观看| 欧美 日韩 国产在线观看| 91麻豆精品国产91久久久久推荐资源| 久久国产精品偷| 国产福利免费视频| 亚洲欧美另类小说视频| mm131亚洲精品| 91九色精品国产一区二区| 国产一区红桃视频| fc2ppv国产精品久久| 日韩一卡二卡三卡四卡| 久草免费新视频| 风间由美性色一区二区三区| 成人免费在线网| 成人资源在线播放| 午夜精品在线视频| 香蕉视频网站在线| 色婷婷综合久久久久中文一区二区 | 欧美日韩午夜爽爽| 视频欧美一区| 高清欧美性猛交xxxx| 天天操天天操天天| 色综合久久久久网| 国产一二三四区在线| 麻豆精品一区二区| 一区二区三区日韩视频| 一区二区网站| 538国产精品视频一区二区| 四虎精品成人影院观看地址| 色av一区二区| 女人18毛片毛片毛片毛片区二| 国产制服丝袜一区| 日韩精品在线中文字幕| 免费av一区二区三区四区| 国产精品网红直播| 手机在线免费看av| 亚洲精品一区av在线播放| 中文字幕免费在线看| 一区二区三区精品视频在线| 国产又黄又粗又猛又爽的视频 | 四虎成人在线播放| 亚洲国产影院| 翔田千里亚洲一二三区| 欧美影院在线| 国产成人一区二区三区| 日本中文字幕在线2020| 精品99一区二区| 天天干天天操天天爱| 中文字幕在线一区免费| 日本少妇xxxx| 麻豆视频观看网址久久| 久久久久久免费看| 日韩视频在线观看| 精品毛片久久久久久| 日韩专区视频| 欧美在线免费视频| 成码无人av片在线观看网站| 国产视频综合在线| 国产高清免费在线观看| 日本韩国欧美三级| 久久在线视频精品| 国产精品久久午夜| 日韩av在线看免费观看| 国产精品白丝av| 9久久婷婷国产综合精品性色| 国产综合精品| 波多野结衣激情| 欧美日韩xxxx| 国产在线精品一区二区三区| 日韩黄色三级| 国产成人一区二区| 99色在线观看| 久久91精品国产| 青青影院在线观看| 亚洲天堂影视av| 手机在线精品视频| 日韩午夜精品电影| 亚洲网站免费观看| 在线精品视频免费观看| 亚洲免费黄色网址| 亚洲v中文字幕| av激情在线观看| 中文字幕不卡的av| 国产中年熟女高潮大集合| 成人性生交大片免费看中文网站| 天天干天天av| 日韩成人免费看| aa免费在线观看| 中文精品在线| 五十路熟女丰满大屁股| 欧美视频久久| 成人一区二区av| 一区二区三区在线电影| 中文字幕人成一区| 日本不卡免费一区| 亚洲精品在线视频观看| 国产一区二区三区天码| 日本不卡二区| 国产乱码精品一区二区亚洲| 美女被啪啪一区二区| 免费萌白酱国产一区二区三区| 99在线影院| 2020最新国产精品| 国产区二精品视| 精品欧美午夜寂寞影院| 国内一区二区三区在线视频| 久久porn| 欧美国产一区二区在线| 图片婷婷一区| 欧美一区二区三区在线免费观看| 秋霞蜜臀av久久电影网免费| 看高清中日韩色视频| 九九在线精品| 天天综合色天天综合色hd| 日韩精品诱惑一区?区三区| 亚洲国产午夜伦理片大全在线观看网站 | 日韩影院精彩在线| 91极品视频在线观看| 久久成人麻豆午夜电影| 黑人性生活视频| 成人黄色av电影| 国产黄色网址在线观看| 国产亚洲精品aa| 国产三级精品三级观看| 一区二区三区日韩精品| 中文字幕亚洲高清| 在线观看日韩精品| 一区二区三区亚洲视频| 精品少妇一区二区三区| 天天综合网天天综合| 一区二区中文字幕| av网站网址在线观看| 久久久久久尹人网香蕉| 欧美大片免费| 91精品久久久久久| 成人午夜网址| 婷婷四月色综合| 欧美一区激情| 成人久久久久久久久| 蜜臀91精品一区二区三区| 无码国产精品一区二区高潮| 91丨九色丨国产丨porny| 麻豆视频免费在线播放| 亚洲伊人伊色伊影伊综合网| 久久中文字幕免费| 91麻豆精品国产91久久久久| 亚洲三区在线播放| 日韩中文字幕网站| 欧美xxxhd| 91影院在线免费观看视频| 福利片在线一区二区| 天堂精品一区二区三区| 激情视频一区| 久久这里只精品| av一二三不卡影片| 亚洲女人久久久| 色哟哟国产精品| www.色呦呦| 在线免费观看羞羞视频一区二区| av影视在线看| 国产精品视频成人| 伊人春色精品| 91.com在线| 久久99精品久久久久久国产越南| 精品中文字幕在线播放| 综合久久国产九一剧情麻豆| 久久精品无码av| 精品国产一区二区三区久久久蜜月| 国产高清在线| 欧美亚洲国产成人精品| 日韩精品一区二区三区免费视频| 日韩av电影免费观看| 9久re热视频在线精品| 美女被艹视频网站| 中文字幕久久午夜不卡| 四虎成人在线观看| 精品国产sm最大网站免费看| 理论片午午伦夜理片在线播放| 日韩美女视频在线观看| 另类ts人妖一区二区三区| 992tv快乐视频| 狠狠色2019综合网| 韩国女同性做爰三级| 精品久久久久久中文字幕| 亚洲av无码一区二区乱子伦 | heyzo中文字幕在线| 91在线看www| 四季av在线一区二区三区| 日本激情综合网| 日本一区二区综合亚洲| 一级黄色在线视频| 亚洲欧美国产精品| 麻豆蜜桃在线观看| 国产女人水真多18毛片18精品 | 欧美第一黄色网| 国产95亚洲| 国产精品美女在线播放| 久久精品国产亚洲一区二区三区| 国产精品成人在线视频| 欧美亚洲国产一区在线观看网站| 蜜桃成人在线视频| 全球成人中文在线| 国产精品一区二区av交换| 国产精品-区区久久久狼| 91免费国产视频网站| 国产精品一区二区三区四| 日韩毛片在线看| 国产v综合v| 亚洲成人精品电影在线观看| 日本中文字幕不卡| 青青青视频在线免费观看| 精品视频资源站| 免费**毛片在线| 99久久伊人精品影院| 激情五月***国产精品| 星空大象在线观看免费播放| 疯狂做受xxxx欧美肥白少妇| 青青久在线视频| 国产精品va在线播放| 水蜜桃久久夜色精品一区| 久久精品久久久久久| 国产精品久久久久国产a级| 亚洲最大成人综合网| 欧美一级片免费| 久久久午夜电影| 91免费国产精品| 97人人精品| 最新日韩中文字幕| 欧美做爰爽爽爽爽爽爽| av亚洲产国偷v产偷v自拍| 日本熟妇成熟毛茸茸| 亚洲美女视频网站| 日韩经典一区| 久久视频免费在线| 成人性生交大片免费看中文 | 亚洲大尺度网站| 97福利一区二区| 欧美一区二区性| 精品亚洲视频在线| 午夜精品视频一区| 粉嫩一区二区三区国产精品| 91久久综合亚洲鲁鲁五月天| 国自产拍偷拍福利精品免费一| 欧美 日本 国产| 欧美人妇做爰xxxⅹ性高电影 | 亚洲女人的天堂| 午夜18视频在线观看| 国产精品美乳一区二区免费| 国产精品s色| 亚洲码无人客一区二区三区| 制服丝袜亚洲播放| 悠悠资源网亚洲青|