国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

webmagic源碼淺析

共 10481字,需瀏覽 21分鐘

 ·

2020-10-26 18:48

點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”

優(yōu)質(zhì)文章,第一時(shí)間送達(dá)

? 作者?|??夢(mèng)想家haima

來(lái)源 |? urlify.cn/imyqMb

66套java從入門到精通實(shí)戰(zhàn)課程分享

webmagic簡(jiǎn)介

webmagic可以說(shuō)是中國(guó)傳播度最廣的Java爬蟲(chóng)框架,https://github.com/code4craft/webmagic,閱讀相關(guān)源碼,獲益良多。閱讀作者博客【代碼工匠】,能夠領(lǐng)略到一個(gè)IT工作者的工匠精神,希望以后成為他這樣的開(kāi)源貢獻(xiàn)者。Webmagic的文檔也是寫(xiě)得非常漂亮,這里就不具體講它的使用方法了,見(jiàn)官方文檔

webmagic核心架構(gòu)

webmagic幫我們做了幾個(gè)核心的事情:
1.線程池封裝,不用手動(dòng)控制采集線程
2.url調(diào)度,實(shí)現(xiàn)了生產(chǎn)者消費(fèi)者模型
3.封裝下載器組件(downloader),解析組件,持久化。見(jiàn)官方文檔
4.支持注解

簡(jiǎn)單案例

借用一段官方案例,快速入門,便于后面的理解。開(kāi)啟一個(gè)爬蟲(chóng),只需要簡(jiǎn)單幾步,編寫(xiě)頁(yè)面解析器,寫(xiě)具體的解析方法。新建Spider實(shí)例,添加至少一個(gè)種子URL,設(shè)置其他可選屬性,最后調(diào)用run()方法,或者start(),start()方法內(nèi)部會(huì)為spider單獨(dú)開(kāi)啟一個(gè)線程,使得爬蟲(chóng)與主線程異步。

import?us.codecraft.webmagic.Page;
import?us.codecraft.webmagic.Site;
import?us.codecraft.webmagic.Spider;
import?us.codecraft.webmagic.processor.PageProcessor;
public?class?GithubRepoPageProcessor?implements?PageProcessor?{
????private?Site?site?=?Site.me().setRetryTimes(3).setSleepTime(100);
????@Override
????public?void?process(Page?page)?{
????????//將提取的url加入page對(duì)象暫存,最終會(huì)加入到
????????page.addTargetRequests(page.getHtml().links().regex("(https://github\\.com/\\w+/\\w+)").all());
????????page.putField("author",?page.getUrl().regex("https://github\\.com/(\\w+)/.*").toString());
????????page.putField("name",?page.getHtml().xpath("http://h1[@class='entry-title?public']/strong/a/text()").toString());
????????if?(page.getResultItems().get("name")==null){
????????????//skip?this?page
????????????page.setSkip(true);
????????}
????????page.putField("readme",?page.getHtml().xpath("http://div[@id='readme']/tidyText()"));
????}
?
????@Override
????public?Site?getSite()?{
????????return?site;
????}
????public?static?void?main(String[]?args)?{
????????//官方鏈?zhǔn)秸{(diào)用,拆解到下面方便理解
????????//Spider.create(new?GithubRepoPageProcessor()).addUrl("https://github.com/code4craft").thread(5).run();
????????
????????//創(chuàng)建線程
????????Spider?spider?=?Spider.create(new?GithubRepoPageProcessor());
????????//添加采集種子URL
????????spider.addUrl("https://github.com/code4craft");
????????//設(shè)置線程數(shù)
????????spider.thread(5);
????????//啟動(dòng)爬蟲(chóng)//run()方法既可以看作多線程中的Runnable接口方法,也可以直接運(yùn)行,是爬蟲(chóng)的核心方法
????????spider.run();
????}
}

Spider類屬性

爬蟲(chóng)的核心是us.codecraft.webmagic.Spider類,看看Spider類中都有哪些重要屬性
屬性列表:

