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

微博爬蟲“免登錄”技巧詳解及Java實現

開發
本文詳細介紹如何獲取相關的Cookie并重新封裝Httpclient達到免登錄的目的,以支持微博上的各項數據抓取任務。

一、微博一定要登錄才能抓取?

目前,對于微博的爬蟲,大部分是基于模擬微博賬號登錄的方式實現的,這種方式如果真的運營起來,實際上是一件非常頭疼痛苦的事,你可能每天都過得提心吊膽,生怕新浪爸爸把你的那些賬號給封了,而且現在隨著實名制的落地,獲得賬號的渠道估計也會變得越來越少。

但是日子還得繼續,在如此艱難的條件下,為了生存爬蟲們必須尋求進化。好在上帝關門的同時會隨手開窗,微博在其他諸如頭條,一點等這類新媒體平臺的沖擊之下,逐步放開了信息流的查看權限。現在的微博即便在不登錄的狀態下,依然可以看到很多微博信息流,而我們的落腳點就在這里。

本文詳細介紹如何獲取相關的Cookie并重新封裝Httpclient達到免登錄的目的,以支持微博上的各項數據抓取任務。下面就從微博首頁http://weibo.com開始。

二、準備工作

準備工作很簡單,一個現代瀏覽器(你知道我為什么會寫”現代”兩個字),以及httpclient(我用的版本是4.5.3)

跟登錄爬蟲一樣,免登錄爬蟲也是需要裝載Cookie。這里的Cookie是用來標明游客身份,利用這個Cookie就可以在微博平臺中訪問那些允許訪問的內容了。

這里我們可以使用瀏覽器的network工具來看一下,請求http://weibo.com之后服務器都返回哪些東西,當然事先清空一下瀏覽器的緩存。

不出意外,應該可以看到下圖中的內容

 

第1次請求weibo.com的時候,其狀態為302重定向,也就是說這時并沒有真正地開始加載頁面,而最后一個請求weibo.com的狀態為200,表示了請求成功,對比兩次請求的header:

 

明顯地,中間的這些過程給客戶端加載了各種Cookie,從而使得可以順利訪問頁面,接下來我們逐個進行分析。

三、抽絲剝繭

第2個請求是https://passport.weibo.com/vi...……,各位可以把這個url復制出來,用httpclient單獨訪問一下這個url,可以看到返回的是一個html頁面,里面有一大段Javascript腳本,另外頭部還引用一個JS文件mini_original.js,也就是第3個請求。腳本的功能比較多,就不一一敘述了,簡單來說就是微博訪問的入口控制,而值得我們注意的是其中的一個function:

  1. // 為用戶賦予訪客身份 。 
  2.     var incarnate = function (tid, where, conficence) { 
  3.         var gen_conf = ""
  4.         var from = "weibo"
  5.         var incarnate_intr = window.location.protocol + "//" + window.location.host + "/visitor/visitor?a=incarnate&t=" + encodeURIComponent(tid) + "&w=" + encodeURIComponent(where) + "&c=" + encodeURIComponent(conficence) + "&gc=" + encodeURIComponent(gen_conf) + "&cb=cross_domain&from=" + from + "&_rand=" + Math.random(); 
  6.         url.l(incarnate_intr); 
  7.     };  

