亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Ruby > 正文

使用Ruby程序實現web信息抓取的教程

2020-10-29 19:41:13
字體:
來源:轉載
供稿:網友

網站不再單單迎合人類讀者。許多站點現在支持一些 API,這些 API 使計算機程序能夠獲取信息。屏幕抓取 ―― 將 HTML 頁面解析為更容易理解的表單的省時技術 ― 仍然很方便。但使用 API 簡化 Web 數據提取的機會在快速增多。根據 ProgrammableWeb 的信息,在本文發表時,已存在 10,000 多個網站 API ― 在過去的 15 個月中增加了 3,000 個。(ProgrammableWeb 本身提供了一個 API,可從其目錄中搜索和檢索 API、mashup、成員概要文件和其他數據。)

本文首先介紹現代的 Web 抓取并將它與 API 方法進行比較。然后通過 Ruby 示例,展示如何使用 API 從一些流行的 Web 屬性中提取結構化信息。您需要基本理解 Ruby 語言、具象狀態傳輸 (REST),以及 JavaScript 對象表示法 (JSON) 和 XML 概念。
抓取與 API

現在已有多種抓取解決方案。其中一些將 HTML 轉換為其他格式,比如 JSON,這樣提取想要的內容會更加簡單。其他解決方案讀取 HTML,您可將內容定義為 HTML 分層結構的一個函數,其中的數據已加了標記。一種此類解決方案是 Nokogiri,它支持使用 Ruby 語言解析 HTML 和 XML 文檔。其他開源抓取工具包括用于 JavaScript 的 pjscrape 和用于 Python 的 Beautiful Soup。pjscrape 實現一個命令行工具來抓取完全呈現的頁面,包括 JavaScript 內容。Beautiful Soup 完全集成到 Python 2 和 3 環境中。

假設您希望使用抓取功能和 Nokogiri 來識別 CrunchBase 所報告的 IBM 員工數量。第一步是理解 CrunchBase 上列出了 IBM 員工數量的特定 HTML 頁面的標記。圖 1 顯示了在 Mozilla Firefox 中的 Firebug 工具中打開的此頁面。該圖的上半部分顯示了所呈現的 HTML,下半部分顯示了感興趣部分的 HTML 源代碼。

2015415113941493.png (388×336)

清單 1 中的 Ruby 腳本使用 Nokogiri 從圖 1 中的網頁抓取員工數量。
清單 1. 使用 Nokogiri 解析 HTML (parse.rb)

#!/usr/bin/env rubyrequire 'rubygems'require 'nokogiri'require 'open-uri'# Define the URL with the argument passed by the useruri = "http://www.crunchbase.com/company/#{ARGV[0]}"# Use Nokogiri to get the documentdoc = Nokogiri::HTML(open(uri))# Find the link of interestlink = doc.search('tr span[1]')# Emit the content associated with that linkputs link[0].content

在 Firebug 顯示的 HTML 源代碼中(如 圖 1 所示),您可看到感興趣的數據(員工數量)嵌入在一個 HTML 唯一 ID <span> 標記內。還可看到 <span id="num_employees"> 標記是兩個 <span> ID 標記中的第一個。所以,清單 1 中的最后兩個指令是,使用 link = doc.search('tr span[1]') 請求第一個 <span> 標記,然后使用 puts link[0].content 發出這個已解析鏈接的內容。

CrunchBase 還公開了一個 REST API,它能夠訪問的數據比通過抓取功能訪問的數據要多得多。清單 2 顯示了如何使用該 API 從 CrunchBase 站點提取公司的員工數。
清單 2. 結合使用 CrunchBase REST API 和 JSON 解析 (api.rb)

#!/usr/bin/env rubyrequire 'rubygems'require 'json'require 'net/http'# Define the URL with the argument passed by the useruri = "http://api.crunchbase.com/v/1/company/#{ARGV[0]}.js"# Perform the HTTP GET request, and return the responseresp = Net::HTTP.get_response(URI.parse(uri))# Parse the JSON from the response bodyjresp = JSON.parse(resp.body)# Emit the content of interestputs jresp['number_of_employees']

在清單 2 中,您定義了一個 URL(公司名稱作為腳本參數傳入)。然后使用 HTTP 類發出一個 GET 請求并返回響應。響應被解析為一個 JSON 對象,您可通過一個 Ruby 數據結構引用感興趣的數據項。