public?class?Spider?implements?Runnable,?Task?{
????//下載器對(duì)象
????protected?Downloader?downloader;
????//持久化統(tǒng)一處理器,可以有多個(gè)
????protected?List?pipelines?=?new?ArrayList();
????//頁(yè)面解析器
????protected?PageProcessor?pageProcessor;
????//種子請(qǐng)求(這個(gè)地方看著種子請(qǐng)求也不是很對(duì),因?yàn)閟pider對(duì)象在沒(méi)開(kāi)始運(yùn)行時(shí),仍然可以使用addRequest,addUrl添加url???)
????protected?List?startRequests;
????//瀏覽器信息對(duì)象
????protected?Site?site;
????//爬蟲(chóng)任務(wù)標(biāo)識(shí)
????protected?String?uuid;
?????//任務(wù)調(diào)度器,默認(rèn)是JDK中的LinkedBlockingQueue的實(shí)現(xiàn)
????protected?Scheduler?scheduler?=?new?QueueScheduler();
?
????protected?Logger?logger?=?LoggerFactory.getLogger(getClass());
?????//線程池(自己封裝的一個(gè)模型,內(nèi)部的execute方法實(shí)際是executorService的execute實(shí)現(xiàn)添加線程的作用)
????protected?CountableThreadPool?threadPool;
?????//執(zhí)行管理器對(duì)象(和線程池配合使用)
????protected?ExecutorService?executorService;
????//線程數(shù),控制采集并發(fā)
????protected?int?threadNum?=?1;
????//爬蟲(chóng)任務(wù)運(yùn)行狀態(tài)
????protected?AtomicInteger?stat?=?new?AtomicInteger(STAT_INIT);
???//是否采集完成退出
????protected?boolean?exitWhenComplete?=?true;
?
????protected?final?static?int?STAT_INIT?=?0;
?
????protected?final?static?int?STAT_RUNNING?=?1;
?
????protected?final?static?int?STAT_STOPPED?=?2;
?
????//是否回流url,spawn產(chǎn)卵的意思。個(gè)人覺(jué)得這個(gè)參數(shù)很多余,不想采集繼續(xù)下去,可以別把url加入隊(duì)列
????protected?boolean?spawnUrl?=?true;
????//退出時(shí)是否回收處理
????protected?boolean?destroyWhenExit?=?true;
?
????//控制新生成url鎖
????private?ReentrantLock?newUrlLock?=?new?ReentrantLock();
???//控制新生成url鎖,配合newUrlLock?使用
????private?Condition?newUrlCondition?=?newUrlLock.newCondition();
?????//監(jiān)聽(tīng)器集合,請(qǐng)求爬去成功或者失敗時(shí),可以通過(guò)注入監(jiān)聽(tīng)器分別實(shí)現(xiàn)onSuccess和onError方法
????private?List?spiderListeners;
?????//采集頁(yè)面數(shù)統(tǒng)計(jì)(只代表請(qǐng)求的次數(shù),不代表成功抓取數(shù))
????private?final?AtomicLong?pageCount?=?new?AtomicLong(0);
?????//爬取開(kāi)始時(shí)間
????private?Date?startTime;
?????//調(diào)度器隊(duì)列中的URL已經(jīng)被消費(fèi)光,且采集線程未執(zhí)行完成,仍然可能生產(chǎn)URL到調(diào)度器隊(duì)列中時(shí),線程最多wait?30秒
????private?int?emptySleepTime?=?30000;

threadNum?這里Spider本身實(shí)現(xiàn)了Runnable接口,可以作為一個(gè)獨(dú)立的線程開(kāi)啟,當(dāng)然它的線程控制不僅于此,這里有一個(gè)屬性threadNum才是控制采集線程數(shù)的,后面再細(xì)說(shuō)。
scheduler?對(duì)象做為調(diào)度器,內(nèi)部采用隊(duì)列維護(hù)了一個(gè)實(shí)現(xiàn)生產(chǎn)者消費(fèi)者模型,爬取的過(guò)程中,可以將采集的url提取到scheduler的隊(duì)列中,線程會(huì)持續(xù)不斷的消費(fèi)scheduler 的隊(duì)列中消費(fèi)。
pageProcessor?用于用戶自定義頁(yè)面解析規(guī)則,定義具體的解析邏輯,新建Spider實(shí)例的方式僅兩種,
public static Spider create(PageProcessor pageProcessor)和構(gòu)造方法public Spider(PageProcessor pageProcessor)create方法內(nèi)部只是調(diào)用了一下構(gòu)造方法。構(gòu)造一個(gè)spider對(duì)象都需要一個(gè)自定義的解析器,不同頁(yè)面,解析邏輯不相同,PageProcessor接口中。spider會(huì)調(diào)用PageProcessor的process方法,這是一個(gè)策略設(shè)計(jì)模式。
uuid?這個(gè)名字可能讓人誤會(huì),和平時(shí)uuid不是一個(gè)含義,這個(gè)屬性是一個(gè)爬蟲(chóng)進(jìn)程的唯一標(biāo)識(shí)
其他屬性?比較重要的屬性還包括threadPool,executorService,控制多線程并發(fā),瀏覽器對(duì)象site,對(duì)于有些反爬策略的網(wǎng)站,該對(duì)象可以用于模擬瀏覽器,達(dá)到反
反爬蟲(chóng)的作用。

Spider核心方法run()

@Override
????public?void?run()?{
????????checkRunningStat();//檢查爬蟲(chóng)運(yùn)行狀態(tài),防止run方法被調(diào)用多次
????????initComponent();//初始化
????????logger.info("Spider?{}?started!",getUUID());
????????while?(!Thread.currentThread().isInterrupted()?&&?stat.get()?==?STAT_RUNNING)?{
????????????//循環(huán)消費(fèi)Request,url在放入scheduler時(shí),已經(jīng)封裝為Request對(duì)象了
????????????final?Request?request?=?scheduler.poll(this);
????????????if?(request?==?null)?{
????????????????if?(threadPool.getThreadAlive()?==?0?&&?exitWhenComplete)?{
????????????????????//threadPool.getThreadAlive()線程池中仍然還有存活線程,那么存活線程可能會(huì)生產(chǎn)出新的url來(lái)
????????????????????//exitWhenComplete默認(rèn)為true,
????????????????????//exitWhenComplete如果為false,線程等待新URL,
????????????????????//如果隊(duì)列(自定義隊(duì)列)能實(shí)現(xiàn)動(dòng)態(tài)添加url,那就可以實(shí)現(xiàn)動(dòng)態(tài)添加采集任務(wù)的功能
????????????????????break;
????????????????}
????????????????//?wait?until?new?url?added?
????????????????//等待存活的線程生產(chǎn)新的url
????????????????waitNewUrl();
????????????}?else?{
????????????????//將request封裝為線程,加入線程隊(duì)列,線程池會(huì)根據(jù)設(shè)置的并行參數(shù)threadNum,并行執(zhí)行
????????????????threadPool.execute(new?Runnable()?{
????????????????????@Override
????????????????????public?void?run()?{
????????????????????????try?{
????????????????????????????processRequest(request);//執(zhí)行請(qǐng)求
????????????????????????????onSuccess(request);//調(diào)用執(zhí)行成功的方法
????????????????????????}?catch?(Exception?e)?{
????????????????????????????onError(request);
????????????????????????????logger.error("process?request?"?+?request?+?"?error",?e);
????????????????????????}?finally?{
????????????????????????????pageCount.incrementAndGet();
????????????????????????????signalNewUrl();
????????????????????????}
????????????????????}
????????????????});
????????????}
????????}
????????stat.set(STAT_STOPPED);
????????//?release?some?resources
????????if?(destroyWhenExit)?{
????????????close();
????????}
????????logger.info("Spider?{}?closed!?{}?pages?downloaded.",?getUUID(),?pageCount.get());
????}

核心方法的流程還是比較簡(jiǎn)答的,checkRunningStat()會(huì)先檢查一下爬蟲(chóng)是否已經(jīng)啟動(dòng),這有點(diǎn)兒像多線程中的開(kāi)啟線程的start()方法,兩次開(kāi)啟是不允許的。
然后初始化方法
initComponent()各種組件,在initComponent()方法中,加入startRequests中的Request,實(shí)際上在Spider啟動(dòng)之前可以調(diào)用addUrl(String... urls)addRequest(Request... requests)方法直接將請(qǐng)求加入到隊(duì)列中,startRequests和后面那種添加url的方法缺少了一定的一致性。

后面一個(gè)循環(huán)消費(fèi)的過(guò)程,正如我注釋里寫(xiě)的那樣,如果隊(duì)列中url被消費(fèi)完畢,且沒(méi)有正在被消費(fèi)的存活的線程了,且完成采集退出屬性exitWhenComplete為true(exitWhenComplete默認(rèn)為true,設(shè)置為false則進(jìn)程將會(huì)一直掛起),就會(huì)跳出死循環(huán),采集結(jié)束,反之,如果依然有線程存活,或者exitWhenComplete為false,那么線程waitNewUrl()等待,在exitWhenComplete為false的情況,進(jìn)程就不會(huì)自動(dòng)停止了,除非強(qiáng)殺了,這種設(shè)計(jì)在分布式的模式下才顯得有意義,可以動(dòng)態(tài)添加url到隊(duì)列中去。

private?void?waitNewUrl()?{
????????newUrlLock.lock();
????????try?{
????????????//?double?check?
????????????if?(threadPool.getThreadAlive()?==?0?&&?exitWhenComplete)?{
????????????????return;
????????????}
????????????//默認(rèn)是30秒后自動(dòng)蘇醒,可以通過(guò)設(shè)置emptySleepTime屬性,控制自動(dòng)蘇醒的時(shí)間
????????????newUrlCondition.await(emptySleepTime,?TimeUnit.MILLISECONDS);
????????}?catch?(InterruptedException?e)?{
????????????logger.warn("waitNewUrl?-?interrupted,?error?{}",?e);
????????}?finally?{
????????????newUrlLock.unlock();
????????}
????}

后面使用threadPool執(zhí)行一個(gè)新的子線程。new Runnable構(gòu)造的匿名內(nèi)部類會(huì)通過(guò)threadPool開(kāi)啟一個(gè)新的子線程,執(zhí)行請(qǐng)求processRequest(request),執(zhí)行成功就調(diào)用onSuccess(request),失敗就調(diào)用onError(request),接著finally代碼塊中的內(nèi)容是非常重要的,統(tǒng)計(jì)請(qǐng)求的頁(yè)面次數(shù)(無(wú)論失敗或者成功),signalNewUrl()喚醒等待的線程,這里要和前面waitNewUrl()結(jié)合起來(lái)看,兩者使用同一個(gè)鎖,waitNewUrl()作為父線程,默認(rèn)會(huì)自動(dòng)蘇醒,但調(diào)用signalNewUrl()的用意在于,可能這個(gè)子線程已經(jīng)又生成新的URL放到隊(duì)列中了,就不用再等30秒了。

private?void?signalNewUrl()?{
????????try?{
????????????newUrlLock.lock();
????????????newUrlCondition.signalAll();
????????}?finally?{
????????????newUrlLock.unlock();
????????}
????}

后面的代碼則是爬蟲(chóng)結(jié)束的操作,這種情況只有前文提到的跳出死循環(huán),采集結(jié)束,結(jié)束前設(shè)置了一下?tīng)顟B(tài),做了一下close()操作