這里是為請求者賦予一個訪客身份,而控制跳轉的鏈接也是由一些參數拼接起來的,也就是上圖中第6個請求。所以下面的工作就是獲得這3個參數:tid,w(where),c(conficence,從下文來看應為confidence,大概是新浪工程師的手誤)。繼續閱讀源碼,可以看到該function是tid.get方法的回調函數,而這個tid則是定義在那個mini_original.js中的一個對象,其部分源碼為:

  1.  var tid = { 
  2.         key'tid'
  3.         value: ''
  4.         recover: 0, 
  5.         confidence: ''
  6.         postInterface: postUrl, 
  7.         fpCollectInterface: sendUrl, 
  8.         callbackStack: [], 
  9.         init: function () { 
  10.             tid.get(); 
  11.         }, 
  12.         runstack: function () { 
  13.             var f; 
  14.             while (f = tid.callbackStack.pop()) { 
  15.                 f(tid.value, tid.recover, tid.confidence);//注意這里,對應上述的3個參數 
  16.             } 
  17.         }, 
  18.         get: function (callback) { 
  19.             callback = callback || function () { 
  20.             }; 
  21.             tid.callbackStack.push(callback); 
  22.             if (tid.value) { 
  23.                 return tid.runstack(); 
  24.             } 
  25.             Store.DB.get(tid.keyfunction (v) { 
  26.                 if (!v) { 
  27.                     tid.getTidFromServer(); 
  28.                 } else { 
  29.                     …… 
  30.                 } 
  31.             }); 
  32.         }, 
  33.     …… 
  34.     } 
  35. …… 
  36.  getTidFromServer: function () { 
  37.             tid.getTidFromServer = function () { 
  38.             }; 
  39.             if (window.use_fp) { 
  40.                 getFp(function (data) { 
  41.                     util.postData(window.location.protocol + '//' + window.location.host + '/' + tid.postInterface, "cb=gen_callback&fp=" + encodeURIComponent(data), function (res) { 
  42.                         if (res) { 
  43.                             eval(res); 
  44.                         } 
  45.                     }); 
  46.                 }); 
  47.             } else { 
  48.                 util.postData(window.location.protocol + '//' + window.location.host + '/' + tid.postInterface, "cb=gen_callback"function (res) { 
  49.                     if (res) { 
  50.                         eval(res); 
  51.                     } 
  52.                 }); 
  53.             } 
  54.         }, 
  55. …… 
  56. //獲得參數 
  57. window.gen_callback = function (fp) { 
  58.         var value = false, confidence; 
  59.         if (fp) { 
  60.             if (fp.retcode == 20000000) { 
  61.                 confidence = typeof(fp.data.confidence) != 'undefined' ? '000' + fp.data.confidence : '100'
  62.                 tid.recover = fp.data.new_tid ? 3 : 2; 
  63.                 tid.confidence = confidence = confidence.substring(confidence.length - 3); 
  64.                 value = fp.data.tid; 
  65.                 Store.DB.set(tid.key, value + '__' + confidence); 
  66.             } 
  67.         } 
  68.         tid.value = value; 
  69.         tid.runstack(); 
  70.     };  

顯然,tid.runstack()是真正執行回調函數的地方,這里就能看到傳入的3個參數。在get方法中,當cookie為空時,tid會調用getTidFromServer,這時就產生了第5個請求https://passport.weibo.com/vi...,它需要兩個參數cb和fp,其參數值可以作為常量:

 

該請求的結果返回一串json

  1.   "msg""succ"
  2.   "data": { 
  3.     "new_tid"false
  4.     "confidence": 95, 
  5.     "tid""kIRvLolhrCR5iSCc80tWqDYmwBvlRVlnY2+yvCQ1VVA=" 
  6.   }, 
  7.   "retcode": 20000000 
  8.  

其中就包含了tid和confidence,這個confidence,我猜大概是推測客戶端是否真實的一個置信度,不一定出現,根據window.gen_callback方法,不出現時默認為100,另外當new_tid為真時參數where等于3,否則等于2。

此時3個參數已經全部獲得,現在就可以用httpclient發起上面第6個請求,返回得到另一串json:

  1.   "msg""succ"
  2.   "data": { 
  3.     "sub""_2AkMu428tf8NxqwJRmPAcxWzmZYh_zQjEieKYv572JRMxHRl-yT83qnMGtRCnhyR4ezQQZQrBRO3gVMwM5ZB2hQ.."
  4.     "subp""0033WrSXqPxfM72-Ws9jqgMF55529P9D9WWU2MgYnITksS2awP.AX-DQ" 
  5.   }, 
  6.   "retcode": 20000000 
  7.  

參考最后請求weibo.com的header,這里的sub和subp就是最終要獲取的cookie值。大家或許有一個小疑問,第一個Cookie怎么來的,沒用嗎?是的,這個Cookie是第一次訪問weibo.com產生的,經過測試可以不用裝載。

 