清單 3 中的控制臺會話顯示了運行 清單 1 中的抓取腳本和 清單 2 中基于 API 的腳本的結果。
清單 3. 演示抓取和 API 方法

$ ./parse.rb ibm388,000$ ./api.rb ibm388000$ ./parse.rb cisco63,000$ ./api.rb cisco63000$ ./parse.rb paypal300,000$ ./api.rb paypal300000$

抓取腳本運行時,您接收一個格式化的計數,而 API 腳本會生成一個原始整數。如清單 3 所示,您可推廣每種腳本的使用,從 CrunchBase 跟蹤的其他公司請求獲得員工數。每種方法提供的 URL 的一般結構使這種通用性成為可能。

那么,我們使用 API 方法能獲得什么?對于抓取,您需要分析 HTML 以理解它的結構并識別要提取的數據。然后使用 Nokogiri 解析 HTML 并獲取感興趣的數據就會很簡單。但是,如果 HTML 文檔的結構發生變化,您可能需要修改腳本才能正確解析新結構。根據 API 契約,API 方法不存在該問題。API 方法的另一個重要優點是,您可訪問通過接口(通過返回的 JSON 對象)公開的所有數據。通過 HTML 公開且可供人使用的 CrunchBase 數據要少得多。

現在看看如何使用其他一些 API 從 Internet 提取各類信息,同樣要借助 Ruby 腳本。首先看看如何從一個社交網絡站點收集個人數據。然后將看到如何通過其他 API 來源查找更少的個人數據。

通過 LinkedIn 提取個人數據

LinkedIn 是一個面向專業職業的社交網絡網站。它對聯系其他開發人員,尋找工作,研究一家公司,或者加入一個群組,就有趣的主題進行協作很有用。LinkedIn 還整合了一個推薦引擎,可根據您的概要文件推薦工作和公司。

LinkedIn 用戶可訪問該站點的 REST 和 JavaScript API,從而獲取可通過其人類可讀網站訪問的信息:聯系信息、社交分享流、內容群組、通信(消息和聯系邀請),以及公司和工作信息。

要使用 LinkedIn API,您必須注冊您的應用程序。注冊后會獲得一個 API 密鑰和秘密秘鑰,以及一個用戶令牌和秘密秘鑰。LinkedIn 使用 OAuth 協議進行身份驗證。

執行身份驗證后,您可通過訪問令牌對象發出 REST 請求。響應是一個典型的 HTTP 響應,所以您可將正文解析為 JSON 對象。然后可迭代該 JSON 對象來提取感興趣的數據。

清單 4 中的 Ruby 腳本為進行身份驗證后的 LinkedIn 用戶提供了要關注的公司推薦和工作建議。
清單 4. 使用 LinkedIn API (lkdin.rb) 查看公司和工作建議

#!/usr/bin/rubyrequire 'rubygems'require 'oauth'require 'json'pquery = "http://api.linkedin.com/v1/people/~?format=json"cquery='http://api.linkedin.com/v1/people/~/suggestions/to-follow/companies?format=json'jquery='http://api.linkedin.com/v1/people/~/suggestions/job-suggestions?format=json' # Fill the keys and secrets you retrieved after registering your appapi_key = 'api key'api_secret = 'api secret'user_token = 'user token'user_secret = 'user secret' # Specify LinkedIn API endpointconfiguration = { :site => 'https://api.linkedin.com' } # Use the API key and secret to instantiate consumer objectconsumer = OAuth::Consumer.new(api_key, api_secret, configuration) # Use the developer token and secret to instantiate access token objectaccess_token = OAuth::AccessToken.new(consumer, user_token, user_secret)# Get the username for this profileresponse = access_token.get(pquery)jresp = JSON.parse(response.body)myName = "#{jresp['firstName']} #{jresp['lastName']}"puts "/nSuggested companies to follow for #{myName}"# Get the suggested companies to followresponse = access_token.get(cquery)jresp = JSON.parse(response.body)# Iterate through each and display the company namejresp['values'].each do | company |  puts " #{company['name']}"end# Get the job suggestionsresponse = access_token.get(jquery)jresp = JSON.parse(response.body)puts "/nSuggested jobs for #{myName}"# Iterate through each suggested job and print the company namejresp['jobs']['values'].each do | job |  puts " #{job['company']['name']} in #{job['locationDescription']}"endputs "/n"

