校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > 使用Ruby程序實現web信息抓取的教程

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

熱門標簽:白銀外呼paas系統 地圖標注賺錢項目注冊 百度地圖標注自定義圖片 滴滴外呼系統 高德地圖標注客服 湖州u友防封電銷卡 徐州網絡外呼系統哪個好 常德電銷平臺外呼系統軟件價格 電銷機器人廠商代理

網站不再單單迎合人類讀者。許多站點現在支持一些 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 源代碼。

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

#!/usr/bin/env ruby
require 'rubygems'
require 'nokogiri'
require 'open-uri'

# Define the URL with the argument passed by the user
uri = "http://www.crunchbase.com/company/#{ARGV[0]}"

# Use Nokogiri to get the document
doc = Nokogiri::HTML(open(uri))

# Find the link of interest
link = doc.search('tr span[1]')

# Emit the content associated with that link
puts 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 ruby
require 'rubygems'
require 'json'
require 'net/http'

# Define the URL with the argument passed by the user
uri = "http://api.crunchbase.com/v/1/company/#{ARGV[0]}.js"

# Perform the HTTP GET request, and return the response
resp = Net::HTTP.get_response(URI.parse(uri))

# Parse the JSON from the response body
jresp = JSON.parse(resp.body)

# Emit the content of interest
puts jresp['number_of_employees']

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

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

$ ./parse.rb ibm
388,000
$ ./api.rb ibm
388000
$ ./parse.rb cisco
63,000
$ ./api.rb cisco
63000
$ ./parse.rb paypal
300,000
$ ./api.rb paypal
300000
$

抓取腳本運行時,您接收一個格式化的計數,而 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/ruby
require '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 app
api_key = 'api key'
api_secret = 'api secret'
user_token = 'user token'
user_secret = 'user secret'
 
# Specify LinkedIn API endpoint
configuration = { :site => 'https://api.linkedin.com' }
 
# Use the API key and secret to instantiate consumer object
consumer = OAuth::Consumer.new(api_key, api_secret, configuration)
 
# Use the developer token and secret to instantiate access token object
access_token = OAuth::AccessToken.new(consumer, user_token, user_secret)

# Get the username for this profile
response = 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 follow
response = access_token.get(cquery)
jresp = JSON.parse(response.body)

# Iterate through each and display the company name
jresp['values'].each do | company |
  puts " #{company['name']}"
end

# Get the job suggestions
response = access_token.get(jquery)
jresp = JSON.parse(response.body)
puts "\nSuggested jobs for #{myName}"

# Iterate through each suggested job and print the company name
jresp['jobs']['values'].each do | job |
  puts " #{job['company']['name']} in #{job['locationDescription']}"
end

puts "\n"

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

$ ./lkdin.rb

Suggested 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 Technology

Suggested 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/ruby
require '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=restaurantslocation=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'])
  end
end

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

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

aggr = ""
key = 'your api key here'

# Get the IP address for the domain using the 'host' command
IO.popen("host #{ARGV[0]}") { | line |
 until line.eof?
  aggr += line.gets
 end
}

# Find the IP address in the response from the 'host' command
pattern = /\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.body
end

在清單 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.jp
IP=111.68.239.125
CC=JP
CN=Japan
$ ./where.rb www.pravda.ru
IP=212.76.137.2
CC=RU
CN=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/ruby
require '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 Service
http = Net::HTTP.new( uri.host, 443 )
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE

# Connect to the service
req = Net::HTTP::Get.new(uri.request_uri)
resp = http.request(req)

# Get the JSON representation
jresp = JSON.parse(resp.body)