調(diào)度器Scheduler

調(diào)度器在webmagic中扮演的角色是非常重要的,說(shuō)來(lái)功能也不算太復(fù)雜,實(shí)現(xiàn)生產(chǎn)者-消費(fèi)者模式,順便去重。scheduler默認(rèn)為QueueScheduler ,在scheduler聲明的時(shí)候就直接新建了這個(gè)實(shí)例

public?class?QueueScheduler?extends?DuplicateRemovedScheduler?implements?MonitorableScheduler?{
?
????//LinkedBlockingQueue隊(duì)列存url
????private?BlockingQueue?queue?=?new?LinkedBlockingQueue();
?
????@Override????覆蓋父類DuplicateRemovedScheduler?的方法
????public?void?pushWhenNoDuplicate(Request?request,?Task?task)?{
????????queue.add(request);
????}
?
????@Override???實(shí)現(xiàn)DuplicateRemovedScheduler?不完全實(shí)現(xiàn)Scheduler的poll方法
????public?Request?poll(Task?task)?{
????????return?queue.poll();
????}
?
????@Override?????//實(shí)現(xiàn)MonitorableScheduler?的方法
????public?int?getLeftRequestsCount(Task?task)?{
????????return?queue.size();
????}
?
????@Override????//實(shí)現(xiàn)MonitorableScheduler?的方法
????public?int?getTotalRequestsCount(Task?task)?{
????????return?getDuplicateRemover().getTotalRequestsCount(task);
????}
}