最后我們用上面兩個Cookie裝載到HttpClient中請求一次weibo.com,就可以獲得完整的html頁面了,下面就是見證奇跡的時刻:

  1. <!doctype html> 
  2. <html> 
  3. <head> 
  4. <meta charset="utf-8"
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"
  6. <meta name="viewport" content="initial-scale=1,minimum-scale=1" /> 
  7. <meta content="隨時隨地發現新鮮事!微博帶你欣賞世界上每一個精彩瞬間,了解每一個幕后故事。分享你想表達的,讓全世界都能聽到你的心聲!" name="description" /> 
  8. <link rel="mask-icon" sizes="any" href="//img.t.sinajs.cn/t6/style/images/apple/wbfont.svg" color="black" /> 
  9. <link rel="shortcut icon" type="image/x-icon" href="/favicon.ico" /> 
  10. <script type="text/javascript"
  11. try{document.execCommand("BackgroundImageCache"falsetrue);}catch(e){} 
  12. </script> 
  13. <title>微博-隨時隨地發現新鮮事</title> 
  14. <link href="//img.t.sinajs.cn/t6/style/css/module/base/frame.css?version=6c9bf6ab3b33391f" type="text/css" rel="stylesheet" charset="utf-8" /> 
  15. <link href="//img.t.sinajs.cn/t6/style/css/pages/growth/login_v5.css?version=6c9bf6ab3b33391f" type="text/css" rel="stylesheet" charset="utf-8"
  16. <link href="//img.t.sinajs.cn/t6/skin/default/skin.css?version=6c9bf6ab3b33391f" type="text/css" rel="stylesheet" id="skin_style" /> 
  17. <script type="text/javascript"
  18. var $CONFIG = {}; 
  19. $CONFIG['islogin'] = '0'
  20. $CONFIG['version'] = '6c9bf6ab3b33391f'
  21. $CONFIG['timeDiff'] = (new Date() - 1505746970000); 
  22. $CONFIG['lang'] = 'zh-cn'
  23. $CONFIG['jsPath'] = '//js.t.sinajs.cn/t5/'
  24. $CONFIG['cssPath'] = '//img.t.sinajs.cn/t5/'
  25. $CONFIG['imgPath'] = '//img.t.sinajs.cn/t5/'
  26. $CONFIG['servertime'] = 1505746970; 
  27. $CONFIG['location']='login'
  28. $CONFIG['bigpipe']='false'
  29. $CONFIG['bpType']='login'
  30. $CONFIG['mJsPath'] = ['//js{n}.t.sinajs.cn/t5/', 1, 2]; 
  31. $CONFIG['mCssPath'] = ['//img{n}.t.sinajs.cn/t5/', 1, 2]; 
  32. $CONFIG['redirect'] = ''
  33. $CONFIG['vid']='1008997495870'
  34. </script> 
  35. <style>#js_style_css_module_global_WB_outframe{height:42px;}</style> 
  36. </head> 
  37. ……  

如果之前有微博爬蟲開發經驗的小伙伴,看到這里,一定能想出來很多玩法了吧。

四、代碼實現

