青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
登山之道
C++博客
::
首頁
::
新隨筆
:: :: ::
管理
一個(gè) Java 搜索引擎的實(shí)現(xiàn),第 1 部分: 網(wǎng)絡(luò)爬蟲
Posted on 2011-04-16 20:35
Kevin_Zhang
閱讀(952)
評(píng)論(0)
編輯
收藏
引用
所屬分類:
搜索引擎
自己動(dòng)手寫一個(gè)搜索引擎,想想這有多 cool:在界面上輸入關(guān)鍵詞,點(diǎn)擊搜索,得到自己想要的結(jié)果;那么它還可以做什么呢?也許是自己的網(wǎng)站需要一個(gè)站內(nèi)搜索功能,抑或是對(duì)于硬盤中文檔的搜索 —— 最重要的是,是不是覺得眾多 IT 公司都在向你招手呢?如果你心動(dòng)了,那么,Let
'
s Go!
這里首先要說明使用 Java 語言而不是 C
/
C
++
等其它語言的原因,因?yàn)?nbsp;Java 中提供了對(duì)于網(wǎng)絡(luò)編程眾多的基礎(chǔ)包和類,比如 URL 類、InetAddress 類、正則表達(dá)式,這為我們的搜索引擎實(shí)現(xiàn)提供了良好的基礎(chǔ),使我們可以專注于搜索引擎本身的實(shí)現(xiàn),而不需要因?yàn)檫@些基礎(chǔ)類的實(shí)現(xiàn)而分心。
這個(gè)分三部分的系列將逐步說明如何設(shè)計(jì)和實(shí)現(xiàn)一個(gè)搜索引擎。在第一部分中,您將首先學(xué)習(xí)搜索引擎的工作原理,同時(shí)了解其體系結(jié)構(gòu),之后將講解如何實(shí)現(xiàn)搜索引擎的第一部分,網(wǎng)絡(luò)爬蟲模塊,即完成網(wǎng)頁搜集功能。在系列的第二部分中,將介紹預(yù)處理模塊,即如何處理收集來的網(wǎng)頁,整理、分詞以及索引的建立都在這部分之中。在系列的第三部分中,將介紹信息查詢服務(wù)的實(shí)現(xiàn),主要是查詢界面的建立、查詢結(jié)果的返回以及快照的實(shí)現(xiàn)。
dySE 的整體結(jié)構(gòu)
在開始學(xué)習(xí)搜索引擎的模塊實(shí)現(xiàn)之前,您需要了解 dySE 的整體結(jié)構(gòu)以及數(shù)據(jù)傳輸?shù)牧鞒獭J聦?shí)上,搜索引擎的三個(gè)部分是相互獨(dú)立的,三個(gè)部分分別工作,主要的關(guān)系體現(xiàn)在前一部分得到的數(shù)據(jù)結(jié)果為后一部分提供原始數(shù)據(jù)。三者的關(guān)系如下圖所示:
圖
1
. 搜索引擎三段式工作流程
在介紹搜索引擎的整體結(jié)構(gòu)之前,我們借鑒《計(jì)算機(jī)網(wǎng)絡(luò)——自頂向下的方法描述因特網(wǎng)特色》一書的敘事方法,從普通用戶使用搜索引擎的角度來介紹搜索引擎的具體工作流程。
自頂向下的方法描述搜索引擎執(zhí)行過程:
用戶通過瀏覽器提交查詢的詞或者短語 P,搜索引擎根據(jù)用戶的查詢返回匹配的網(wǎng)頁信息列表 L;
上述過程涉及到兩個(gè)問題,如何匹配用戶的查詢以及網(wǎng)頁信息列表從何而來,根據(jù)什么而排序?用戶的查詢 P 經(jīng)過分詞器被切割成小詞組
<
p1,p2 … pn
>
并被剔除停用詞 ( 的、了、啊等字 ),根據(jù)系統(tǒng)維護(hù)的一個(gè)倒排索引可以查詢某個(gè)詞 pi 在哪些網(wǎng)頁中出現(xiàn)過,匹配那些
<
p1,p2 … pn
>
都出現(xiàn)的網(wǎng)頁集即可作為初始結(jié)果,更進(jìn)一步,返回的初始網(wǎng)頁集通過計(jì)算與查詢?cè)~的相關(guān)度從而得到網(wǎng)頁排名,即 Page Rank,按照網(wǎng)頁的排名順序即可得到最終的網(wǎng)頁列表;
假設(shè)分詞器和網(wǎng)頁排名的計(jì)算公式都是既定的,那么倒排索引以及原始網(wǎng)頁集從何而來?原始網(wǎng)頁集在之前的數(shù)據(jù)流程的介紹中,可以得知是由爬蟲 spider 爬取網(wǎng)頁并且保存在本地的,而倒排索引,即詞組到網(wǎng)頁的映射表是建立在正排索引的基礎(chǔ)上的,后者是分析了網(wǎng)頁的內(nèi)容并對(duì)其內(nèi)容進(jìn)行分詞后,得到的網(wǎng)頁到詞組的映射表,將正排索引倒置即可得到倒排索引;
網(wǎng)頁的分析具體做什么呢?由于爬蟲收集來的原始網(wǎng)頁中包含很多信息,比如 html 表單以及一些垃圾信息比如廣告,網(wǎng)頁分析去除這些信息,并抽取其中的正文信息作為后續(xù)的基礎(chǔ)數(shù)據(jù)。
在有了上述的分析之后,我們可以得到搜索引擎的整體結(jié)構(gòu)如下圖:
圖
2
. 搜索引擎整體結(jié)構(gòu)
爬蟲從 Internet 中爬取眾多的網(wǎng)頁作為原始網(wǎng)頁庫存儲(chǔ)于本地,然后網(wǎng)頁分析器抽取網(wǎng)頁中的主題內(nèi)容交給分詞器進(jìn)行分詞,得到的結(jié)果用索引器建立正排和倒排索引,這樣就得到了索引數(shù)據(jù)庫,用戶查詢時(shí),在通過分詞器切割輸入的查詢?cè)~組并通過檢索器在索引數(shù)據(jù)庫中進(jìn)行查詢,得到的結(jié)果返回給用戶。
無論搜索引擎的規(guī)模大小,其主要結(jié)構(gòu)都是由這幾部分構(gòu)成的,并沒有大的差別,搜索引擎的好壞主要是決定于各部分的內(nèi)部實(shí)現(xiàn)。
有了上述的對(duì)與搜索引擎的整體了解,我們來學(xué)習(xí) dySE 中爬蟲模塊的具體設(shè)計(jì)和實(shí)現(xiàn)。
回頁首
Spider 的設(shè)計(jì)
網(wǎng)頁收集的過程如同圖的遍歷,其中網(wǎng)頁就作為圖中的節(jié)點(diǎn),而網(wǎng)頁中的超鏈接則作為圖中的邊,通過某網(wǎng)頁的超鏈接 得到其他網(wǎng)頁的地址,從而可以進(jìn)一步的進(jìn)行網(wǎng)頁收集;圖的遍歷分為廣度優(yōu)先和深度優(yōu)先兩種方法,網(wǎng)頁的收集過程也是如此。綜上,Spider 收集網(wǎng)頁的過程如下:從初始 URL 集合獲得目標(biāo)網(wǎng)頁地址,通過網(wǎng)絡(luò)連接接收網(wǎng)頁數(shù)據(jù),將獲得的網(wǎng)頁數(shù)據(jù)添加到網(wǎng)頁庫中并且分析該網(wǎng)頁中的其他 URL 鏈接,放入未訪問 URL 集合用于網(wǎng)頁收集。下圖表示了這個(gè)過程:
圖
3
. Spider 工作流程
回頁首
Spider 的具體實(shí)現(xiàn)
網(wǎng)頁收集器 Gather
網(wǎng)頁收集器通過一個(gè) URL 來獲取該 URL 對(duì)應(yīng)的網(wǎng)頁數(shù)據(jù),其實(shí)現(xiàn)主要是利用 Java 中的 URLConnection 類來打開 URL 對(duì)應(yīng)頁面的網(wǎng)絡(luò)連接,然后通過 I
/
O 流讀取其中的數(shù)據(jù),BufferedReader 提供讀取數(shù)據(jù)的緩沖區(qū)提高數(shù)據(jù)讀取的效率以及其下定義的 readLine() 行讀取函數(shù)。代碼如下 ( 省略了異常處理部分 ):
清單
1
. 網(wǎng)頁數(shù)據(jù)抓取
URL url
=
new
URL(“http:
//
www.xxx.com”);
URLConnection conn
=
url.openConnection();
BufferedReader reader
=
new
BufferedReader(
new
InputStreamReader(conn.getInputStream()));
String line
=
null
;
while
((line
=
reader.readLine())
!=
null
)
document.append(line
+
"
\n
"
);
使用 Java 語言的好處是不需要自己處理底層的連接操作,喜歡或者精通 Java 網(wǎng)絡(luò)編程的讀者也可以不用上述的方法,自己實(shí)現(xiàn) URL 類及相關(guān)操作,這也是一種很好的鍛煉。
網(wǎng)頁處理
收集到的單個(gè)網(wǎng)頁,需要進(jìn)行兩種不同的處理,一種是放入網(wǎng)頁庫,作為后續(xù)處理的原始數(shù)據(jù);另一種是被分析之后,抽取其中的 URL 連接,放入 URL 池等待對(duì)應(yīng)網(wǎng)頁的收集。
網(wǎng)頁的保存需要按照一定的格式,以便以后數(shù)據(jù)的批量處理。這里介紹一種存儲(chǔ)數(shù)據(jù)格式,該格式從北大天網(wǎng)的存儲(chǔ)格式簡化而來:
網(wǎng)頁庫由若干記錄組成,每個(gè)記錄包含一條網(wǎng)頁數(shù)據(jù)信息,記錄的存放為順序添加;
一條記錄由數(shù)據(jù)頭、數(shù)據(jù)、空行組成,順序?yàn)椋侯^部
+
空行
+
數(shù)據(jù)
+
空行;
頭部由若干屬性組成,有:版本號(hào),日期,IP 地址,數(shù)據(jù)長度,按照屬性名和屬性值的方式排列,中間加冒號(hào),每個(gè)屬性占用一行;
數(shù)據(jù)即為網(wǎng)頁數(shù)據(jù)。
需要說明的是,添加數(shù)據(jù)收集日期的原因,由于許多網(wǎng)站的內(nèi)容都是動(dòng)態(tài)變化的,比如一些大型門戶網(wǎng)站的首頁內(nèi)容,這就意味著如果不是當(dāng)天爬取的網(wǎng)頁數(shù)據(jù),很可能發(fā)生數(shù)據(jù)過期的問題,所以需要添加日期信息加以識(shí)別。
URL 的提取分為兩步,第一步是 URL 識(shí)別,第二步再進(jìn)行 URL 的整理,分兩步走主要是因?yàn)橛行┚W(wǎng)站的鏈接是采用相對(duì)路徑,如果不整理會(huì)產(chǎn)生錯(cuò)誤。URL 的識(shí)別主要是通過正則表達(dá)式來匹配,過程首先設(shè)定一個(gè)字符串作為匹配的字符串模式,然后在 Pattern 中編譯后即可使用 Matcher 類來進(jìn)行相應(yīng)字符串的匹配。實(shí)現(xiàn)代碼如下:
清單
2
. URL 識(shí)別
public
ArrayList
<
URL
>
urlDetector(String htmlDoc)
{
final
String patternString
=
"
<[a|A]\\s+href=([^>]*\\s*>)
"
;
Pattern pattern
=
Pattern.compile(patternString,Pattern.CASE_INSENSITIVE);
ArrayList
<
URL
>
allURLs
=
new
ArrayList
<
URL
>
();
Matcher matcher
=
pattern.matcher(htmlDoc);
String tempURL;
//
初次匹配到的url是形如:<a href="
http://bbs.life.xxx.com.cn/
" target="_blank">
//
為此,需要進(jìn)行下一步的處理,把真正的url抽取出來,
//
可以對(duì)于前兩個(gè)"之間的部分進(jìn)行記錄得到url
while
(matcher.find())
{
try
{
tempURL
=
matcher.group();
tempURL
=
tempURL.substring(tempURL.indexOf(
"
\
""
)+1);
if
(
!
tempURL.contains(
"
\
""
))
continue
;
tempURL
=
tempURL.substring(
0
, tempURL.indexOf(
"
\
""
));
}
catch
(MalformedURLException e)
{
e.printStackTrace();
}
}
return
allURLs;
}
按照“
<
[a
|
A]\\s
+
href
=
([
^>
]
*
\\s
*>
)”這個(gè)正則表達(dá)式可以匹配出 URL 所在的整個(gè)標(biāo)簽,形如“
<
a href
=
"
http://bbs.life.xxx.com.cn/
"
target
=
"
_blank
"
>
”,所以在循環(huán)獲得整個(gè)標(biāo)簽之后,需要進(jìn)一步提取出真正的 URL,我們可以通過截取標(biāo)簽中前兩個(gè)引號(hào)中間的內(nèi)容來獲得這段內(nèi)容。如此之后,我們可以得到一個(gè)初步的屬于該網(wǎng)頁的 URL 集合。
接下來我們進(jìn)行第二步操作,URL 的整理,即對(duì)之前獲得的整個(gè)頁面中 URL 集合進(jìn)行篩選和整合。整合主要是針對(duì)網(wǎng)頁地址是相對(duì)鏈接的部分,由于我們可以很容易的獲得當(dāng)前網(wǎng)頁的 URL,所以,相對(duì)鏈接只需要在當(dāng)前網(wǎng)頁的 URL 上添加相對(duì)鏈接的字段即可組成完整的 URL,從而完成整合。另一方面,在頁面中包含的全面 URL 中,有一些網(wǎng)頁比如廣告網(wǎng)頁是我們不想爬取的,或者不重要的,這里我們主要針對(duì)于頁面中的廣告進(jìn)行一個(gè)簡單處理。一般網(wǎng)站的廣告連接都有相應(yīng)的顯示表達(dá),比如連接中含有“ad”等表達(dá)時(shí),可以將該鏈接的優(yōu)先級(jí)降低,這樣就可以一定程度的避免廣告鏈接的爬取。
經(jīng)過這兩步操作時(shí)候,可以把該網(wǎng)頁的收集到的 URL 放入 URL 池中,接下來我們處理爬蟲的 URL 的派分問題。
Dispatcher 分配器
分配器管理 URL,負(fù)責(zé)保存著 URL 池并且在 Gather 取得某一個(gè)網(wǎng)頁之后派分新的 URL,還要避免網(wǎng)頁的重復(fù)收集。分配器采用設(shè)計(jì)模式中的單例模式編碼,負(fù)責(zé)提供給 Gather 新的 URL,因?yàn)樯婕暗街蟮亩嗑€程改寫,所以單例模式顯得尤為重要。
重復(fù)收集是指物理上存在的一個(gè)網(wǎng)頁,在沒有更新的前提下,被 Gather 重復(fù)訪問,造成資源的浪費(fèi),主要原因是沒有清楚的記錄已經(jīng)訪問的 URL 而無法辨別。所以,Dispatcher 維護(hù)兩個(gè)列表 ,“已訪問表”,和“未訪問表”。每個(gè) URL 對(duì)應(yīng)的頁面被抓取之后,該 URL 放入已訪問表中,而從該頁面提取出來的 URL 則放入未訪問表中;當(dāng) Gather 向 Dispatcher 請(qǐng)求 URL 的時(shí)候,先驗(yàn)證該 URL 是否在已訪問表中,然后再給 Gather 進(jìn)行作業(yè)。
Spider 啟動(dòng)多個(gè) Gather 線程
現(xiàn)在 Internet 中的網(wǎng)頁數(shù)量數(shù)以億計(jì),而單獨(dú)的一個(gè) Gather 來進(jìn)行網(wǎng)頁收集顯然效率不足,所以我們需要利用多線程的方法來提高效率。Gather 的功能是收集網(wǎng)頁,我們可以通過 Spider 類來開啟多個(gè) Gather 線程,從而達(dá)到多線程的目的。代碼如下:
/** */
/**
* 啟動(dòng)線程 gather,然后開始收集網(wǎng)頁資料
*/
public
void
start()
{
Dispatcher disp
=
Dispatcher.getInstance();
for
(
int
i
=
0
; i
<
gatherNum; i
++
)
{
Thread gather
=
new
Thread(
new
Gather(disp));
gather.start();
}
}
在開啟線程之后,網(wǎng)頁收集器開始作業(yè)的運(yùn)作,并在一個(gè)作業(yè)完成之后,向 Dispatcher 申請(qǐng)下一個(gè)作業(yè),因?yàn)橛辛硕嗑€程的 Gather,為了避免線程不安全,需要對(duì) Dispatcher 進(jìn)行互斥訪問,在其函數(shù)之中添加
synchronized
關(guān)鍵詞,從而達(dá)到線程的安全訪問。
回頁首
小結(jié)
Spider 是整個(gè)搜索引擎的基礎(chǔ),為后續(xù)的操作提供原始網(wǎng)頁資料,所以了解 Spider 的編寫以及網(wǎng)頁庫的組成結(jié)構(gòu)為后續(xù)預(yù)處理模塊打下基礎(chǔ)。同時(shí) Spider 稍加修改之后也可以單獨(dú)用于某類具體信息的搜集,比如某個(gè)網(wǎng)站的圖片爬取等。
回頁首
后續(xù)內(nèi)容
在本系列的第
2
部分中,您將了解到爬蟲獲取的網(wǎng)頁庫如何被預(yù)處理模塊逐步提取內(nèi)容信息,通過分詞并建成倒排索引;而在第
3
部分中,您將了解到,如何編寫網(wǎng)頁來提供查詢服務(wù),并且如何顯示的返回的結(jié)果和完成快照的功能。
只有注冊(cè)用戶
登錄
后才能發(fā)表評(píng)論。
相關(guān)文章:
Lucene入門級(jí)筆記五 -- 分詞器,使用中文分詞器,擴(kuò)展詞庫,停用詞
網(wǎng)頁解析開源項(xiàng)目
一個(gè) Java 搜索引擎的實(shí)現(xiàn),第 2 部分: 網(wǎng)頁預(yù)處理
一個(gè) Java 搜索引擎的實(shí)現(xiàn),第 1 部分: 網(wǎng)絡(luò)爬蟲
java 下載網(wǎng)頁
Apache+php+mysql在XP下搭配詳解
MonoDevelop
heritrix1.14.4
tomcatPlugin下載地址
Heritrix-1.14.1怎么配置?
網(wǎng)站導(dǎo)航:
博客園
IT新聞
BlogJava
博問
Chat2DB
管理
Powered by:
C++博客
Copyright © Kevin_Zhang
日歷
<
2010年11月
>
日
一
二
三
四
五
六
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
常用鏈接
我的隨筆
我的評(píng)論
我參與的隨筆
隨筆分類
數(shù)據(jù)庫(1)
ACM基礎(chǔ)知識(shí)(9)
ARM(2)
C/C++(12)
DOS(1)
Google Map API
Heritrix(1)
IT News(22)
JAVA(3)
Jsp
Linux(9)
Lucene(1)
PHP(6)
Python
Tree
Trie樹(1)
博弈
動(dòng)態(tài)規(guī)劃(1)
回溯
匯編
計(jì)算幾何(1)
模擬(4)
排序(2)
嵌入式
數(shù)據(jù)結(jié)構(gòu)(2)
數(shù)論(2)
數(shù)學(xué)(3)
搜索(2)
搜索引擎(12)
隨機(jī)數(shù)
貪心(1)
圖論(1)
圖形學(xué)(1)
萬花筒(22)
網(wǎng)絡(luò)流
硬件(1)
隨筆檔案
2011年6月 (5)
2011年5月 (22)
2011年4月 (24)
2010年12月 (1)
2010年11月 (13)
2010年10月 (7)
2010年9月 (14)
2010年8月 (52)
2010年7月 (9)
文章分類
ACM題目分類(13)
C
C#
C++
DP動(dòng)態(tài)規(guī)劃
JAVA
LUNIX
Python
博弈
計(jì)算幾何
模擬
數(shù)論(1)
搜索(1)
貪心
圖論
文章檔案
2010年8月 (4)
2010年7月 (22)
程序的靈魂--算法
沙場秋點(diǎn)兵,壯士凱歌還
北大POJ
他山之石,可以攻玉
圍觀強(qiáng)人
搜索
最新評(píng)論
1.?re: Lucene入門級(jí)筆記五 -- 分詞器,使用中文分詞器,擴(kuò)展詞庫,停用詞
54544554
--回家看回家看
2.?re: 水
評(píng)論內(nèi)容較長,點(diǎn)擊標(biāo)題查看
--Jason Huang
3.?re: 10項(xiàng)技能讓前端開發(fā)者價(jià)值百萬!
評(píng)論內(nèi)容較長,點(diǎn)擊標(biāo)題查看
--BURKERosie25
4.?re: (轉(zhuǎn)載)ACM經(jīng)歷總結(jié)[未登錄]
謝謝
--xingyezhi
5.?re: 世界頭號(hào)營銷大師們的營銷素質(zhì)
大道至簡,殊途同歸,值得借鑒。
--Kevin_Zhang
閱讀排行榜
1.?Java動(dòng)態(tài)數(shù)組的用法詳解(12226)
2.? Lucene入門級(jí)筆記五 -- 分詞器,使用中文分詞器,擴(kuò)展詞庫,停用詞(3516)
3.?用scanf輸入字符串空格不識(shí)別??(2110)
4.?php java交互 php/java bridge (1960)
5.?設(shè)置MFC坐標(biāo)系(1828)
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
av不卡在线
|
一区二区三区|亚洲午夜
|
久久精品视频免费播放
|
久久综合亚洲社区
|
亚洲韩国日本中文字幕
|
欧美精品在欧美一区二区少妇
|
日韩午夜精品视频
|
欧美激情综合在线
|
欧美精品性视频
|
久久久99国产精品免费
|
亚洲韩国日本中文字幕
|
亚洲国产精品一区在线观看不卡
|
91久久综合亚洲鲁鲁五月天
|
亚洲第一区色
|
国产精品久久久久久久久动漫
|
国产精品中文在线
|
久久综合中文
|
亚洲国产精品一区二区www在线
|
久久久国产精品一区二区中文
|
国产欧亚日韩视频
|
久久久精品性
|
久久久久久网站
|
亚洲精品中文在线
|
狠狠综合久久
|
亚洲国产专区
|
亚洲国产欧美一区
|
亚洲国产成人精品久久
|
亚洲一区综合
|
亚洲国产精品va在线看黑人
|
老司机一区二区三区
|
亚洲福利视频在线
|
欧美视频久久
|
欧美剧在线观看
|
亚洲国产精品日韩
|
国产精品视频大全
|
蘑菇福利视频一区播放
|
亚洲欧美中文另类
|
亚洲黄一区二区三区
|
久久午夜av
|
亚洲欧美亚洲
|
一区二区日韩伦理片
|
伊大人香蕉综合8在线视
|
国产精品www网站
|
欧美成人精品h版在线观看
|
欧美一区二区日韩一区二区
|
日韩午夜一区
|
欧美99在线视频观看
|
久久大综合网
|
亚洲男人的天堂在线
|
日韩视频国产视频
|
在线观看成人一级片
|
国产欧美一区二区精品性
|
欧美日韩精品一区二区在线播放
|
久久久蜜桃精品
|
欧美呦呦网站
|
午夜精品久久久久久久99黑人
|
中国成人在线视频
|
日韩视频二区
|
亚洲精品在线免费
|
亚洲欧洲午夜
|
亚洲黄网站在线观看
|
亚洲高清二区
|
欧美肥婆在线
|
欧美成人精品h版在线观看
|
久久夜色精品一区
|
久久一日本道色综合久久
|
久久视频在线视频
|
久久精品视频一
|
久久久久久婷
|
蜜臀va亚洲va欧美va天堂
|
久久青青草综合
|
久久亚洲一区二区三区四区
|
久久久青草婷婷精品综合日韩
|
欧美一区激情
|
久久都是精品
|
久久精品日产第一区二区
|
久久蜜桃精品
|
美女视频黄a大片欧美
|
欧美成年网站
|
亚洲国产精品一区二区第一页
|
亚洲欧洲在线免费
|
91久久久在线
|
亚洲精品国产精品国自产观看浪潮
|
亚洲国产欧美一区二区三区丁香婷
|
91久久在线视频
|
亚洲欧美精品伊人久久
|
免费看亚洲片
|
国产精品午夜在线
|
亚洲精品日日夜夜
|
久久精品国产v日韩v亚洲
|
亚洲欧洲在线看
|
久久精品最新地址
|
国产精品美女www爽爽爽
|
亚洲精品偷拍
|
麻豆av一区二区三区久久
|
亚洲资源av
|
欧美人体xx
|
亚洲国产一区二区a毛片
|
久久国产一二区
|
夜夜嗨一区二区三区
|
欧美成年人在线观看
|
精品成人免费
|
欧美在线一级va免费观看
|
一个人看的www久久
|
欧美高清在线精品一区
|
国外成人在线视频
|
亚洲欧美日韩精品久久久久
|
亚洲黄一区二区
|
另类尿喷潮videofree
|
亚洲欧美日韩综合aⅴ视频
|
欧美连裤袜在线视频
|
亚洲第一免费播放区
|
久久国产欧美日韩精品
|
亚洲在线不卡
|
国产精品久久久久9999
|
亚洲一区二区3
|
亚洲黄色高清
|
蜜桃精品一区二区三区
|
亚洲国产导航
|
美国成人直播
|
欧美一区二区三区在线免费观看
|
亚洲调教视频在线观看
|
欧美日韩国产成人在线91
|
亚洲精品欧美
|
欧美激情1区2区3区
|
久久久久五月天
|
在线观看日韩一区
|
久久久欧美一区二区
|
久久国产一区
|
极品尤物久久久av免费看
|
久久人人爽人人爽
|
久久久久久尹人网香蕉
|
一区二区三区亚洲
|
免费亚洲婷婷
|
欧美大片一区二区
|
9国产精品视频
|
一本高清dvd不卡在线观看
|
欧美日韩综合精品
|
亚洲欧美视频在线观看视频
|
亚洲天堂免费观看
|
国产欧美日韩视频一区二区三区
|
欧美人与禽猛交乱配视频
|
99热免费精品在线观看
|
99国产精品久久久久久久久久
|
国内久久精品视频
|
欧美成人免费全部观看天天性色
|
久久久久国产免费免费
|
亚洲国产精品美女
|
亚洲美女色禁图
|
欧美午夜女人视频在线
|
久久大逼视频
|
美女视频黄a大片欧美
|
av成人免费在线
|
亚洲一区二区视频在线
|
国产亚洲欧美一区
|
亚洲福利视频一区
|
国产精品高潮久久
|
久久久av网站
|
欧美激情按摩在线
|
亚洲欧美日韩国产综合在线
|
欧美在线视频导航
|
亚洲精品国产系列
|
亚洲一区二区欧美
|
欲色影视综合吧
|
99视频日韩
|
国产一区二区三区精品欧美日韩一区二区三区
|
亚洲精品乱码视频
|
亚洲一二三区在线观看
|
激情综合电影网
|
亚洲精品色婷婷福利天堂
|
国产精品视频免费一区
|
免费精品99久久国产综合精品
|
欧美黄网免费在线观看
|
欧美一区视频
|
欧美国产乱视频
|
久久国产精品一区二区
|
欧美粗暴jizz性欧美20
|
欧美伊人久久
|
欧美精品在线一区
|
久久精品99无色码中文字幕
|
欧美成人免费小视频
|
欧美在线播放
|
欧美久久久久久蜜桃
|
久久久精品视频成人
|
欧美日韩视频在线一区二区
|
久久在线精品
|
国产精品美女久久久久av超清
|
欧美一区二区三区啪啪
|
欧美成人国产一区二区
|
久久久.com
|
欧美三级乱人伦电影
|
欧美寡妇偷汉性猛交
|
国产欧美一区二区三区久久人妖
|
91久久精品美女高潮
|
精品电影一区
|
亚洲欧美日本精品
|
一区二区三区国产精品
|
蜜桃av噜噜一区
|
久久性色av
|
国产女人精品视频
|