清單 5 中的控制臺會話顯示了運行 清單 4 中的 Ruby 腳本的輸出。腳本中對 LinkedIn API 的 3 次獨立調用有不同的輸出結果(一個用于身份驗證,其他兩個分別用于公司建議和工作建議鏈接)。
清單 5. 演示 LinkedIn Ruby 腳本

$ ./lkdin.rbSuggested companies to follow for M. Tim Jones Open Kernel Labs, Inc. Linaro Wind River DDC-I Linsyssoft Technologies Kalray American Megatrends JetHead Development Evidence Srl Aizyc TechnologySuggested jobs for M. Tim Jones Kozio in Greater Denver Area Samsung Semiconductor Inc in San Jose, CA Terran Systems in Sunnyvale, CA Magnum Semiconductor in San Francisco Bay Area RGB Spectrum in Alameda, CA Aptina in San Francisco Bay Area CyberCoders in San Francisco, CA CyberCoders in Alameda, CA SanDisk in Longmont, CO SanDisk in Longmont, CO$

可將 LinkedIn API 與任何提供了 OAuth 支持的語言結合使用。

使用 Yelp API 檢索業務數據

Yelp 公開了一個富 REST API 來執行企業搜索,包含評分、評論和地理搜索(地段、城市、地理編碼)。使用 Yelp API,您可搜索一種給定類型的企業(比如 “飯店”)并將搜索限制在一個地理邊界內;一個地理坐標附近;或者一個鄰居、地址或城市附近。JSON 響應包含了與條件匹配的企業的大量相關信息,包括地址信息、距離、評分、交易,以及其他類型的信息(比如該企業的圖片、移動格式信息等)的 URL。

像 LinkedIn 一樣,Yelp 使用 OAuth 執行身份驗證,所以您必須向 Yelp 注冊才能通過該 API 獲得一組用于身份驗證的憑據。腳本完成身份驗證后,可構造一個基于 REST 的 URL 請求。在清單 6 中,我硬編碼了一個針對科羅拉多州 Boulder 的飯店請求。響應正文被解析到一個 JSON 對象中并進行迭代,從而發出想要的信息。注意,我排除了已關閉的企業。
清單 6. 使用 Yelp API (yelp.rb) 檢索企業數據

#!/usr/bin/rubyrequire 'rubygems'require 'oauth'require 'json'consumer_key = 'your consumer key'consumer_secret = 'your consumer secret'token = 'your token'token_secret = 'your token secret'api_host = 'http://api.yelp.com'consumer = OAuth::Consumer.new(consumer_key, consumer_secret, {:site => api_host})access_token = OAuth::AccessToken.new(consumer, token, token_secret)path = "/v2/search?term=restaurants&location=Boulder,CO"jresp = JSON.parse(access_token.get(path).body)jresp['businesses'].each do | business |  if business['is_closed'] == false   printf("%-32s %10s %3d %1.1f/n",         business['name'], business['phone'],         business['review_count'], business['rating'])  endend

清單 7 中的控制臺會話顯示了運行 清單 6 腳本的示例輸出。為了簡單一些,我只顯示了所返回的前面一組企業,而不是支持該 API 的限制/偏移特性(以執行多個調用來檢索整個列表)。這段示例輸出顯示了企業名稱、電話號碼、收到的評論數和平均評分。
清單 7. 演示 Yelp API Ruby 腳本

$ ./yelp.rbFrasca Food and Wine       3034426966 189 4.5John's Restaurant         3034445232  51 4.5Leaf Vegetarian Restaurant    3034421485 144 4.0Nepal Cuisine           3035545828  65 4.5Black Cat Bistro         3034445500  72 4.0The Mediterranean Restaurant   3034445335 306 4.0Arugula Bar E Ristorante     3034435100  48 4.0Ras Kassa's Ethiopia Restaurant  3034472919 101 4.0L'Atelier             3034427233  58 4.0Bombay Bistro           3034444721  87 4.0Brasserie Ten Ten         3039981010 200 4.0Flagstaff House          3034424640  86 4.5Pearl Street Mall         3034493774  77 4.0Gurkhas on the Hill        3034431355  19 4.0The Kitchen            3035445973 274 4.0Chez Thuy Restaurant       3034421700  99 3.5Il Pastaio            3034479572 113 4.53 Margaritas           3039981234  11 3.5Q's Restaurant          3034424880  65 4.0Julia's Kitchen                 8 5.0$