下面附上我的源碼,通過上面的詳細介紹,應該已經比較好理解,因此這里就簡單地說明一下:

  1. 我把Cookie獲取的過程做成了一個靜態內部類,其中需要發起2次請求,一次是genvisitor獲得3個參數,另一次是incarnate獲得Cookie值;
  2. 如果Cookie獲取失敗,會調用HttpClientInstance.changeProxy來改變代理IP,然后重新獲取,直到獲取成功為止;
  3. 在使用時,出現了IP被封或無法正常獲取頁面等異常情況,外部可以通過調用cookieReset方法,重新獲取一個新的Cookie。這里還是要聲明一下,科學地使用爬蟲,維護世界和平是程序員的基本素養;
  4. 雖然加了一些鎖的控制,但是還未在高并發場景實測過,不能保證百分百線程安全,如使用下面的代碼,請根據需要自行修改,如有問題也請大神們及時指出,拜謝!
  5. HttpClientInstance是我用單例模式重新封裝的httpclient,對于每個傳進來的請求重新包裝了一層RequestConfig,并且使用了代理IP;
  6. 不是所有的微博頁面都可以抓取得到,但是博文,評論,轉發等基本的數據還是沒有問題的;
  7. 后續我也會把代碼push到github上,請大家支持,謝謝! 
  1. import com.fullstackyang.httpclient.HttpClientInstance; 
  2. import com.fullstackyang.httpclient.HttpRequestUtils; 
  3. import com.google.common.base.Strings; 
  4. import com.google.common.collect.Maps; 
  5. import com.google.common.net.HttpHeaders; 
  6. import lombok.NoArgsConstructor; 
  7. import lombok.extern.slf4j.Slf4j; 
  8. import org.apache.commons.lang3.StringUtils; 
  9. import org.apache.http.client.config.CookieSpecs; 
  10. import org.apache.http.client.config.RequestConfig; 
  11. import org.apache.http.client.methods.HttpGet; 
  12. import org.apache.http.client.methods.HttpPost; 
  13. import org.json.JSONObject; 
  14.   
  15. import java.io.UnsupportedEncodingException; 
  16. import java.math.BigDecimal; 
  17. import java.net.URLEncoder; 
  18. import java.util.Map; 
  19. import java.util.concurrent.locks.Lock; 
  20. import java.util.concurrent.locks.ReentrantLock; 
  21.   
  22. /** 
  23.  * 微博免登陸請求客戶端 
  24.  * 
  25.  * @author fullstackyang 
  26.  */ 
  27. @Slf4j 
  28. public class WeiboClient { 
  29.   
  30.     private static CookieFetcher cookieFetcher = new CookieFetcher(); 
  31.   
  32.     private volatile String cookie; 
  33.   
  34.     public WeiboClient() { 
  35.         this.cookie = cookieFetcher.getCookie(); 
  36.     } 
  37.   
  38.     private static Lock lock = new ReentrantLock(); 
  39.   
  40.     public void cookieReset() { 
  41.         if (lock.tryLock()) { 
  42.             try { 
  43.                 HttpClientInstance.instance().changeProxy(); 
  44.                 this.cookie = cookieFetcher.getCookie(); 
  45.                 log.info("cookie :" + cookie); 
  46.             } finally { 
  47.                 lock.unlock(); 
  48.             } 
  49.         } 
  50.     } 
  51.   
  52.     /** 
  53.      * get方法,獲取微博平臺的其他頁面 
  54.      * @param url 
  55.      * @return 
  56.      */ 
  57.     public String get(String url) { 
  58.         if (Strings.isNullOrEmpty(url)) 
  59.             return ""
  60.   
  61.         while (true) { 
  62.             HttpGet httpGet = new HttpGet(url); 
  63.             httpGet.addHeader(HttpHeaders.COOKIE, cookie); 
  64.             httpGet.addHeader(HttpHeaders.HOST, "weibo.com"); 
  65.             httpGet.addHeader("Upgrade-Insecure-Requests""1"); 
  66.   
  67.             httpGet.setConfig(RequestConfig.custom().setSocketTimeout(3000) 
  68.                     .setConnectTimeout(3000).setConnectionRequestTimeout(3000).build()); 
  69.             String html = HttpClientInstance.instance().tryExecute(httpGet, nullnull); 
  70.             if (html == null
  71.                 cookieReset(); 
  72.             else return html; 
  73.         } 
  74.     } 
  75.   
  76.      /** 
  77.      * 獲取訪問微博時必需的Cookie 
  78.      */ 
  79.     @NoArgsConstructor 
  80.     static class CookieFetcher { 
  81.   
  82.         static final String PASSPORT_URL = "https://passport.weibo.com/visitor/visitor?entry=miniblog&a=enter&url=http://weibo.com/?category=2" 
  83.                 + "&domain=.weibo.com&ua=php-sso_sdk_client-0.6.23"
  84.   
  85.         static final String GEN_VISITOR_URL = "https://passport.weibo.com/visitor/genvisitor"
  86.   
  87.         static final String VISITOR_URL = "https://passport.weibo.com/visitor/visitor?a=incarnate"
  88.   
  89.         private String getCookie() { 
  90.             Map<String, String> map; 
  91.             while (true) { 
  92.                 map = getCookieParam(); 
  93.                 if (map.containsKey("SUB") && map.containsKey("SUBP") && 
  94.                         StringUtils.isNoneEmpty(map.get("SUB"), map.get("SUBP"))) 
  95.                     break; 
  96.                 HttpClientInstance.instance().changeProxy(); 
  97.             } 
  98.             return " YF-Page-G0=" + "; _s_tentry=-; SUB=" + map.get("SUB") + "; SUBP=" + map.get("SUBP"); 
  99.         } 
  100.   
  101.         private Map<String, String> getCookieParam() { 
  102.             String time = System.currentTimeMillis() + ""
  103.             time = time.substring(0, 9) + "." + time.substring(9, 13); 
  104.             String passporturl = PASSPORT_URL + "&_rand=" + time
  105.   
  106.             String tid = ""
  107.             String c = ""
  108.             String w = ""
  109.             { 
  110.                 String str = postGenvisitor(passporturl); 
  111.                 if (str.contains("\"retcode\":20000000")) { 
  112.                     JSONObject jsonObject = new JSONObject(str).getJSONObject("data"); 
  113.                     tid = jsonObject.optString("tid"); 
  114.                     try { 
  115.                         tid = URLEncoder.encode(tid, "utf-8"); 
  116.                     } catch (UnsupportedEncodingException e) { 
  117.                     } 
  118.                     c = jsonObject.has("confidence") ? "000" + jsonObject.getInt("confidence") : "100"
  119.                     w = jsonObject.optBoolean("new_tid") ? "3" : "2"
  120.                 } 
  121.             } 
  122.             String s = ""
  123.             String sp = ""
  124.             { 
  125.                 if (StringUtils.isNoneEmpty(tid, w, c)) { 
  126.                     String str = getVisitor(tid, w, c, passporturl); 
  127.                     str = str.substring(str.indexOf("(") + 1, str.indexOf(")")); 
  128.                     if (str.contains("\"retcode\":20000000")) { 
  129.                         System.out.println(new JSONObject(str).toString(2)); 
  130.                         JSONObject jsonObject = new JSONObject(str).getJSONObject("data"); 
  131.                         s = jsonObject.getString("sub"); 
  132.                         sp = jsonObject.getString("subp"); 
  133.                     } 
  134.   
  135.                 } 
  136.             } 
  137.             Map<String, String> map = Maps.newHashMap(); 
  138.             map.put("SUB", s); 
  139.             map.put("SUBP", sp); 
  140.             return map; 
  141.         } 
  142.   
  143.         private String postGenvisitor(String passporturl) { 
  144.   
  145.             Map<String, String> headers = Maps.newHashMap(); 
  146.             headers.put(HttpHeaders.ACCEPT, "*/*"); 
  147.             headers.put(HttpHeaders.ORIGIN, "https://passport.weibo.com"); 
  148.             headers.put(HttpHeaders.REFERER, passporturl); 
  149.   
  150.             Map<String, String> params = Maps.newHashMap(); 
  151.             params.put("cb""gen_callback"); 
  152.             params.put("fp", fp()); 
  153.   
  154.             HttpPost httpPost = HttpRequestUtils.createHttpPost(GEN_VISITOR_URL, headers, params); 
  155.   
  156.             String str = HttpClientInstance.instance().execute(httpPost, null); 
  157.             return str.substring(str.indexOf("(") + 1, str.lastIndexOf("")); 
  158.         } 
  159.   
  160.         private String getVisitor(String tid, String w, String c, String passporturl) { 
  161.             String url = VISITOR_URL + "&t=" + tid + "&w=" + "&c=" + c.substring(c.length() - 3) 
  162.                     + "&gc=&cb=cross_domain&from=weibo&_rand=0." + rand(); 
  163.   
  164.             Map<String, String> headers = Maps.newHashMap(); 
  165.             headers.put(HttpHeaders.ACCEPT, "*/*"); 
  166.             headers.put(HttpHeaders.HOST, "passport.weibo.com"); 
  167.             headers.put(HttpHeaders.COOKIE, "tid=" + tid + "__0" + c); 
  168.             headers.put(HttpHeaders.REFERER, passporturl); 
  169.   
  170.             HttpGet httpGet = HttpRequestUtils.createHttpGet(url, headers); 
  171.             httpGet.setConfig(RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD).build()); 
  172.             return HttpClientInstance.instance().execute(httpGet, null); 
  173.         } 
  174.   
  175.         private static String rand() { 
  176.             return new BigDecimal(Math.floor(Math.random() * 10000000000000000L)).toString(); 
  177.         } 
  178.   
  179.         private static String fp() { 
  180.             JSONObject jsonObject = new JSONObject(); 
  181.             jsonObject.put("os""1"); 
  182.             jsonObject.put("browser""Chrome59,0,3071,115"); 
  183.             jsonObject.put("fonts""undefined"); 
  184.             jsonObject.put("screenInfo""1680*1050*24"); 
  185.             jsonObject.put("plugins"
  186.                     "Enables Widevine licenses for playback of HTML audio/video content. (version: 1.4.8.984)::widevinecdmadapter.dll::Widevine Content Decryption Module|Shockwave Flash 26.0 r0::pepflashplayer.dll::Shockwave Flash|::mhjfbmdgcfjbbpaeojofohoefgiehjai::Chrome PDF Viewer|::internal-nacl-plugin::Native Client|Portable Document Format::internal-pdf-viewer::Chrome PDF Viewer"); 
  187.             return jsonObject.toString(); 
  188.         } 
  189.     } 
  190.  
責任編輯:龐桂玉 來源: segmentfault
相關推薦

2019-09-25 17:12:44

2012-05-09 14:02:46

HTML5

2019-10-23 04:37:56

Jschsftp服務器

2015-04-16 10:35:08

微博微博如何實現

2021-11-08 14:38:50

框架Scrapy 爬蟲

2021-11-09 09:46:09

ScrapyPython爬蟲

2018-01-02 16:30:27

Python爬蟲微博移動端

2023-03-09 08:12:08

免登錄實Python腳本

2024-10-28 09:38:15

2012-02-15 17:39:36

2014-11-04 10:30:32

新浪微博可登錄任意賬戶

2021-01-06 10:09:05

Spring Boothttps sslhttps

2015-10-21 11:03:21

ssh登錄Linux

2018-07-02 14:12:26

Python爬蟲反爬技術

2023-10-14 15:29:28

RedisFeed

2015-07-06 13:36:14

Redis微博關注關系

2021-09-29 06:03:37

JavaScriptreduce() 前端

2009-07-31 17:51:42

linux vi命令詳linux vi命令編輯器

2011-12-21 16:19:06

網秦手機安全微博保鏢

2011-12-08 16:31:43

新浪微博開放平臺
點贊
收藏

51CTO技術棧公眾號

中文字幕久久久| 亚洲h精品动漫在线观看| 琪琪亚洲精品午夜在线| 国产精品免费无码| 国产精品99久久久久久董美香 | 亚洲日本中文字幕在线| 亚洲永久免费精品| 日韩在线播放视频| 亚洲欧美日韩偷拍| 国产成人77亚洲精品www| 亚洲一二三专区| 精品色蜜蜜精品视频在线观看| 久久精品电影一区二区| 国产乱国产乱老熟300部视频| zzzwww在线看片免费| 91免费在线视频观看| 国产精品美女久久久久久免费| 26uuu成人网| 日韩有码av| 51精品视频一区二区三区| 蜜臀av无码一区二区三区| 国产精品一区二区三区四区色| 国产一二精品视频| 秋霞成人午夜鲁丝一区二区三区| 国产成人av免费在线观看| 亚洲精品无吗| 精品国精品国产| 污色网站在线观看| 蜜桃在线视频| 亚洲人成精品久久久久| 日韩欧美亚洲日产国| 日韩在线视频观看免费| 国产在线精品一区在线观看麻豆| 奇米4444一区二区三区 | 欧美亚洲激情视频| 久草视频在线资源站| 成人情趣视频网站| 亚洲欧美国产日韩中文字幕| 曰本三级日本三级日本三级| 男人亚洲天堂| 欧美在线综合视频| 国产成人在线免费看| 日本小视频在线免费观看| 中文字幕字幕中文在线中不卡视频| 欧美久久久久久一卡四| 免费观看黄色一级视频| 国产精品一区二区三区乱码| 国产日韩精品综合网站| 日本丰满少妇做爰爽爽| 麻豆成人在线| 欧美亚洲另类在线| 精品欧美一区二区三区免费观看| 欧美视频成人| 久久777国产线看观看精品| 日韩精品一区二区三区丰满| 最新中文字幕免费视频| 性欧美freesex顶级少妇| 亚洲成人动漫一区| 国产毛片久久久久久国产毛片| 主播国产精品| 一区二区视频免费在线观看| 超碰在线免费观看97| 国产激情在线| 尤物av一区二区| 久久www视频| av在线加勒比| 激情av一区二区| 国产99久久九九精品无码| 亚洲天堂手机| 色婷婷激情久久| 91激情视频在线| 亚洲电影有码| 欧美精品一二三| 日韩精品视频网址| 日本精品一区二区三区在线观看视频| 欧美一卡二卡在线观看| 老熟女高潮一区二区三区| eeuss鲁片一区二区三区| 日韩成人在线视频| 国产成人精品无码免费看夜聊软件| 国产精品欧美日韩一区| 深夜福利一区二区| 国产高潮流白浆| 99av国产精品欲麻豆| 日本亚洲欧洲色α| 91亚洲国产成人久久精品麻豆| 国产精品一区久久久久| 国产欧美精品一区二区三区| 涩涩视频在线观看免费| 国产精品水嫩水嫩| 亚洲av综合色区| 成年男女免费视频网站不卡| 色妹子一区二区| 超碰91在线播放| 激情小说一区| 在线性视频日韩欧美| 玖玖爱这里只有精品| 亚洲久久一区| 国产精品人人做人人爽| 99免费在线视频| 久久久综合九色合综国产精品| 精品中文字幕视频| 国产无套精品一区二区| 好吊色一区二区三区| 国产午夜精品福利| 男人添女荫道口喷水视频| 人人视频精品| 日韩欧美自拍偷拍| 一区二区黄色片| 欧美精品国产| 国产精品免费视频xxxx| 亚洲国产精品二区| 国产精品拍天天在线| 黄页免费在线观看视频| 欧美韩国日本| 亚洲美女精品久久| 欧美xxxx黑人xyx性爽| 视频在线观看91| 国产精品国产精品国产专区蜜臀ah | 欧美尤物美女在线| 欧美日韩在线第一页| 免费看的av网站| 欧美日韩中文字幕一区二区三区| 欧美激情视频网站| 一级α片免费看刺激高潮视频| bt7086福利一区国产| 黄色网址在线免费看| 日本欧美韩国| 日韩精品高清在线| 国产无遮无挡120秒| 国产一区二区三区免费在线观看| 茄子视频成人在线观看 | 天堂网在线中文| 亚洲少妇屁股交4| 69久久久久久| 国产乱码精品一区二区三区四区| 午夜精品福利电影| jlzzjlzzjlzz亚洲人| 国产精品美女www爽爽爽| 97视频在线免费播放| 国产区精品视频在线观看豆花| 北条麻妃99精品青青久久| 人妻中文字幕一区二区三区| 2019国产精品| 国产视频九色蝌蚪| 国产毛片精品| 91精品国产免费久久久久久| 日本在线播放一区| 精品国产av一区二区三区| 国产精品久久毛片a| 日本www.色| 欧美一二区在线观看| 秋霞成人午夜鲁丝一区二区三区| 手机av免费在线观看| 五月婷婷另类国产| 奇米777第四色| 最新国产拍偷乱拍精品| 国产一区福利视频| 无码小电影在线观看网站免费| 日韩电影大全免费观看2023年上| 日本特黄特色aaa大片免费| 成人国产精品视频| 欧美不卡在线播放| 日韩mv欧美mv国产网站| 2018中文字幕一区二区三区| 午夜av免费观看| 欧美日韩午夜剧场| 国产手机在线观看| 免费观看成人鲁鲁鲁鲁鲁视频| 亚洲欧美日韩另类精品一区二区三区| 成人高清一区| 久久视频在线直播| www夜片内射视频日韩精品成人| 一区二区三区四区五区视频在线观看 | 国产www视频在线观看| 精品91自产拍在线观看一区| 伊人久久综合视频| 久久九九国产精品| 亚洲精品www.| 狠狠噜噜久久| 久久久久久九九| yy6080久久伦理一区二区| 麻豆成人在线看| 黄色av一区二区三区| 狠狠色狠狠色综合日日五| av永久免费观看| 国模无码大尺度一区二区三区| 日韩极品视频在线观看| 国产一区二区三区不卡视频网站| 成人xvideos免费视频| 免费在线观看的电影网站| 亚洲精选中文字幕| 国产精品久久久久久免费免熟| 亚洲精品videosex极品| 爱爱免费小视频| 国产一区在线视频| 欧美 日韩 国产在线观看| 瑟瑟视频在线| 免费视频最近日韩| 午夜啪啪免费视频| 久久亚洲道色| 国产精品在线看| 国产丝袜精品丝袜| 在线日韩精品视频| 噜噜噜久久,亚洲精品国产品| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 国产精品久久久久久久精| 91在线视频官网| 欧美国产在线一区| 日韩中文字幕不卡| 久久久久久人妻一区二区三区| 日本午夜一区| 国产综合精品一区二区三区| 伊人亚洲精品| 国产成人一区二区在线| 97蜜桃久久| 欧美大码xxxx| yourporn在线观看中文站| 精品国产乱码久久久久久图片| 这里只有精品999| 精品久久久久久久久久| 日韩视频中文字幕在线观看| 国产日韩欧美在线一区| 私密视频在线观看| 国产一区福利在线| 欧美日韩在线成人| 亚洲茄子视频| 黄色一级片黄色| 在线精品国产| 亚洲精品tv久久久久久久久| 欧美黄色录像| 国产精品免费看一区二区三区| 99精品美女视频在线观看热舞| 国产精品第一视频| 成人爽a毛片免费啪啪| 97精品久久久| 国产精品69xx| 欧美成人午夜免费视在线看片| 98在线视频| 中文字幕久精品免费视频| 九九热视频在线观看| 亚洲九九九在线观看| 亚洲欧美色视频| 日韩精品高清在线观看| 天堂中文在线资源| 精品99一区二区| 蜜桃视频污在线观看| 亚洲成人三级在线| 东京干手机福利视频| 欧美成人精品1314www| 精品黑人一区二区三区在线观看 | 亚洲少妇屁股交4| 国产aaaaaaaaa| 中文幕一区二区三区久久蜜桃| 国产jk精品白丝av在线观看| 久久综合色一综合色88| www.久久国产| 国产亚洲人成网站| 黄免费在线观看| 国产精品拍天天在线| 少妇高潮在线观看| 综合久久久久久| 欧美人妻一区二区| 五月天亚洲婷婷| 亚洲第一在线播放| 一本到不卡免费一区二区| 无码人妻丰满熟妇区bbbbxxxx| 色综合久久精品| 在线观看国产精品视频| 3d动漫精品啪啪一区二区竹菊| 国产日韩欧美视频在线观看| 日韩精品一区二区三区视频播放| 丰满人妻一区二区三区免费视频| 亚洲精美色品网站| 精品乱码一区二区三四区视频 | 日本少妇高潮喷水xxxxxxx| 久久精品欧美一区二区三区麻豆| 性欧美精品男男| 亚洲天堂免费看| 久久久久久久久久久久国产| 黑人巨大精品欧美一区二区一视频| 成人a v视频| 3d成人动漫网站| 色婷婷激情五月| 亚洲午夜色婷婷在线| 超碰人人在线| 午夜精品久久17c| 91tv亚洲精品香蕉国产一区| 亚洲xxxx在线| 国产一区二区三区探花| 男插女免费视频| 国产农村妇女精品一区二区| 邪恶网站在线观看| 成人午夜电影小说| 人人妻人人澡人人爽| 亚洲男人天堂一区| 久久久久久少妇| 欧美一区二区在线观看| 亚洲av成人精品日韩在线播放| 日韩在线精品一区| 极品在线视频| 国产日本欧美一区| 青草久久视频| 警花观音坐莲激情销魂小说| 免费一区视频| 日本成人在线免费| 国产日韩精品一区二区三区在线| 免费看特级毛片| 91国偷自产一区二区开放时间| xxxwww在线观看| 国产三级久久久| 99久久精品无码一区二区毛片 | 欧美亚洲综合久久| 亚洲av无码国产综合专区| 亚洲人免费视频| 国产www视频在线观看| 国产欧美日韩中文| 亚洲人成精品久久久| 免费在线黄网站| 久久99精品国产麻豆婷婷| 女人被狂躁c到高潮| 亚洲精品你懂的| 久久夜色精品国产噜噜亚洲av| 欧美mv和日韩mv国产网站| 亚洲s色大片| 国产99久久精品一区二区永久免费| 国产调教精品| www.日本在线视频| 极品少妇一区二区| 性欧美精品男男| 91福利在线免费观看| 午夜国产在线观看| 欧美激情在线狂野欧美精品| 99riav视频一区二区| 美女一区视频| 亚洲看片一区| 欧美图片自拍偷拍| 一区二区成人在线观看| 国产女人18毛片18精品| 日韩性生活视频| 国产一区精品福利| 日韩欧美亚洲日产国产| 日韩激情中文字幕| 自拍偷拍中文字幕| 欧美色道久久88综合亚洲精品| 色婷婷在线视频| 97在线视频免费观看| www.神马久久| 青青青青草视频| 91视视频在线直接观看在线看网页在线看| 免费网站观看www在线观| 日韩欧美一级精品久久| 污污的网站在线免费观看| 91在线免费观看网站| 亚洲国产一成人久久精品| 中文av字幕在线观看| 亚洲日本乱码在线观看| 国产视频在线观看视频| 欧美xxxx18性欧美| 亚洲成人影音| 国产精品久久久久久久乖乖| 成人永久免费视频| 国产无套内射又大又猛又粗又爽| 欧美精品一区二区三区蜜桃| 日韩影院在线| 奇米精品在线| 久久成人麻豆午夜电影| 中文字幕影音先锋| 欧美精品一区二区三区四区| 中文字幕在线直播| 日韩国产伦理| 久久国产欧美日韩精品| 懂色av懂色av粉嫩av| 亚洲国产精品999| 欧美不卡高清一区二区三区| 亚洲三区四区| 国产在线播放一区三区四| 久久久久久久黄色| 国产视频亚洲视频| 天堂网免费视频| 成人午夜视频免费看| 亚洲精品77777| 亚洲网站视频福利| 99精品美女视频在线观看热舞| 国产毛片久久久久久国产毛片| 91麻豆国产在线观看| 国内av在线播放| 久久夜色精品国产欧美乱| 久久这里只有精品一区二区| 成人性生生活性生交12| 亚洲美女在线一区| 日韩三级电影网| 国产免费一区二区三区在线观看 | 欧美一级淫片免费视频黄| 中文字幕亚洲国产| 成人h动漫免费观看网站| 最近免费中文字幕中文高清百度| 综合在线观看色| 偷拍自拍在线视频| 国产在线视频91|