2014-07-04 26 views
6

Tôi đang cố viết mã sẽ chuyển đến từng trang và lấy thông tin từ đó. Url < - http://www.wikiart.org/en/claude-monet/mode/all-paintings-by-alphabetCách viết mã để thu thập dữ liệu và tìm kiếm trên web trong R

Tôi có mã để xuất tất cả href. Nhưng nó không hoạt động.

library(XML) 
library(RCurl) 
library(stringr) 
tagrecode <- readHTMLTable ("http://www.wikiart.org/en/claude-monet/mode/all-   paintings-by-alphabet") 
tabla <- as.data.frame(tagrecode) 
str(tabla) 
names (tabla) <- c("name", "desc", "cat", "updated") 
str(tabla) 
res <- htmlParse ("http://www.wikiart.org/en/claude-monet/mode/all-paintings-by- alphabet") 
enlaces <- getNodeSet (res, "//p[@class='pb5']/a/@href") 
enlaces <- unlist(lapply(enlaces, as.character)) 
tabla$enlace <- paste("http://www.wikiart.org/en/claude-monet/mode/all-paintings-by- alphabet") 
str(tabla) 
lisurl <- tabla$enlace 

fu1 <- function(url){ 
print(url) 
pas1 <- htmlParse(url, useInternalNodes=T) 

pas2 <- xpathSApply(pas1, "//p[@class='pb5']/a/@href") 
} 
urldef <- lapply(lisurl,fu1) 

Sau khi tôi có danh sách các url của tất cả các hình ảnh trên trang này tôi muốn đi đến hai ba -...- 23 trang để thu thập các url của tất cả các hình ảnh.

Bước tiếp theo để xóa thông tin về mọi ảnh. Tôi có mã làm việc cho một và tôi cần phải xây dựng nó trong một mã chung.

library(XML) 
url = "http://www.wikiart.org/en/claude-monet/camille-and-jean-monet-in-the-garden-at-argenteuil" 
doc = htmlTreeParse(url, useInternalNodes=T) 
pictureName <- xpathSApply(doc,"//h1[@itemprop='name']", xmlValue) 
date <- xpathSApply(doc, "//span[@itemprop='dateCreated']", xmlValue) 
author <- xpathSApply(doc, "//a[@itemprop='author']", xmlValue) 
style <- xpathSApply(doc, "//span[@itemprop='style']", xmlValue) 
genre <- xpathSApply(doc, "//span[@itemprop='genre']", xmlValue) 

pictureName 
date 
author 
style 
genre 

Mọi lời khuyên cách thực hiện việc này sẽ được đánh giá cao!

Trả lời

9

Điều này dường như hoạt động.

library(XML) 
library(httr) 
url <- "http://www.wikiart.org/en/claude-monet/mode/all-paintings-by-alphabet/" 
hrefs <- list() 
for (i in 1:23) { 
    response <- GET(paste0(url,i)) 
    doc  <- content(response,type="text/html") 
    hrefs <- c(hrefs,doc["//p[@class='pb5']/a/@href"]) 
} 
url  <- "http://www.wikiart.org" 
xPath <- c(pictureName = "//h1[@itemprop='name']", 
       date  = "//span[@itemprop='dateCreated']", 
       author  = "//a[@itemprop='author']", 
       style  = "//span[@itemprop='style']", 
       genre  = "//span[@itemprop='genre']") 
get.picture <- function(href) { 
    response <- GET(paste0(url,href)) 
    doc  <- content(response,type="text/html") 
    info  <- sapply(xPath,function(xp)ifelse(length(doc[xp])==0,NA,xmlValue(doc[xp][[1]]))) 
} 
pictures <- do.call(rbind,lapply(hrefs,get.picture)) 
head(pictures) 
#  pictureName       date  author   style   genre   
# [1,] "A Corner of the Garden at Montgeron" "1877" "Claude Monet" "Impressionism" "landscape"  
# [2,] "A Corner of the Studio"    "1861" "Claude Monet" "Realism"  "self-portrait" 
# [3,] "A Farmyard in Normandy"    "c.1863" "Claude Monet" "Realism"  "landscape"  
# [4,] "A Windmill near Zaandam"    NA  "Claude Monet" "Impressionism" "landscape"  
# [5,] "A Woman Reading"      "1872" "Claude Monet" "Impressionism" "genre painting" 
# [6,] "Adolphe Monet Reading in the Garden" "1866" "Claude Monet" "Impressionism" "genre painting" 

Bạn đã thực sự khá thân thiết. XPath của bạn là tốt; một vấn đề là không phải tất cả các hình ảnh đều có tất cả thông tin (ví dụ: đối với một số trang mà các nút mà bạn đang cố gắng truy cập trống) - lưu ý ngày cho "A Windnill nead Zaandam". Vì vậy, mã phải đối phó với khả năng này. Vì vậy, trong ví dụ này, vòng lặp đầu tiên lấy các giá trị của thuộc tính href của các thẻ neo cho mỗi trang (1:23) và kết hợp chúng thành một vectơ có chiều dài ~ 1300.

Để xử lý từng trang trong số 1300 trang này và vì chúng tôi phải xử lý các thẻ bị thiếu, việc tạo một vectơ chứa chuỗi xPath trở nên đơn giản hơn và áp dụng yếu tố đó cho mỗi trang. Đó là chức năng của hàm get.picture(...). Câu lệnh cuối cùng gọi hàm này với mỗi một trong số 1300 href, và liên kết kết quả với nhau một cách khôn ngoan, sử dụng do.call(rbind,...).

Cũng lưu ý rằng mã này sử dụng tính năng lập chỉ mục nhỏ gọn hơn cho các đối tượng của lớp HTMLInternalDocument: doc[xpath] trong đó xpath là chuỗi xPath. Điều này tránh việc sử dụng xpathSApply(...), mặc dù sau này sẽ có hiệu quả.

0

Bạn có thể thử Rcrawler package, đó là trình quét web song song, nó có thể thu thập thông tin, lưu trữ trang web và loại bỏ nội dung của nó bằng XPath.

Nếu bạn cần phải thu thập tất cả các thông tin hình ảnh sử dụng

datapattern<-c(
    "//h1/span[@itemprop='name']", 
    "//a[@class='artist-name']", 
    "//*[@id='headSection']/article/form/div[1]/div/div/div[2]/div[2]/span[2]", 
    "//*[@id='headSection']/article/form/div[1]/div/div/div[2]/div[3]/a/span", 
    "//*[@id='headSection']/article/form/div[1]/div/div/div[2]/div[4]/a/span" 
) 

Rcrawler(Website = "https://www.wikiart.org/", no_cores = 4, no_conn = 4, ExtractPatterns =datapattern) 

Để lọc ra chỉ Claud Monet ảnh

Rcrawler(Website = "https://www.wikiart.org/", no_cores = 4, no_conn = 4, urlregexfilter ="claude-monet/([^/])*", ExtractPatterns =datapattern) 

Crawler sẽ mất một thời gian để kết thúc vì nó sẽ đi qua tất cả các liên kết trang web. Tuy nhiên, bạn có thể ngừng thực hiện bất cứ lúc nào. Theo mặc định, có mẩu tin lưu niệm nằm trong vi phạm toàn cục có tên DATA, một biến khác có tên INDEX chứa tất cả các URL được thu thập dữ liệu.

Nếu bạn cần tìm hiểu cách xây dựng trình thu thập thông tin của bạn, hãy tham khảo bài viết này. R crawler

Các vấn đề liên quan