2012-04-09 18 views
6

Tôi đang cố gắng để cạo tất cả các hóa đơn từ hai trang trên trang web của Hạ viện Pháp của quốc hội. Các trang bao gồm 2002-2012 và đại diện cho ít hơn 1.000 hóa đơn mỗi.Làm thế nào để tối ưu hóa cào với getURL() trong R

Đối với điều này, tôi cạo với getURL qua vòng lặp này:

b <- "http://www.assemblee-nationale.fr" # base 
l <- c("12","13") # legislature id 

lapply(l, FUN = function(x) { 
    print(data <- paste(b, x, "documents/index-dossier.asp", sep = "/")) 

    # scrape 
    data <- getURL(data); data <- readLines(tc <- textConnection(data)); close(tc) 
    data <- unlist(str_extract_all(data, "dossiers/[[:alnum:]_-]+.asp")) 
    data <- paste(b, x, data, sep = "/") 
    data <- getURL(data) 
    write.table(data,file=n <- paste("raw_an",x,".txt",sep="")); str(n) 
}) 

Có cách nào để tối ưu hóa các chức năng getURL() đây? Tôi không thể sử dụng tải xuống đồng thời bằng cách chuyển tùy chọn async=TRUE, tùy chọn này mang lại cho tôi cùng một lỗi mỗi lần:

Error in function (type, msg, asError = TRUE) : 
Failed to connect to 0.0.0.12: No route to host 

Bất kỳ ý tưởng nào? Cảm ơn!

+1

'async = TRUE' đã là mặc định nếu bạn cho nhiều URL - nhưng mở hơn 500 kết nối đồng thời với cùng website có thể không phải là một ý tưởng tốt ... –

+0

Được rồi. Vâng, tôi không thể thay đổi nhiều như thế nào 'getURL()' hoạt động cho đến nay. –

Trả lời

1

Hãy thử mclapply {} đa lõi thay vì lapply.

"mclapply là một phiên bản song song của lapply, nó sẽ trả về một danh sách các chiều dài tương tự như X, mỗi phần tử trong số đó là kết quả của việc áp dụng FUN tới phần tử tương ứng của X." (http://www.rforge.net/doc/packages/multicore/mclapply.html)

Nếu điều đó không hiệu quả, bạn có thể có hiệu suất tốt hơn bằng gói XML. Các hàm như xmlTreeParse sử dụng gọi không đồng bộ.

"Lưu ý xmlTreeParse mà không cho phép một phong cách lai chế biến mà cho phép chúng ta áp dụng để xử lý các nút trong cây như họ đang được chuyển đổi sang các đối tượng R. Đây là một phong cách hướng sự kiện hoặc không đồng bộ gọi điện thoại. " (http://www.inside-r.org/packages/cran/XML/docs/xmlEventParse)

+0

Đẹp! Tôi không biết 'mclapply' nhưng đó là một gợi ý hay. Kể từ khi tôi hỏi câu hỏi, tôi phát hiện ra tùy chọn thứ hai của bạn (sử dụng 'XML' thay vì' getURL'), và nó hoạt động rất tốt. Theo ý kiến ​​của bạn, nó sẽ được overkill để song song một vòng lặp mà tôi phân tích HTML với 'htmlParse'? –

+0

Điều đó có thể sẽ xóa dữ liệu nhanh hơn, nhưng việc viết mã có thể mất thời gian nếu tốc độ tăng của bạn không đáng kể. Nó phụ thuộc vào kích thước của tập dữ liệu của bạn. – rsoren

+0

Nó không đủ lớn để biện minh cho điều đó. Cảm ơn :) –

-4

Tại sao nên sử dụng R? Đối với công việc cạo lớn, bạn nên sử dụng một cái gì đó đã được phát triển cho công việc. Tôi đã có kết quả tốt với Down Them All, một trình duyệt bổ sung vào. Chỉ cần cho nó biết bắt đầu từ đâu, làm thế nào để đi sâu, những gì mô hình để làm theo, và nơi để đổ HTML.

Sau đó sử dụng R để đọc dữ liệu từ tệp HTML. Ưu điểm lớn - những tiện ích này được phát triển đặc biệt cho nhiệm vụ để chúng sẽ thực hiện nhiều lượt tải xuống (có thể điều khiển được), chúng sẽ gửi tiêu đề phù hợp để câu hỏi tiếp theo của bạn sẽ không 'làm cách nào để đặt chuỗi tác nhân người dùng với RCurl? ', và họ có thể đối phó với việc thử lại khi một số tải xuống không thành công, điều mà họ chắc chắn sẽ làm. Tất nhiên những bất lợi là bạn không thể dễ dàng bắt đầu quá trình này tự động, trong trường hợp đó có thể bạn muốn được tốt hơn off với 'curl' trên dòng lệnh, hoặc một số tiện ích phản chiếu dòng lệnh khác.

Thành thật mà nói, bạn đã có mọi thứ tốt hơn để làm với thời gian của bạn hơn so với mã ghi trang web trong R ...

+3

Tôi sử dụng R để phân tích sau khi trích xuất dữ liệu! Tôi đang làm cho các hoạt động hoàn toàn có thể sao chép, do đó, một ứng dụng thứ ba sẽ không làm. Tôi đang mở để gợi ý với Python, ví dụ, mặc dù. –

+0

Tại sao Python không sao nhưng sử dụng 'curl' trên dòng lệnh (có thể được gọi là mẫu R qua hệ thống) không? Bạn chỉ cần thử và nhân đôi chức năng của dòng lệnh curl qua python hoặc R và đó là một nỗ lực vô nghĩa lớn. Bạn vẫn có thể sử dụng R, chỉ cần bạn làm điều đó trên các tập tin tải về và lưu. Chúc may mắn với công việc sao chép dựa trên việc cạo từ trang web ... – Spacedman

+4

Ồ, 'curl' sẽ làm. Có một đoạn mã đẹp cho Ruby và Python, và dĩ nhiên là bash. Bây giờ, R là một cách thực tế để chia sẻ mã cạo dọc theo mã thống kê, đặc biệt là đối với những người dùng không sử dụng mã thường xuyên. Đối với bản sao, đó là một trang web của quốc hội, lưu trữ của họ có xu hướng kéo dài. –

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