2012-02-15 15 views
10

GoalR lãm HTML khác nhau (khi so sánh với trình duyệt web) cho cùng một URL Google Search

Tôi muốn sử dụng R để tải về HTML của trang web Google Search như trong một trình duyệt web.

Vấn đề

Khi tôi tải về HTML Tìm kiếm trang web của Google trong R, sử dụng URL chính xác tương tự từ các trình duyệt web, tôi đã nhận thấy rằng R tải về HTML là khác nhau đối với trình duyệt web HTML ví dụ đối với URL tìm kiếm nâng cao của Google, tham số ngày bị bỏ qua trong HTML được đọc bởi R trong khi trong trình duyệt web được giữ lại.

Ví dụ

tôi làm tìm kiếm trên Google trong trình duyệt web của tôi cho "Tây hát End" và chỉ định một phạm vi ngày 1 Tháng một - 31 Tháng một 2012. Sau đó tôi sao chép URL được tạo ra và dán nó vào R

# Google Search URL from Firefox web browser 
url <- "http://www.google.co.uk/search?q=west+end+theatre&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-GB:official&client=firefox-a#q=west+end+theatre&hl=en&client=firefox-a&hs=z7I&rls=org.mozilla:en-GB%3Aofficial&prmd=imvns&sa=X&ei=rJE7T8fwM82WhQe_6eD2CQ&ved=0CGoQpwUoBw&source=lnt&tbs=cdr:1%2Ccd_min%3A1%2F1%2F2012%2Ccd_max%3A31%2F1%2F2012&tbm=&bav=on.2,or.r_gc.r_pw.r_qf.,cf.osb&fp=6f92152f78004c6d&biw=1600&bih=810" 
u <- URLdecode(url) 

# Webpage as seen in browser 
browseURL(u) 

# Webpage as seen from R 
HTML <- paste(readLines(u), collapse = "\n") 
cat(HTML, file = "output01.html") 
shell.exec("output01.html") 

# Webpage as seen from R through RCurl 
library(RCurl) 
cookie = 'cookiefile.txt' 
curl = getCurlHandle(cookiefile = cookie, 
        useragent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en - US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6", 
        header = FALSE, 
        verbose = TRUE, 
        netrc = TRUE, 
        maxredirs = as.integer(20), 
        followlocation = TRUE, 
        ssl.verifypeer = TRUE, 
        cainfo = system.file("CurlSSL", "cacert.pem", package = "RCurl")) 
HTML2 <- getURL(u, curl = curl) 
cat(HTML2, file = "output02.html") 
shell.exec("output02.html") 

bằng cách chạy mã khép kín. trên, chúng tôi có thể thấy rằng trang web đầu tiên mở ra là những gì tôi muốn (với tham số ngày có hiệu lực) nhưng các trang web thứ hai và thứ ba mà mở (như tải về thông qua R) có tham số ngày bị bỏ qua.

Câu hỏi

Làm thế nào tôi có thể tải về mã HTML cho trang web đầu tiên mở ra thay vì các trang web thứ ba/thứ hai?

Hệ thống thông tin

> sessionInfo() 
R version 2.14.0 (2011-10-31) 
Platform: x86_64-pc-mingw32/x64 (64-bit) 

locale: 
[1] LC_COLLATE=English_United Kingdom.1252 LC_CTYPE=English_United Kingdom.1252 LC_MONETARY=English_United Kingdom.1252 LC_NUMERIC=C       
[5] LC_TIME=English_United Kingdom.1252  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] RCurl_1.6-10.1 bitops_1.0-4.1 

loaded via a namespace (and not attached): 
[1] tools_2.14.0 
+0

URLDecode trước khi thực hiện yêu cầu có cần thiết không? –

+0

@MattBridges Thật không may là có. Ví dụ: sau đây sản xuất các trang web khác nhau, dựa trên mã ở trên, khi được nhập vào R: browseURL (url); browseURL (u) –

+1

Tôi tin rằng Google sử dụng AJAX để tải lại kết quả với các tùy chọn lọc được bật. 'readLines' và' getURL' lấy trang trước kết quả của bất kỳ cuộc gọi AJAX nào. – jbaums

Trả lời

2

