2015-07-15 17 views
8

Tôi có một danh sách khoảng 13.000 URL mà tôi muốn trích xuất thông tin, tuy nhiên, không phải mọi URL đều tồn tại. Trong thực tế đa số thì không. Tôi vừa thử vượt qua tất cả 13.000 url thông qua html() nhưng phải mất một thời gian dài. Tôi đang cố gắng tìm hiểu xem các url có thực sự tồn tại hay không trước khi phân tích cú pháp chúng thành html(). Tôi đã thử sử dụng các chức năng httrGET() cũng như các chức năng rcurlsurl.exists(). Vì lý do nào đó, url.exist() luôn trả về giá trị FALSE ngay cả khi URL không tồn tại và cách tôi đang sử dụng GET() luôn trả về thành công, tôi nghĩ điều này là do trang đang được chuyển hướng.R: Kiểm tra sự tồn tại của url, các vấn đề với httr: GET() và url.exists()

Các URL sau đại diện cho loại trang tôi đang phân tích cú pháp, là người đầu tiên không tồn tại

urls <- data.frame('site' = 1:3, 'urls' = c('https://www.deakin.edu.au/current-students/unitguides/UnitGuide.php?year=2015&semester=TRI-1&unit=SLE010', 
          'https://www.deakin.edu.au/current-students/unitguides/UnitGuide.php?year=2015&semester=TRI-2&unit=HMM202', 
          'https://www.deakin.edu.au/current-students/unitguides/UnitGuide.php?year=2015&semester=TRI-2&unit=SLE339')) 

urls$urls <- as.character(urls$urls) 

Đối GET(), vấn đề là URL thứ hai không thực sự tồn tại nhưng nó bị đổi hướng và do đó lợi nhuận thành công".

urls$urlExists <- sapply(1:length(urls[,1]), 
        function(x) ifelse(http_status(GET(urls[x, 'urls']))[[1]] == "success", 1, 0)) 

Cho url.exists(), tôi nhận được ba FALSE trả lại ngay cả khi url đầu tiên và thứ ba tồn tại.

urls$urlExists2 <- sapply(1:length(urls[,1]), function(x) url.exists(urls[x, 'urls'])) 

Tôi đã kiểm tra hai bài viết này 1, 2 nhưng tôi không muốn sử dụng một useragent đơn giản chỉ vì tôi không chắc chắn làm thế nào để tìm mỏ hoặc cho dù đó sẽ thay đổi cho những người khác nhau sử dụng mã này trên các máy tính khác. Do đó làm cho mã khó khăn hơn để nhận và sử dụng bởi những người khác. Cả hai bài đăng đều trả lời đề xuất sử dụng GET() trong httr. Có vẻ như là GET() có lẽ là phương pháp ưa thích nhưng tôi sẽ cần phải tìm ra cách để đối phó với vấn đề chuyển hướng.

Có ai có thể đề xuất một cách hay trong R để kiểm tra sự tồn tại của URL trước khi phân tích cú pháp chúng thành html() không? Tôi cũng sẽ hạnh phúc cho bất kỳ công việc khác được đề xuất xung quanh cho vấn đề này.

UPDATE:

Sau khi xem xét giá trị trả về từ GET() tôi đã tìm ra một công việc xung quanh, xem câu trả lời để biết chi tiết.

+2

Bạn có một vấn đề khái niệm ở đây. Với nhiều máy chủ web, nếu bạn cố gắng truy cập một trang không tồn tại, bạn sẽ vẫn nhận được một trang! Những gì bạn thực sự muốn làm là kiểm tra xem có lỗi 404 không. –

+1

Cảm ơn Tim, nhận xét của bạn đã giúp tôi xem xét những gì tôi đã nhận được từ hàm 'GET()'. Tôi nghĩ rằng tôi đã tìm ra một công việc xung quanh. Tôi đã thêm nó vào cuối câu hỏi. – Adam

Trả lời

2

Sau một đề xuất từ ​​@TimBiegeleisen tôi đã xem xét những gì được trả về từ chức năng GET(). Dường như nếu url tồn tại GET() sẽ trả lại url này dưới dạng giá trị, nhưng nếu nó được chuyển hướng, một url khác sẽ được trả lại. Tôi vừa thay đổi mã để xem liệu url được trả về bởi GET() có khớp với mã tôi đã gửi hay không.

urls$urlExists <- sapply(1:length(urls[,1]), function(x) ifelse(GET(urls[x, 'urls'])[[1]] == urls[x,'urls'], 1, 0)) 

Tôi muốn tìm hiểu về bất kỳ phương pháp nào tốt hơn mà mọi người sử dụng cho cùng một điều.

13

Với httr, sử dụng url_success() và chuyển hướng sau đây tắt:

library(httr) 

urls <- c(
    'https://www.deakin.edu.au/current-students/unitguides/UnitGuide.php?year=2015&semester=TRI-1&unit=SLE010', 
    'https://www.deakin.edu.au/current-students/unitguides/UnitGuide.php?year=2015&semester=TRI-2&unit=HMM202', 
    'https://www.deakin.edu.au/current-students/unitguides/UnitGuide.php?year=2015&semester=TRI-2&unit=SLE339' 
) 

sapply(urls, url_success, config(followlocation = 0L), USE.NAMES = FALSE) 
+2

Chỉ để lại một ghi chú kể từ khi tôi gặp vấn đề tương tự.Với phiên bản hiện tại (1.2.1), chúng tôi sử dụng 'http_error' thay vì' url_success'. – jazzurro

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