以上代碼,可以看到QueueScheduler的構(gòu)成,QueueScheduler繼承了抽象類DuplicateRemovedScheduler 實(shí)現(xiàn)了接口MonitorableScheduler 接口,DuplicateRemovedScheduler 又實(shí)現(xiàn)了Scheduler,DuplicateRemovedScheduler 為抽象類,僅僅實(shí)現(xiàn)了push邏輯(生產(chǎn)者),而poll是QueueScheduler自己實(shí)現(xiàn)的(消費(fèi)者)。push()方法使用去重器,判斷該請(qǐng)求有沒(méi)有被采集過(guò)。這里要注意,默認(rèn)Post請(qǐng)求是不去重的,能直接打開(kāi)的請(qǐng)求都是get的?,官方文檔也有特別說(shuō)明

//DuplicateRemovedScheduler??源碼
private?DuplicateRemover?duplicatedRemover?=?new?HashSetDuplicateRemover();
@Override
????public?void?push(Request?request,?Task?task)?{
????????logger.trace("get?a?candidate?url?{}",?request.getUrl());
????????//duplicatedRemover.isDuplicate(request,?task)?檢查是否采集過(guò)
????????if?(shouldReserved(request)?||?noNeedToRemoveDuplicate(request)?||?!duplicatedRemover.isDuplicate(request,?task))?{
????????????logger.debug("push?to?queue?{}",?request.getUrl());
????????????pushWhenNoDuplicate(request,?task);
????????}
????}

//是否需要去重,POST請(qǐng)求則不需要去重
?protected?boolean?noNeedToRemoveDuplicate(Request?request)?{
????????return?HttpConstant.Method.POST.equalsIgnoreCase(request.getMethod());
??}
public?class?HashSetDuplicateRemover?implements?DuplicateRemover?{
?
????private?Set?urls?=?Collections.newSetFromMap(new?ConcurrentHashMap());
?
????@Override
????public?boolean?isDuplicate(Request?request,?Task?task)?{
????????//add成功,說(shuō)明沒(méi)有添加過(guò)這條請(qǐng)求,返回true
????????return?!urls.add(getUrl(request));
????}
?
????protected?String?getUrl(Request?request)?{
????????return?request.getUrl();
????}
?
????@Override
????public?void?resetDuplicateCheck(Task?task)?{
????????urls.clear();
????}
?
????@Override
????public?int?getTotalRequestsCount(Task?task)?{
????????return?urls.size();
????}
}





粉絲福利:實(shí)戰(zhàn)springboot+CAS單點(diǎn)登錄系統(tǒng)視頻教程免費(fèi)領(lǐng)取

???

?長(zhǎng)按上方微信二維碼?2 秒
即可獲取資料



感謝點(diǎn)贊支持下哈?