Yelp 提供了一個具有出色文檔的 API,以及數據描述、示例、錯誤處理等。盡管 Yelp API 很有用,但它的使用有一定的限制。作為軟件原始開發人員,您每天最多可執行 100 次 API 調用,出于測試用途可執行 1,000 次調用。如果您的應用程序滿足 Yelp 的顯示需求,每天可執行 10,000 次調用(也可能執行更多次)。

包含一個簡單 mashup 的域位置

下一個示例將兩段源代碼連接起來,以生成信息。在本例中,您要將一個 Web 域名轉換為它的一般地理位置。清單 8 中的 Ruby 腳本使用 Linux? host 命令和 OpenCrypt IP Location API Service 來檢索位置信息。
清單 8. 檢索 Web 域的位置信息

#!/usr/bin/env rubyrequire 'net/http'aggr = ""key = 'your api key here'# Get the IP address for the domain using the 'host' commandIO.popen("host #{ARGV[0]}") { | line | until line.eof?  aggr += line.gets end}# Find the IP address in the response from the 'host' commandpattern = //d{1,3}/./d{1,3}/./d{1,3}/./d{1,3}$/if m = pattern.match(aggr)  uri = "http://api.opencrypt.com/ip/?IP=#{m[0]}&key=#{key}"  resp = Net::HTTP.get_response(URI.parse(uri))  puts resp.bodyend

在清單 8 中,您首先使用本地的 host 命令將域名轉換為 IP 地址。(host 命令本身使用一個內部 API 和 DNS 解析將域名解析為 IP 地址。)您使用一個簡單的正則表達式(和 match 方法)從 host 命令輸出中解析 IP 地址。有了 IP 地址,就可使用 OpenCrypt 上的 IP 位置服務來檢索一般地理位置信息。OpenCrypt API 允許您執行最多 50,000 次免費 API 調用。

OpenCrypt API 調用很簡單:您構造的 URL 包含您要定位的 IP 地址和 OpenCrypt 注冊過程提供給您的密鑰。HTTP 響應正文包含 IP 地址、國家代碼和國家名稱。

清單 9 中的控制臺會話顯示了兩個示例域名的輸出。
清單 9. 使用簡單的域位置腳本

$ ./where.rb www.baynet.ne.jpIP=111.68.239.125CC=JPCN=Japan$ ./where.rb www.pravda.ruIP=212.76.137.2CC=RUCN=Russian Federation$

Google API 查詢

Web API 方面一個無可爭辯的優勝者是 Google。Google 擁有如此多的 API,以至于它提供了另一個 API 來查詢它們。通過 Google API Discovery Service,您可列出 Google 提供的可用 API 并提取它們的元數據。盡管與大部分 Google API 的交互需要進行身份驗證,但您可通過一個安全套接字連接訪問查詢 API。出于此原因,清單 10 使用 Ruby 的 https 類來構造與安全端口的連接。已定義的 URL 指定了 REST 請求,而且響應采用了 JSON 編碼。迭代響應并發出一小部分首選的 API 數據。
清單 10. 使用 Google API Discovery Service (gdir.rb) 列出 Google API

#!/usr/bin/rubyrequire 'rubygems'require 'net/https'require 'json'url = 'https://www.googleapis.com/discovery/v1/apis'uri = URI.parse(url)# Set up a connection to the Google API Servicehttp = Net::HTTP.new( uri.host, 443 )http.use_ssl = truehttp.verify_mode = OpenSSL::SSL::VERIFY_NONE# Connect to the servicereq = Net::HTTP::Get.new(uri.request_uri)resp = http.request(req)# Get the JSON representationjresp = JSON.parse(resp.body)# Iterate through the API Listjresp['items'].each do | item | if item['preferred'] == true  name = item['name']  title = item['title']  link = item['discoveryLink']  printf("%-17s %-34s %-20s/n", name, title, link) endend