Thay vì cố gắng để giải mã các kết quả của các trang tìm kiếm của Google, bạn chỉ có thể sử dụng Custom Search API. Sau khi nhận được khóa API, bạn sẽ có thể chỉ định tiêu chí tìm kiếm của mình thông qua URL và nhận tệp JSON thay vì phải giải mã HTML. Gói rjson sẽ giúp bạn đọc tệp JSON thành đối tượng R và trích xuất dữ liệu có liên quan.

Bạn sẽ bị giới hạn trong 1000 truy vấn mỗi ngày nhưng có thể dễ dàng hơn để làm việc.

CHỈNH SỬA: Đáng chú ý, API tìm kiếm tùy chỉnh đã không được dùng nữa.

+0

Đây là lý thuyết một sugestion tốt và cái gì mà tôi đã xem xét Tuy nhiên, vấn đề chính của tôi với API tìm kiếm tùy chỉnh của Google là nó không nhất quán với kết quả trả về từ, ví dụ: google.com là hơi khó chịu. Để báo cho Google "kết quả của bạn không phù hợp với kết quả được Google Web Search trả về" - tham chiếu: http://www.google.com/support/customsearch/bin/answer.py?hl=vi&answer=141877 –

+0

Nghe có vẻ như vậy liên kết đang nói cụ thể về việc tìm kiếm các trang cụ thể, hãy thử [API tìm kiếm web] không được dùng nữa (https://developers.google.com/web-search/) để tìm kiếm trên toàn bộ web. – blahdiblah

+0

Đó là một ý tưởng thú vị để làm việc với API đó, nhưng với tình trạng mất giá của nó, tôi sẽ do dự khi đầu tư thời gian vào nó. Một giải pháp hẹn giờ dài mạnh mẽ hơn là cần thiết ở đây (mặc dù tôi đã hoàn toàn đánh một bức tường gạch trên cái này nếu tôi thành thật vì tôi cảm thấy khó hiểu các gói R spidermonkey và RFirefox trên omegahat.com trông đầy hứa hẹn). –

2

Một phần vấn đề của bạn là Google has profiled you và đang trả về kết quả phù hợp dựa trên những gì nó biết từ các tìm kiếm trước đó của bạn, thảo luận gmail, sử dụng bản đồ google, địa chỉ IP, dữ liệu vị trí, quảng cáo đã xem, danh bạ xã hội và các dịch vụ khác. Một số điều này xảy ra ngay cả khi bạn không có tài khoản google.

Signed-in cá nhân: Khi bạn đã đăng nhập vào tài khoản Google với Lịch sử Web, Google cá nhân trải nghiệm tìm kiếm của bạn dựa trên những gì bạn đã tìm kiếm và các trang web bạn đã truy cập trong quá khứ.

Signed-out cá nhân: Khi bạn không đăng nhập, Google tùy chỉnh trải nghiệm tìm kiếm của bạn dựa trên thông tin tìm kiếm trước liên quan đến trình duyệt của bạn, sử dụng cookie. Google lưu trữ tối đa 180 ngày tìm kiếm đã đăng xuất hoạt động được liên kết với cookie của trình duyệt của bạn, bao gồm truy vấn và kết quả bạn nhấp vào.

Cách duy nhất để làm cho kết quả tự động phù hợp với kết quả thủ công của bạn là thử và khớp với hồ sơ của bạn. Ít nhất bạn nên thử gửi cùng một chuỗi User-Agent như trình duyệt của bạn và các cookie tương tự. Bạn có thể tìm hiểu những điều này là bằng cách đánh hơi các yêu cầu HTTP của bạn trên mạng hoặc sử dụng trình bổ sung của trình duyệt như Tiêu đề HTTP Trực tiếp.

Đối với lý do tại sao ngày được lọc Tôi nghĩ rằng jbaums bình luận bao gồm điều đó. Có một số công cụ đang diễn ra ở phía máy khách để xử lý việc lọc và kết quả trong khi bạn gõ. Có thể có một cách xung quanh điều này mặc dù nếu bạn có thể kích hoạt giao diện cũ googles trước khi các công cụ AJAX được thêm vào. Xem những gì bạn nhận được từ Google trong trình duyệt của bạn nếu bạn tắt Javascript.

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