2017-10-21 15 views
0

私はこれを一日中解決しようとしていましたが、解決策を見つけることができません。助けてください !! だからウェブスクレイピングを学ぶために、私はこのウェブサイト上で練習してきた:Rselenium web scraping:関数として適用

https://www.net-a-porter.com/fr/fr/Shop/Designers/Fendi

目標は、すべての製品の価格をこすりすることです。私は204個の値の一覧(価格は私が望む結果を、得た本とそう

option <- remDr$findElement(using = 'xpath', "//*/option[@value = 'view_all']") 
option$clickElement() 
priceNodes <- remDr$findElements(using = 'css selector', ".price") 
price<-unlist(lapply(priceNodes, function(x){x$getElementText()})) 
price<-gsub("€","",price) 
price<-gsub(",","",price) 
price <- as.numeric(price) 

: だから、このウェブサイトおよび他のインターネットユーザーにressourcesのおかげで、私は完璧に動作し、このコードを作りました)。 ここでは、この関数を住所リスト(この場合は他のブランド)に適用するために、このプロセス全体を関数に変換したいと考えています。 そして、明らかにそれは動作しませんでした...:

FPrice <- function(x) { 
    url1 <- x 
    remDr <- rD$client 
    remDr$navigate(url1) 
    iframe <- remDr$findElement("css", value=".view-more-less") 
    option <- remDr$findElement(using = 'xpath', "//*/option[@value = 'view_all']") 
    option$clickElement() 
    priceNodes <- remDr$findElements(using = 'css selector', ".price") 
    price<-unlist(lapply(priceNodes, function(x){x$getElementText()})) 
    } 

私はこのようにそれを適用します。

FPrice("https://www.net-a-porter.com/fr/fr/Shop/Designers/Fendi") 

エラーメッセージが上がってきた私は、私が探していますデータを得ることはありません。

Selenium message:stale element reference: element is not attached to the page document 
     (Session info: chrome=61.0.3163.100) 
     (Driver info: chromedriver=2.33.506106 (8a06c39c4582fbfbab6966dbb1c38a9173bfb1a2),platform=Mac OS X 10.12.6 x86_64) 

機能の中に機能があると思います...誰でも問題解決のお手伝いをしていただけますか?ありがとう。

ps。私は別のコードを作った:

Price <- function(x) { 
    url1 <- x 
webpage <- read_html(url1) 
price_data_html <- html_nodes(webpage,".price") 
price_data <- html_text(price_data_html) 
price_data<-gsub("€","",price_data) 
price_data<-gsub(",","",price_data) 
price_data <- as.numeric(price_data) 
return(price_data) 
} 

そして、うまくいきました。私はadresseのリストを含むベクトルにそれを適用しました。しかし、rvestではブラウザを設定することができないので、 "show all"オプションを選択します。したがって、Fendiの場合のように、私は60の観測値しか得ていないが、いくつかのブランドは200を超える製品を提案している。

ご理解いただきありがとうございます。あなたからすぐに読むことを願っています!

答えて

1

このサイトでは、条件&の条件でスクレイピングが明示的に防止されていないと驚いており、robots.txtの除外の外に/fr/frのパスを残しました。つまり、が幸運です。これはおそらく彼らの見落としです。

しかし、これには非セレンのアプローチがあります。メインページにはXHRの呼び出しで製品<div>がロードされますので、ブラウザのDeveloper Toolsの "Network"タブの検査で見つけてください。ページごとまたは完全に取り除くことができます。その後、私たちまで反復処理、

prices <- get_prices_on_page(1) 

と:ページ分割アプローチの

library(httr) 
library(rvest) 
library(purrr) 

、我々はセットアップ機能:

get_prices_on_page <- function(pg_num = 1) { 

    Sys.sleep(5) # be kind 

    GET(
    url = "https://www.net-a-porter.com/fr/fr/Shop/Designers/Fendi", 
    query = list(
     view = "jsp", 
     sale = "0", 
     exclude = TRUE, 
     pn = pg_num, 
     npp=60, 
     image_view = "product", 
     dScroll = "0" 
    ), 
) -> res 

    pg <- content(res, as="parsed") 

    list(
    total_pgs = html_node(pg, "div.data_totalPages") %>% xml_integer(), 
    total_items = html_node(pg, "data_totalItems") %>% xml_integer(), 
    prices_on_page = html_nodes(pg, "span.price") %>% 
     html_text() %>% 
     gsub("[^[:digit:]]", "", .) %>% 
     as.numeric() 
) 

} 

が続いて最初のページを取得ここで必要なのですやり直して、すべてを一緒にする:

c(prices$prices_on_page, map(2:prices$total_pgs, get_prices_on_page) %>% 
    map("prices_on_page") %>% 
    flatten_dbl()) -> all_prices 

all_prices 
## [1] 601 1190 1700 1480 1300 590 950 1590 3200 410 950 595 1100 690 
## [15] 900 780 2200 790 1300 410 1000 1480 750 495 850 850 900 450 
## [29] 1600 1750 2200 750 750 1550 750 850 1900 1190 1200 1650 2500 580 
## [43] 2000 2700 3900 1900 600 1200 650 950 600 800 1100 1200 1000 1100 
## [57] 2500 1000 500 1645 550 1505 850 1505 850 2000 400 790 950 800 
## [71] 500 2000 500 1300 350 550 290 550 450 2700 2200 650 250 200 
## [85] 1700 250 250 300 450 800 800 800 900 600 900 375 5500 6400 
## [99] 1450 3300 2350 1390 2700 1500 1790 2200 3500 3100 1390 1850 5000 1690 
## [113] 2700 4800 3500 6200 3100 1850 1950 3500 1780 2000 1550 1280 3200 1350 
## [127] 2700 1350 1980 3900 1580 18500 1850 1550 1450 1600 1780 1300 1980 1450 
## [141] 1320 1460 850 1650 290 190 520 190 1350 290 850 900 480 450 
## [155] 850 780 1850 750 450 1100 1550 550 495 850 890 850 590 595 
## [169] 650 650 495 595 330 480 400 220 130 130 290 130 250 230 
## [183] 210 900 380 340 430 380 370 390 460 255 300 480 550 410 
## [197] 350 350 280 190 350 550 450 430 

それとも、私たちは一つにそれらをすべて取得することができますが、サイトを備えています「すべての1ページの表示が」持っていることを利用して一挙に落ちた:

pg <- read_html("https://www.net-a-porter.com/fr/fr/Shop/Designers/Fendi?view=jsp&sale=0&exclude=true&pn=1&npp=view_all&image_view=product&dScroll=0") 
html_nodes(pg, "span.price") %>% 
    html_text() %>% 
    gsub("[^[:digit:]]", "", .) %>% 
    as.numeric() -> all_prices 

all_prices 
# same result as above 

あなたがページ分割されたアプローチを使用している場合にクロール遅延を保管してくださいしてください。内容を悪用しないでください。彼らは掻き取りを禁止していませんが、T & Cは、個人的な製品の選択のみを使用しています。

関連する問題