清單 11 中的控制臺會話顯示了運行清單 10 中腳本得到的響應示例。
清單 11. 使用簡單的 Google 目錄服務 Ruby 腳本

$ ./gdir.rbadexchangebuyer  Ad Exchange Buyer API       ./apis/adexchangebuyer/v1.1/restadsense      AdSense Management API       ./apis/adsense/v1.1/restadsensehost    AdSense Host API          ./apis/adsensehost/v4.1/restanalytics     Google Analytics API        ./apis/analytics/v3/restandroidpublisher Google Play Android Developer API ./apis/androidpublisher/v1/restaudit       Enterprise Audit API        ./apis/audit/v1/restbigquery     BigQuery API            ./apis/bigquery/v2/restblogger      Blogger API            ./apis/blogger/v3/restbooks       Books API             ./apis/books/v1/restcalendar     Calendar API            ./apis/calendar/v3/restcompute      Compute Engine API         ./apis/compute/v1beta12/restcoordinate    Google Maps Coordinate API     ./apis/coordinate/v1/restcustomsearch   CustomSearch API          ./apis/customsearch/v1/restdfareporting   DFA Reporting API         ./apis/dfareporting/v1/restdiscovery     APIs Discovery Service       ./apis/discovery/v1/restdrive       Drive API             ./apis/drive/v2/rest...storage      Cloud Storage API         ./apis/storage/v1beta1/resttaskqueue     TaskQueue API           ./apis/taskqueue/v1beta2/resttasks       Tasks API             ./apis/tasks/v1/resttranslate     Translate API           ./apis/translate/v2/resturlshortener   URL Shortener API         ./apis/urlshortener/v1/restwebfonts     Google Web Fonts Developer API   ./apis/webfonts/v1/restyoutube      YouTube API            ./apis/youtube/v3alpha/restyoutubeAnalytics YouTube Analytics API       ./apis/youtubeAnalytics/v1/rest$

清單 11 中的輸出顯示了 API 名稱、它們的標題,以及進一步分析每個 API 的 URL 路徑。

結束語

本文中的示例演示了公共 API 在從 Internet 提取信息方面的強大功能。與 Web 抓取和爬取 (spidering) 相比,Web API 提供了訪問有針對性的特定信息的能力。Internet 上在不斷創造新價值,這不僅通過使用這些 API 來實現,還通過用新穎的方式組合它們,從而向越來越多的 Web 用戶提供新數據來實現。