# Iterate through the API List
jresp['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)
 end
end

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

$ ./gdir.rb
adexchangebuyer  Ad Exchange Buyer API       ./apis/adexchangebuyer/v1.1/rest
adsense      AdSense Management API       ./apis/adsense/v1.1/rest
adsensehost    AdSense Host API          ./apis/adsensehost/v4.1/rest
analytics     Google Analytics API        ./apis/analytics/v3/rest
androidpublisher Google Play Android Developer API ./apis/androidpublisher/v1/rest
audit       Enterprise Audit API        ./apis/audit/v1/rest
bigquery     BigQuery API            ./apis/bigquery/v2/rest
blogger      Blogger API            ./apis/blogger/v3/rest
books       Books API             ./apis/books/v1/rest
calendar     Calendar API            ./apis/calendar/v3/rest
compute      Compute Engine API         ./apis/compute/v1beta12/rest
coordinate    Google Maps Coordinate API     ./apis/coordinate/v1/rest
customsearch   CustomSearch API          ./apis/customsearch/v1/rest
dfareporting   DFA Reporting API         ./apis/dfareporting/v1/rest
discovery     APIs Discovery Service       ./apis/discovery/v1/rest
drive       Drive API             ./apis/drive/v2/rest
...
storage      Cloud Storage API         ./apis/storage/v1beta1/rest
taskqueue     TaskQueue API           ./apis/taskqueue/v1beta2/rest
tasks       Tasks API             ./apis/tasks/v1/rest
translate     Translate API           ./apis/translate/v2/rest
urlshortener   URL Shortener API         ./apis/urlshortener/v1/rest
webfonts     Google Web Fonts Developer API   ./apis/webfonts/v1/rest
youtube      YouTube API            ./apis/youtube/v3alpha/rest
youtubeAnalytics 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 客戶端競爭對手的第三方應用程序而言,無疑是一場災難。

您可能感興趣的文章:
  • ruby+nokogori抓取糗事百科前10頁并存儲進數據庫示例
  • ruby實現網頁圖片抓取
  • Ruby實現網頁圖片抓取

標簽:公主嶺 普洱 三沙 永州 梧州 遼寧 荊門 張家界

巨人網絡通訊聲明:本文標題《使用Ruby程序實現web信息抓取的教程》,本文關鍵詞  使用,Ruby,程序,實現,web,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《使用Ruby程序實現web信息抓取的教程》相關的同類信息!
  • 本頁收集關于使用Ruby程序實現web信息抓取的教程的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    一级特黄大欧美久久久| 亚洲欧美电影一区二区| 国产精品一区二区三区四区 | 成人中文字幕合集| 色94色欧美sute亚洲线路二| 国产精品伦一区| 亚洲主播在线观看| 国产精品久久久久桃色tv| 日韩一区有码在线| 久久99蜜桃精品| 不卡的av电影| 日韩欧美国产精品一区| 一二三四区精品视频| 99re66热这里只有精品3直播| 日韩免费观看高清完整版| av一区二区三区| 国产精品欧美精品| 亚洲国产精品av| 久久精品国产精品青草| 国产精品午夜在线观看| 日韩免费电影一区| 亚洲免费成人av| 欧美日韩精品电影| 国产麻豆成人精品| 亚洲欧美激情插 | 亚洲国产精品精华液网站| 欧洲国内综合视频| 美女网站在线免费欧美精品| 日本韩国一区二区三区| 成人中文字幕在线| 精品久久久久久最新网址| 一区二区久久久久| 国产成人一区二区精品非洲| 欧美日韩国产一区二区三区地区| 亚洲亚洲精品在线观看| 国产91高潮流白浆在线麻豆| 亚洲摸摸操操av| 26uuu亚洲综合色欧美| 色噜噜狠狠色综合中国| 极品少妇一区二区| 亚洲国产成人av网| 亚洲精品福利视频网站| 国产精品中文欧美| 久久机这里只有精品| 国产人成一区二区三区影院| 91尤物视频在线观看| 蜜桃一区二区三区在线| 亚洲欧洲综合另类在线| 精品国产免费视频| 欧美人妖巨大在线| eeuss鲁一区二区三区| 精品系列免费在线观看| 亚洲午夜电影网| 国产精品久久久久婷婷二区次| 精品免费视频.| 欧美一区二区网站| 欧美熟乱第一页| 欧美性猛交一区二区三区精品| 成人精品视频一区二区三区尤物| 蜜臀va亚洲va欧美va天堂 | 欧美一区二区三区爱爱| 91国模大尺度私拍在线视频| av一区二区久久| www.欧美精品一二区| 国产一区二区视频在线播放| ww亚洲ww在线观看国产| 99久久国产综合精品色伊| 亚洲午夜免费视频| 日韩三级在线免费观看| 蜜臀精品一区二区三区在线观看 | 91麻豆精品国产| 7777精品伊人久久久大香线蕉的| 99久久99久久久精品齐齐| 国产一区二区精品久久| 精品影院一区二区久久久| 免费久久精品视频| 免费观看日韩电影| 亚洲精品在线观| 精品久久五月天| 精品国产一区二区三区四区四| 制服丝袜亚洲精品中文字幕| 欧美日韩国产一级片| 51精品视频一区二区三区| 欧美亚洲免费在线一区| 在线免费观看视频一区| 91久久精品一区二区| 色激情天天射综合网| 一本大道久久精品懂色aⅴ| 91视频在线观看免费| 色香蕉成人二区免费| 色天使色偷偷av一区二区| 91福利在线导航| 51精品久久久久久久蜜臀| 91精品国产91久久久久久最新毛片| 欧美视频在线一区二区三区| 欧美日韩一区二区在线观看 | 国产午夜三级一区二区三| 久久久久久久网| 国产精品国模大尺度视频| 中文字幕一区二区三区av| 伊人色综合久久天天| 无码av免费一区二区三区试看| 日韩国产在线观看一区| 精品一区二区日韩| 成人永久免费视频| 欧美在线高清视频| 欧美一区日本一区韩国一区| 国产日韩欧美不卡| 亚洲午夜在线视频| 久久99国产精品尤物| 亚洲欧美日韩国产手机在线| 亚洲1区2区3区4区| 精品在线播放免费| 99国产精品久久久久| 欧美日韩久久一区| 久久综合久久鬼色中文字| 最新国产成人在线观看| 日韩在线一二三区| 国产 日韩 欧美大片| 在线观看日韩精品| 日韩久久精品一区| 亚洲婷婷综合色高清在线| 日产欧产美韩系列久久99| 高清国产午夜精品久久久久久| 全国精品久久少妇| 成人亚洲一区二区一| 欧美蜜桃一区二区三区| 国产欧美精品一区二区色综合| 一级女性全黄久久生活片免费| 国产专区欧美精品| 日本高清免费不卡视频| 日韩欧美二区三区| 亚洲综合激情网| 丰满亚洲少妇av| 911精品国产一区二区在线| 国产精品人人做人人爽人人添| 日韩电影免费在线看| 色香蕉久久蜜桃| 国产精品全国免费观看高清| 国产亚洲一区二区三区在线观看| 亚洲小少妇裸体bbw| 91免费国产视频网站| 久久综合给合久久狠狠狠97色69| 亚洲一区二区在线观看视频| 成人黄页毛片网站| 精品美女在线播放| 日韩精品一二三四| 在线观看www91| 中文字幕亚洲在| 国产精品亚洲综合一区在线观看| 欧美日韩中文国产| 亚洲老司机在线| www.亚洲色图| 国产三级久久久| 国产精品久久久久久久久免费相片| 久久激情五月激情| 欧美老女人在线| 一区二区三区日韩精品| 97久久精品人人爽人人爽蜜臀| 2020国产成人综合网| 久久国产人妖系列| 日韩欧美在线综合网| 奇米四色…亚洲| 91精品国产综合久久香蕉的特点| 亚洲小少妇裸体bbw| 欧洲视频一区二区| 亚洲精品一二三区| 91极品美女在线| 一区二区三区四区激情| 91尤物视频在线观看| 精品视频一区 二区 三区| 一区二区国产视频| 欧美视频一区二区三区四区| 一个色妞综合视频在线观看| 在线亚洲免费视频| 一区二区三区加勒比av| 欧美亚洲综合另类| 亚洲国产成人av好男人在线观看| 色婷婷亚洲精品| 亚洲国产精品麻豆| 7777精品伊人久久久大香线蕉的| 青青草视频一区| 欧美变态tickle挠乳网站| 蜜臀91精品一区二区三区 | 成人欧美一区二区三区黑人麻豆| 岛国av在线一区| 亚洲免费三区一区二区| 欧美色图免费看| 免费日本视频一区| 久久综合久久综合久久综合| 成人免费视频一区二区| 亚洲乱码中文字幕| 欧美一区二区视频在线观看2020| 久久国产精品色婷婷| 日本一区二区三区视频视频| 91在线视频网址| 日日摸夜夜添夜夜添国产精品| 欧美xingq一区二区| 国产a视频精品免费观看| 国产精品热久久久久夜色精品三区|