瀏覽 43
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)
評(píng)論
圖片
表情
推薦
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 91成人三级| 国产视频在线播放| 欧美第一视频| 日本不卡一区二区三区四区 | 久久久久久大香蕉| 欧美性大香蕉| 亚洲777| 日本免费中文字幕| 亚洲精品秘一区二区三小| 囯产精品一区二区三区AV做线 | 亚洲欧美大香蕉视频网| 最近最好的2019中文| 亚洲精品久久久久久久久久久| 亚洲AV毛片成人精品网站| 色欲成人AV| 在线看片a| 精品少妇人妻| 欧美日韩国产精品成人| 一级a性色毛片| 欧美成人网址在线观看| 欧美日韩国产a| 三级片视频网站| 岛国A片| 青娱乐在线视频精品| 青草久久网| 东京热观看| 安徽少妇搡bbw搡bbbb| 东京热高清无码| 亚洲在线视频免费观看| 毛片成人网| 天堂va欧美ⅴa亚洲va一夜 | 国产美女精品视频| 成年视频在线观看| 白丝久久| 麻豆天美传媒AV果冻传媒| 欧美成人精品AAA| 欧美成人午夜| 97人妻无码| 五月黄色电影| 99re这里只有精品6| 色狠狠AV| 久久91av| 啪啪啪免费网站| 欧美一级特黄A片免费看视频小说| 国产亚洲一区二区三区| 日本中文字幕免费| 91免费网站在线观看| 高潮喷水无码| 亚洲一区自拍| 豆花精品视频| 日韩AAA在线| 97无码| 欧美午夜福利视频| 色五月婷婷五月| 国产V在线观看| 日产电影一区二区三区| 天天搞天天干| 久久久国产精品在线| 2017天天射| 久久九九免费视频| 夜夜爱爱| 浙江妇搡BBBB搡BBBB| 青青草无码视频| 操逼一级| 中文字幕人妻互换av久久| 人人澡人人爽| 成人电影无码| 色噜噜人妻丝袜无码影院| 成人黄网站免费视频| av一区二区在线观看| 男女av在线观看| 黄色毛片av| 91愛爱| 在线观看无码| 国产激情久久| 中文无码AV| 嫩草av| 久久91视频| 成人爽a毛片一区二区免费| 欧美特黄AAAAAAAAA片| 欧美亚洲日韩一区二区三区| 精品国产成人a在线观看| 免费一级大片| 台湾无码片| 91丨牛牛丨国产人妻| 国产综合网站| 很色很黄的A片一| 国产无遮挡A片又黄又爽小直播| 亚洲女人被黑人巨大的原因| 亚洲三级片在线视频| 国产成人无码在线| 国产精品国产精品国产专区不| 一道本视频| 簧片在线免费观看| 九九久久99| 日韩人妻丝袜中文字幕| 天天看A片| 先锋影音在线| 国产九九在线视频| 国产亚洲欧洲| 精品蜜桃秘一区二区三区在线播放| 色婷婷av在线| 免费观看在线无码视频| 无码欧美成人AAAA三区在线| 福利无码| 亚洲69视频| 先锋影音资源一区| 亚洲中文字幕电影| 操逼视频欧美| 色欧美亚洲| 色综合天天综合网国产成人网| 伊人国产视频| 亚洲男人的天堂网| 91精片| 中文字幕日本无码| 国产毛片777777| 国产久久在线观看| 日本一级大片| 水蜜桃视频免费| 久久婷婷综合网| 亚洲黄色视频在线| 美女黄色免费网站| 91久久婷婷国产| 亚洲小视频在线| 久草热在线| 91成人视频在线播放| 午夜成人av| 91久久久无码国产一区二区三区| 18禁www| 婷婷啪啪| 在线黄网| 性A免费在线播放| 人人搞人人摸| 西西WWW888大胆无码| 久久日韩操| 爱搞视频在线播放| 美女被操面费网站| 水多多成人免费A片| 波多野结衣视频无码| 欧美国产中文| 亚洲在线成人| 俺来俺也去www色在线观看| 欧美在线无码| 日本欧美一级| 最新国产在线| 91在线日韩| 超碰精品在线| 亚洲操操操| 超碰青娱乐| 风情万种AV| 四川少妇搡bbbb搡bbbb | 婷婷色网| 国产成人无码毛片| 中文字幕精品久久久久人妻红杏Ⅰ | 中文字幕激情精品| se婷婷| 色猫AV| 真实野外打野视频| 在线观看免费黄网站| 麻豆蜜桃wwww精品无码| 五月天啪啪| 日本爱爱小视频| A片在线观看视频| AA无码| 成人A片视频| 最新午夜综合福利视频| 欧美日韩四区| 黄色小视频免费| 九九九av| 俺也日| 亚洲va中文字幕| 蜜臀久久久久久999| 在线观看高清无码视频| 99在线免费视频| 波多野结衣成人网站| 边摸边插| 黄色一级大片在线免费看国产| 激情久久AV一区AV二区AV三区 | 成人黄色录像| 日韩成人观看| 欧美V| 97国产精品视频人人做人人爱 | 国产精品扒开腿做爽爽爽视频| 安徽妇搡BBBB搡BBB| 亚洲综合91| 日韩av一级| 午夜成人精品视频| 伊人激情| 又粗又硬又爽18级A片| 青青操天天干| 国产男人天堂| 国产精品一区二区不卡| 免费一级做a爱片毛片A片小说 | 翔田千里与黑人50分钟| 久久艹综合网| 大肉大捧视频免费观看| 人人做人人操| 国产成人视频免费观看| 精品国产久久久| 国产96在线亚洲| 五月丁香视频在线| 精品亚洲成人| 天天爽天天搞| 亚洲视频二区| 欧美性爱精品一区| 亚洲码AV波多野| 激情五月俺也去| 俺操也| 亚洲欧洲综合| 亚洲日本高清| 亚洲性爱小说| 学生妹内射| 日韩丰满人妻| 国产精品揄拍一区二区| 蜜桃成人无码区免费视频网站| 午夜福利1000| 国产调教视频| 国产视频福利| 九九色播| 色悠悠国产| 欧美丰满美乳XXⅩ高潮www| 国产56页| 五月天av在线观看| 在线乱视频| www.人人摸| 色婷婷在线视频观看| 日本超碰| 中文日韩| 国产精品美女在线观看| 91视频人人| 永久黄网站| 天堂精品在线| 国产精品精品| 午夜狠狠操| 91探花秘入囗| 国产亚洲视频免费观看| 亚洲人人爱| 亚洲第一色在线| 北条麻妃无码在线播放| 亚洲韩国中文字幕| 亚洲无码理论片| 无码人妻A片一区二区青苹果| 欧美动态视频| 蜜桃视频一区二区三区| 夜夜撸夜夜操| 国产亚洲天堂| 日韩黄片视频| 久草视频在线资源| 色色网站在线观看| 国产精品色视频| 丰滿老婦BBwBBwBBw| 亚洲AV无码成人精品区东京热| 黄频视频| 日本親子亂子倫XXXX50路| 一区二区不卡| 日韩免费性爱视频| 黄片无遮挡| 天天av天天av天天爽| 欧美自拍视频| 黄色日逼网站| 国产日韩欧美视频| 天天干天天摸| 免费日B视频| 日本精品在线播放| 日韩精品人妻中文字幕有| 伊人春色av| 91无码人妻一区二区成人aⅴ| 日韩一级在线| 玖玖91| 久热视频在线| 欧美亚洲| 亚洲性爱一区二区三区| 国产成人亚洲综合AV婷婷| av无码在线播放| 欧美激情性爱网站| 色网站操逼| 麻豆91精品人妻成人无码| 特特级毛片| 成人精品秘免费波多野结衣| 亚洲第一av| 免费看三级网站| 一级午夜福利| 久久精品三级片| 午夜福利sw| 免费看黄的网站在线观看| 永久免费一区二区三区| 嫩BBB搡BBBB搡BBBB| 色五月AV| 久操久操| 91探花秘入囗| 欧美丰满老熟妇XXXXX性| 脓肿是什么原因引起的,该怎么治疗 | 亚洲女同在线| 91麻豆精品国产91久久久久久 | 午夜性福利| 大香蕉一级红色片青青河边草 | 成人做爰100片免费着| 欧美成人黄色A片| 在线人妻| 少妇搡BBBB搡BBB搡毛片少妇| 日韩人妻视频| 色欲天天网| 黄色无码av| 久久久999| 成人免费av| 91成人导航| 女孩自慰在线观看| 五月天三级片| www黄色视频| AV777777| 成人免费视频国产免费麻豆,| AAAA毛片视频| 国产免费观看视频| 亚洲无码在线播放| 热久久久久久| 欧美夜夜| 西西www444无码免费视频| 狠狠干狠狠爱| 九九色综合| 18禁在线播放| 亚洲va欧美va天堂v国产综合 | 国产免费操逼视频| 中文字幕亚洲日韩| AV无码免费观看| 日韩一二三区| 玖玖91| 国产AV久久| 伊人久久狼人| 欧美日韩中文字幕在线视频| 一区二区三区在线观看| 视频一区中文字幕| 四虎成人网站| 欧美日韩色视频| 天天插天天射| 中文在线а√天堂8| 欧美在线成人视频| 国产人国产视频成人免费观看…| 免费啪啪网| www.色婷婷| 中文字幕免费在线观看视频| 三级网址在线观看| 人人爽人人操人人爱| 久久艹视频| 一本色道久久综合狠狠躁| 亚洲国产天堂| 手机免费Av| 91人妻人人爽人人澡人人爽 | 成人网站免费视频| 国产成人精品八戒| 亚洲无码p| 免费黄片在线| 国产电影一区二区三区| 97视频福利| 搡老熟女-91Porn| 亚洲精品色图| 97色在线| 精品久久久久久久久久| 乱伦小说五月天| 手机看片日韩| 奇米狠狠777| 欧美黄色片在线观看| 日逼高清视频| 成人视频无码| 91精品久久久久久综合五月天| 操少妇视频| 五月丁香视频在线| 北条麻妃在线观看| 欧美操大逼| 亚洲手机视频| AV婷婷在线| 三级高清无码| 啊啊啊亚洲| 国产精品国产成人国产三级| 亚洲无码在线精品| 欧美精品秘一区二区三区蜜臀| 免费在线观看亚洲| 成人无码中文字幕| 麻豆AV免费看| 欧美一卡二卡| 老女人网站| 日韩精品一区二区三区免费观看高清| 五月琪琪| 制服毛片| 免费一级A片在线播放| 综合久久av| 中国操逼| 精国产品一区二区三区A片| 韩国中文无码| 色婷婷av| 中文字幕日韩成人| 围内精品久久久久久久久久‘变脸 | 国产乱国产乱老熟300视频| 91在线免费视频观看| 熟女人妻一区二区三区免费看| 日韩一区二区免费视频| 国产一区视频18| 人人妻人人爽人人精品| 水蜜桃一区二区三区| 日韩A片在线观看| 国产乱子伦一区二区三区免看| 91在线观看高清18| 青青草成人电影| 香蕉成人视频| 成人在线黄色| 人人爱久久| 精品国产三级| 秋霞福利影院| 青青在线视频| 日韩在线播放视频| 亚洲高清无码在线观看视频| 国产又爽又黄免费视频免费| 国产又爽又黄视频| 99久久久| 国产综合一区二区| 日产精品久久| 婷婷伊人大香蕉| 日韩国产三级| 亚洲性爱电影| 亚洲AA| 黄色A网站| 国产精品a片| 无码三级av| 蜜桃视频网| 久草手机视频在线观看| 爆菊花综合网| 一级片| 女人18片毛片90分钟免费明星| 日批视频| 天天综合7799| 国产精品乱码一区二区三区| 亚洲午夜福利在线观看| 亚洲字幕av| 成人伦理聚合| 婷婷五月天无码| 白天操夜夜操| 东京热无码视频| 边吃边摸| 女人BBBB| 国产色视频| 国产黄色视频在线观看免费 | 人人操碰人人| 国产在线h| 国产一道本| 亚洲黄色在线| 日韩小视频在线| 欧美最猛黑A片黑人猛交蜜桃视频| 亚洲中文字幕AV| 日韩一级片免费观看| 国产美女久久久| 日韩在线电影| 三级片男人的天堂| 日本一级理论片在线大全| 91精品网站| 黄色成人在线观看视频| 欧美A级视频在线观看| 美日韩中文字幕| 青娱乐成人电影| 免费岛国av大片| 18毛片| 熟女熟妇人妻一区二区三区| 国产美女精品久久AV爽| 国精产品一品二品国精| 亚州无码精品| 国产激情免费| 婷婷五月在线观看| 丁香五月婷婷中文字幕| 五月亚洲六月婷婷| 第一色影院| 99九九视频| 俺也来俺也去WWW色| 色五月在线| 男人av在线| 免费视频久久久| 国产精品内射| 91亚洲精品乱码久久久久久蜜桃| 成人精品秘久久久按摩下载| 国产欧美综合在线三区| 在线无码av| 午夜福利100理论片| 欧美性猛交XXXX乱大交| www.高清无码| 精品人妻一区二区三区在线视频不卡 | 三级毛片在线| 人妻三级| 成人欧美一区二区三区黑人免费 | 一本到在线视频| 特级西西| 亚洲视频在线观看免费| 91亚洲高清| 亚洲日韩精品无码| 亚洲精品字幕久久久久| 俺去夜| 在线内射视频| 午夜美女福利视频| 午夜无码鲁丝片午夜精品一区二区| 亚洲AV无码一区| BBB搡BBB搡BBB搡BBB| 日韩成人无码影片| av资源在线| 美女肏逼| 亚洲无码AV在线观看| 91蜜臀在线| 另类性姿势BBwBBW| 国产黄色免费观看| av无码精品一区| 爱爱视频无码| a片免费在线观看| 北条麻妃在线观看| www久久99| 日韩在线小电影| 无码少妇| 在线色| AV黄页| 91欧美精品成人AAA片| 久久久久久国际四虎免费精品视频| 久久久777| 国产女人18毛片水18精品| 天天草天天爽| 男同人到爽无套狂欢| 欧美成人猛片AAAAAAA| 五月婷婷丁香在线| 鲁一鲁在线视频| 操逼电影免费| 精品福利在线观看| 国产精品热| 影音先锋成人无码| 国产亚洲精品久久久波多野结衣 | 人人妻人人上| 丁香婷婷久久久综合精品国产| 国产一级大片| 精品在线一区| 九九小视频| 黄色草莓视频| 午夜精品18视频国产17c| 大香蕉伊人综合| 三级自拍| 青青草伊人大香蕉| 91香蕉网站| 99热精品免费在线观看| 欧美三级视频在线观看| 在线天堂AV| 激情无码一区二区三区| 51嘿嘿嘿国产精品伦理| 午夜视频在线| 久久国产免费| 操逼视频在线看| 密臀久久| 男人天堂视频在线| 肉色超薄丝袜脚交一区二区| 91丝袜一区二区| 最新av在线| 久久久久久久网站| 欧美精品性爱视频| 午夜丁香婷婷| 欧美成人精品A片免费一区99| 久久加勒比| 久久美女视频| 亚洲秘无码一区二区三区蜜桃中文 | 北条麻妃在线观看| 婷婷射图| 日本一级黄| 午夜福利免费在线观看| 久久68| 美女被操免费网站| 九九热免费视频| 久久久久久综合| 午夜黄色视频在线观看| 亚洲国产中文字幕在线播放| 国产18女人水真多免费看| 五月丁香六月| 日韩无码一二三| 国产主播在线播放| 十八禁视频在线观看网站.www| 日韩三级片在线播放| 亚洲一道本在线| 久久久久久三级电影| 97人人操| 日本A级视频| 台湾成人视频| 中文字幕在线免费播放| 亚洲一区翔田千里无码| 先锋AV资源站| 中文字幕精品综合| 亚洲欧美在线综合| 18禁黄网站| 日韩精品一区二区三区使用方法| 亚洲在线视频免费观看| 免费在线观看黄色片| 7799精品视频天天看| 69福利| 粉嫩99精品99久久久久久特污兔 | 人人操人人摸人人射| 杨晨晨不雅视频| 中文无码日韩欧美久久| 一级黄色电影在线观看| jizz在线免费观看| 欧美色图网站| 中文三级片| 中文AV在线播放| 国产ts在线| 九九九九精品| 狠狠的操| 丁香五月天婷婷久久| 99久久亚洲精品日本无码| 日韩无码国产精品| 91绿帽人妻-ThePorn| 高清无码在线不卡| 91热久久| 国产av网站大全| 午夜成人亚洲| 亚洲色婷婷久久精品AV蜜桃| 日本中文字幕在线免费观看| 美国黄色A片| 久久国产毛片| 日韩人妻中文| 草草在线视频| 日韩欧美国产高清91| 躁BBB躁BBB躁BBBBBB日| 国产精品久久久久国产A级| 日韩欧美中文字幕视频| 婷婷成人视频| 亚州天堂网| 国产精品久久久久久久久夜色| 最好看的MV中文字幕国语| 精品视频在线免费观看| 黑人无码| 国产性爱一级片| 久久久久一区二区三区| 久久男人| 成人精品永久免费视频99久久精品| 亚洲成人网在线观看| 大香蕉国产精品视频| 91超碰久久在线| 狠狠干婷婷| 欧美成人看片黄a免费看| 四川少妇搡bbw搡bbbb| 国产污视频在线观看| 人妻操逼视频| 欧美一级生活片| 影音先锋色色| 乱伦乱伦乱伦中文字幕| 久久久精品久久| 97资源网站| 日韩无码久| 99精品视频播放| 牛牛成人在线视频| 国产婷婷久久Av免费高清| 黑人无码| 成人福利视频| 黄色视频| www.91av| 无码国产精品一区二区三| 日韩AV在线免费观看| 日韩性爱在线| 亚洲av网站| 国产无码内射| 日韩精品在线观看视频| 精品乱伦| 蕉久中文字慕| 欧美高清在线综合| 日本一级按摩片免费观看| 伊人久久综合| 日韩精品高清中文| 操碧一区| 中国免费视频高清观看| 操青青| 久久久XXX| 久操免费在线| 天堂vs亚洲| 日本不卡在线观看| 日韩AV电影网| 久久性爱免费视频| h在线网站| 国产精品7777| 欧美日韩成人网站| 视频一区二| 国产AⅤ无码一区二区| 3p视频网站| 中文字幕日本人妻| av无码一区二区| 国产精品秘久久久久久一两个一起| 在线国产91| 天天肏天天肏| 神马影院午夜福利| 欧美色视频在线观看| 成人无码人妻| 韩国无码一区二区三区| 怡红院男人天堂| 亚洲AV第二区国产精品| 泄火熟妇2-ThePorn| 日本二区| 国产精品三级片| 欧美成人一区免费视频| 人人摸人人操人人摸| 日韩A区| 成人三级片视频| 婷婷伊人久操网| 北岛玲丝袜办公室高跟| 精品一区二区免费| 日本亲子乱婬一级A片| 在线免费观看网站| 亚洲人天堂| 日韩毛片中文字幕| 七十路の高齡熟妇无码| 一起操在线| 波多野结衣成人视频| 无码人妻AⅤ一区二区三区A片一| 色色色色色欧美| 国产免费操逼| 亚洲中文字幕第一| 在线观看中文字幕一区| 欧美亚洲国产视频| 天天射夜夜操| 丰满岳乱妇一区二区三区全文阅读| 久久久久久性爱| 日韩精品电影| 污视频在线免费观看| 亚洲AV影院| 午夜福利啪啪啪| 翔田千里在线一区二区三区| 午夜av电影| 国产av天天| 在线观看的AV| 91成人看片| 国产精品一区二区性色AV| 成人小视频在线观看| 黄色小电影在线观看| 日本一级A片| 婷婷丁香人妻天天爽| 欧美三级性爱视频| 国产天堂在线观看| 午夜福利100理论片| 成人福利午夜A片公司| 日本免费在线观看| 欧美性爱在线视频| 日韩三级毛片| 性爱久久久| 超碰91免费在线观看| 搡BBB搡BBBB搡BBBB'| 一个人看的视频www| 无码在线不卡| 久久成人综合| 高清无码视频免费观看| 高清无码免费视频| 在线观看黄色片| 欧美色性乐汇操日本娘们| 久久婷婷婷| 五月天久久久久久久| 国产精品码ls字幕影视| 五月天丁香网| 人妻天天爽| 国产精品成人无码免费| 午夜操逼| 69视频在线观看免费| 天天射天天日天天干| 国产黄色视频免费在线观看| 日韩A√| 婷婷五月天亚洲| 99精品视频在线| 日韩A区| 国产91在线看| 99天天操| 精品人妻一区二区蜜桃视频| 东方AV在线观看| 天天射天天干| 中文字幕亚洲观看| 53岁露大奶熟女偷情贴吧| 日韩在线视频一区二区三区 | 国外成人视频| 国产色婷婷一区二区| 黄色草莓视频| 日本牲交| 乱伦网址| 中文字幕无码在线播放| 一级操逼黄色视频| 揄拍成人国产精品视频| 天天天天日天天干| 无码视频韩国| 国产精品久久久精品| 久久久一区二区三区四曲免费听| 狼友视频在线看| 中文字幕日本成人| 中文成人无字幕乱码精品区| 中国字幕在线观看韩国电影| 在线观看免费黄色视频| 国产精品视频你懂的| 亚洲熟妇AV日韩熟妇在线| 九九九九国产| 日本a级视频| 被黑人猛躁4O次高潮| 超碰毛片| 久久久波多野结衣| 日韩人妻中文| 蜜臀久久99精品久久久电影| 免费精品黄色网页| 操操操操| 老熟妇搡BBBB搡BBBB| 午夜成人视频| 91无码视频| 色老板av| 一级黄视频| a在线观看视频| 99热这里都是精品| 中文无码网站| 五十路老国产| 国产操逼视频网站| yw在线观看| 亚州精品成人片| 一本加勒比HEZYO东京热无码| 精品1区| www.色老板| 一道本视频在线免费观看| 可以看的毛片| 91亚洲精品久久久久久久久久久久 | 91在线无码精品秘入口电车| 亚洲成人内射| 亚洲无码网| footjobvk| 国产中文字字幕乱码无限| 99Re66精品免费视频| 一级黄色视频网站| 69成人导航| 色婷婷一二三精品A片| 黄片免费视频观看| 刘玥91精品一区二区三区| 国产一毛a一毛a在线观看| 日韩av第一页| 亚洲图片一区| 亚洲小电影| AV操逼网| 午夜理伦| 国产激情无码视频| 日韩三级在线免费观看| 日日操人人操| 亚洲中文字幕影院| 浙江妇搡BBBB搡BBBB| 伊人三级片| 欧美一级在线免费观看| 一级A片| 蜜桃久久久亚洲精| 日本亚洲中文字幕| 国产精品免费看| 国产在线观看免费成人视频 | 亚洲天堂高清| 亚洲精品视频无码| 内射学生妹视频| 日本色网址| 亚洲AV激情无码专区在线播放| AⅤ中文字幕在线免费观看| 日韩国产三级| 免费看国产黄色视频| 操逼视频在线| 大香蕉中文视频| 国产一级片在线| 欧美精品久久久久久久多人混战| 久碰人妻人妻人妻| 亚洲性爱在线播放| 免费黄色在线视频| 国产1区在线观看| 初尝人妻滑进去了莹莹视频| 欧美日韩黄色| 爱爱高清视频| 精品无码视频在线观看| 91久久国产| 久热只有精品| 天码人妻一区二区三区在线看| 亚洲精品视频无码| 国产一级a毛一级a做免费的视频 | 17c.白丝喷水自慰| 欧美自拍视频| 欧美精产国品一二三区别| 99黄色视频| 青娱乐国产精品| 免费在线观看无码视频| 国产在线第一页| 国产搡BBB爽爽爽视频| 欧美性爱怡红院| 午夜aaa| 成人AV一AV二| 丁香五月天在线视频| 黄色日逼视频| 国产农村乱婬片A片AAA图片 | 在线观看国产| 一区二区三区福利| 超碰九九| 精品國產一區二區三區久久蜜月| 色婷婷18正码国产| 污网站免费在线观看| 国内自拍2025| 日日操夜夜| 欧美成人网站在线观看| 欧美+日产+中文| 伊人成年网| 91外围女视频| 天天干91| 国内免费AV| 国产日韩性爱视频| 青草无码| 最新av在线| 婷婷五月天免费视频|