但是請記住,使用 API 需要付出一定的代價。限制問題就常讓人抱怨。同樣,可能在不通知您的情況下更改 API 規則這一事實,因此在構建應用程序時必須加以考慮。最近,Twitter 更改了它的 API 來提供 “一種更加一致的體驗”。這一更改對許多可能被視為典型 Twitter Web 客戶端競爭對手的第三方應用程序而言,無疑是一場災難。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品亚洲va在线va天堂资源站| 国产日韩欧美日韩大片| 亚洲精品成人免费| 97精品一区二区视频在线观看| 欧美高跟鞋交xxxxhd| 欧美国产高跟鞋裸体秀xxxhd| 亚洲另类xxxx| 国产精品久久久久久久久久东京| 亚洲第一区在线| 91精品视频专区| 日韩欧美国产视频| 狠狠做深爱婷婷久久综合一区| 97国产精品免费视频| 久久精品视频中文字幕| 欧美日韩成人黄色| 97视频在线观看网址| 欧美日韩国产一区二区三区| 久久6免费高清热精品| 高清一区二区三区日本久| 日韩高清电影免费观看完整版| 日韩电视剧免费观看网站| 精品久久久久久| 91在线免费网站| 亚洲在线视频福利| 国产精自产拍久久久久久| 欧美一区二区三区艳史| 国产欧美精品日韩| 久久国产精品99国产精| 国模精品视频一区二区三区| 日韩欧美一区二区在线| 992tv成人免费视频| 一区二区三区视频免费| 日本亚洲欧美三级| 欧美亚洲在线观看| 亚洲国产精久久久久久久| 最近2019好看的中文字幕免费| 欧美激情视频网站| 色多多国产成人永久免费网站| 国产精品国产三级国产aⅴ9色| 欧美日韩激情小视频| 久久影院资源网| 亚洲精品成a人在线观看| 狠狠做深爱婷婷久久综合一区| 亚洲国产精彩中文乱码av在线播放| 亚洲精品白浆高清久久久久久| 97精品伊人久久久大香线蕉| 2019中文在线观看| 国产69久久精品成人看| 久久伊人精品一区二区三区| 中文字幕亚洲欧美日韩2019| 精品亚洲一区二区三区四区五区| 欧美中文字幕第一页| 色中色综合影院手机版在线观看| 国产精品一区二区三| 亚洲大尺度美女在线| 色综合伊人色综合网| 成人网在线视频| 欧美日韩亚洲天堂| 亚洲成人免费在线视频| 亚洲一区第一页| 日本国产欧美一区二区三区| 亚洲精品久久7777777| 欧美一区二粉嫩精品国产一线天| 国产精品99久久久久久久久久久久| 日韩精品免费看| 欧美电影在线播放| 国产欧美一区二区| 久久久人成影片一区二区三区观看| 在线观看视频99| 国产精品网红福利| 日韩av成人在线观看| 国产精品一区二区久久久久| 国产视频精品久久久| 欧美日韩亚洲精品内裤| 久久视频在线看| 欧洲成人午夜免费大片| 精品国产一区二区三区四区在线观看| 亚洲一品av免费观看| 久久综合免费视频| 国产精品自拍偷拍视频| 久久在线免费视频| 欧美性一区二区三区| 国产精品精品视频一区二区三区| 91久久久久久久| 亚洲成人久久久| 久久久精品国产网站| 最近2019免费中文字幕视频三| 欧美福利视频在线观看| 欧美日韩人人澡狠狠躁视频| 久久久久日韩精品久久久男男| 亚洲全黄一级网站| 精品国产一区二区三区久久狼黑人| 国产97人人超碰caoprom| 亚洲国产日韩精品在线| 日韩av在线导航| 成人美女av在线直播| 欧美色视频日本版| 久久久精品久久久久| 亚洲女人天堂av| 成人女保姆的销魂服务| 久久影视电视剧免费网站清宫辞电视| 日韩av大片免费看| 中文字幕一精品亚洲无线一区| 97婷婷涩涩精品一区| 日韩中文综合网| 欧美激情一区二区三区高清视频| 欧美高清videos高潮hd| 亚洲美女喷白浆| 热re99久久精品国产66热| 亚洲免费中文字幕| 欧美日韩国产一中文字不卡| 欧美激情精品久久久| 97人人爽人人喊人人模波多| 亚洲日韩中文字幕在线播放| 91精品久久久久久| 国产精自产拍久久久久久蜜| 欧美日韩中文字幕日韩欧美| 成人做爽爽免费视频| 日韩色av导航| 成人性生交xxxxx网站| 国产免费一区二区三区香蕉精| 欧美性生交xxxxxdddd| 亚洲欧美日韩在线高清直播| 亚洲福利在线播放| 91精品国产91久久久久| 8x海外华人永久免费日韩内陆视频| 亚洲欧美国产视频| 国产精品视频专区| 国模精品视频一区二区| 国产精品99一区| 精品免费在线视频| 中文字幕欧美精品在线| 欧美贵妇videos办公室| 成人免费xxxxx在线观看| 久久久久久久久爱| 91欧美精品成人综合在线观看| 国产精品88a∨| 国产精品久久久久久亚洲调教| 国产精品美女www爽爽爽视频| 国产欧美在线视频| 日韩av有码在线| 精品国产老师黑色丝袜高跟鞋| 美女国内精品自产拍在线播放| 九九热精品视频| 亚洲最大福利视频网站| 国产精品第1页| 久久99久久99精品免观看粉嫩| 96pao国产成视频永久免费| 2020欧美日韩在线视频| 欧美激情精品在线| 亚洲精品美女网站| 国产欧美日韩丝袜精品一区| 久久精品99久久久香蕉| 日韩欧美极品在线观看| 国产视频福利一区| 亚洲一级黄色片| 精品一区二区三区四区| 神马久久久久久| 成人av色在线观看| 成人午夜在线影院| 国产精品日韩专区| 国产91成人video| 亚洲一区二区国产| 亚洲欧洲在线看|