2009-07-23 30 views
5

Tôi đã tự hỏi liệu có thể "tự động hóa" nhiệm vụ nhập vào các mục nhập để tìm kiếm biểu mẫu và trích xuất các kết quả phù hợp từ kết quả không. Ví dụ, tôi có một danh sách các bài báo trên tạp chí mà tôi muốn nhận được DOI (số nhận dạng đối tượng kỹ thuật số); bằng tay cho điều này tôi sẽ đi đến trang tìm kiếm bài báo (ví dụ: http://pubs.acs.org/search/advanced), nhập vào tác giả/tiêu đề/âm lượng (v.v.) và sau đó tìm bài viết trong danh sách kết quả trả về và chọn DOI và dán vào danh sách tham khảo của tôi. Tôi sử dụng R và Python để phân tích dữ liệu thường xuyên (tôi được lấy cảm hứng từ một bài đăng trên RCurl) nhưng không biết nhiều về giao thức web ... là một điều có thể (ví dụ như sử dụng một cái gì đó như BeautifulSoup của Python?). Có bất kỳ tài liệu tham khảo tốt để làm bất cứ điều gì từ xa tương tự như nhiệm vụ này? Tôi chỉ quan tâm nhiều đến việc tìm hiểu về việc cào web và các công cụ cho việc cào web nói chung cũng giống như việc thực hiện công việc cụ thể này ... Cảm ơn bạn đã dành thời gian!duyệt web để điền vào (và truy xuất) các biểu mẫu tìm kiếm?

+0

bạn đã đưa ra giải pháp tốt cho vấn đề này chưa? Tôi tìm thấy điều này sau khi hỏi một câu hỏi tương tự (trùng lặp?) Tại đây http://stackoverflow.com/questions/9711539/can-i-query-the-digital-object-identifier-for-a-list-of-citations –

+0

@ David - không, xin lỗi. Đã không nhận được đủ xa với bất kỳ tùy chọn để bình luận ... – hatmatrix

Trả lời

9

Beautiful Soup là rất tốt cho phân tích webpages- đó là một nửa của những gì bạn muốn làm. Python, Perl, và Ruby đều có một phiên bản của mechanize, và đó là một nửa khác:

http://wwwsearch.sourceforge.net/mechanize/

mechanize cho phép của bạn điều khiển một trình duyệt:

# Follow a link 
browser.follow_link(link_node) 

# Submit a form 
browser.select_form(name="search") 
browser["authors"] = ["author #1", "author #2"] 
browser["volume"] = "any" 
search_response = br.submit() 

Với mechanize và Beautiful Soup bạn có một khởi đầu tuyệt vời. Một công cụ thêm tôi muốn xem xét là Firebug, như được sử dụng trong hướng dẫn ruby ​​cào nhanh chóng này:

http://www.igvita.com/2007/02/04/ruby-screen-scraper-in-60-seconds/

Firebug có thể tăng tốc độ xây dựng của bạn của XPath cho phân tích tài liệu, giúp bạn tiết kiệm một số thời gian nghiêm trọng.

Chúc may mắn!

+0

Tuyệt vời !! Cảm ơn bạn - rất hữu ích! – hatmatrix

+0

Stephen! Đánh dấu cho tôi một câu trả lời! Tôi đang đua một đồng nghiệp đến 100 điểm :-) – mixonic

+0

Tôi đang cố gắng! Tôi chỉ có một OpenID nhưng nó nói với tôi rằng tôi phải có 15 danh tiếng để bỏ phiếu lên ?? Xin lỗi, lần đầu tiên trên stackoverflow ... nó có phức tạp không? – hatmatrix

1
WebRequest req = WebRequest.Create("http://www.URLacceptingPOSTparams.com"); 

req.Proxy = null; 
req.Method = "POST"; 
req.ContentType = "application/x-www-form-urlencoded"; 

// 
// add POST data 
string reqString = "searchtextbox=webclient&searchmode=simple&OtherParam=???"; 
byte[] reqData = Encoding.UTF8.GetBytes (reqString); 
req.ContentLength = reqData.Length; 
// 
// send request 
using (Stream reqStream = req.GetRequestStream()) 
    reqStream.Write (reqData, 0, reqData.Length); 

string response; 
// 
// retrieve response 
using (WebResponse res = req.GetResponse()) 
using (Stream resSteam = res.GetResponseStream()) 
using (StreamReader sr = new StreamReader (resSteam)) 
    response = sr.ReadToEnd(); 

// use a regular expression to break apart response 
// OR you could load the HTML response page as a DOM 

(Phỏng theo Joe Albahri của "C# trong một nutshell")

+0

Cảm ơn bạn - tốt để biết điều đó là có thể! ... Tôi đoán vậy. (không quá quen thuộc với .NET, mặc dù tôi nghe nó là tất cả các cơn thịnh nộ ...) – hatmatrix

0

Có nhiều công cụ để duyệt web. Có một plugin firefox tốt được gọi là iMacros. Nó hoạt động rất tốt và không cần kiến ​​thức lập trình nào cả. Phiên bản miễn phí có thể được tải xuống tại đây: https://addons.mozilla.org/en-US/firefox/addon/imacros-for-firefox/ Điều tốt nhất về iMacros, là nó có thể giúp bạn bắt đầu sau vài phút và cũng có thể được khởi chạy từ dòng lệnh bash và cũng có thể được gọi từ bên trong các tập lệnh bash.

Một bước nâng cao hơn sẽ là webdrive selen. Lý do tôi chọn selen là nó được ghi lại một cách tuyệt vời suiting người mới bắt đầu. chỉ đọc sau page:

sẽ giúp bạn bắt đầu và chạy nhanh chóng. Selenium hỗ trợ java, python, php, c vì vậy nếu bạn đã quen với bất kỳ ngôn ngữ nào trong số này, bạn sẽ quen thuộc với tất cả các lệnh cần thiết. Tôi thích biến thể webdrive của selen, vì nó mở một trình duyệt để bạn có thể kiểm tra các trường và kết quả đầu ra. Sau khi thiết lập kịch bản bằng cách sử dụng webdrive, bạn có thể dễ dàng di chuyển tập lệnh sang IDE, do đó chạy không đầu.

Để cài đặt selen bạn có thể làm bằng cách gõ lệnh

sudo easy_install selenium 

này sẽ chăm sóc của các phụ thuộc và tất cả mọi thứ cần thiết cho bạn.

Để chạy script của bạn một cách tương tác, chỉ cần mở một terminal và gõ

python 

bạn sẽ thấy dấu nhắc python, >>> và bạn có thể gõ vào các lệnh.

Dưới đây là một số mẫu mã mà bạn có thể dán vào thiết bị đầu cuối, nó sẽ tìm kiếm google cho các loại pho mát từ

package org.openqa.selenium.example; 

import org.openqa.selenium.By; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.WebElement; 
import org.openqa.selenium.firefox.FirefoxDriver; 
import org.openqa.selenium.support.ui.ExpectedCondition; 
import org.openqa.selenium.support.ui.WebDriverWait; 

public class Selenium2Example { 
    public static void main(String[] args) { 
     // Create a new instance of the Firefox driver 
     // Notice that the remainder of the code relies on the interface, 
     // not the implementation. 
     WebDriver driver = new FirefoxDriver(); 

     // And now use this to visit Google 
     driver.get("http://www.google.com"); 
     // Alternatively the same thing can be done like this 
     // driver.navigate().to("http://www.google.com"); 

     // Find the text input element by its name 
     WebElement element = driver.findElement(By.name("q")); 

     // Enter something to search for 
     element.sendKeys("Cheese!"); 

     // Now submit the form. WebDriver will find the form for us from the element 
     element.submit(); 

     // Check the title of the page 
     System.out.println("Page title is: " + driver.getTitle()); 

     // Google's search is rendered dynamically with JavaScript. 
     // Wait for the page to load, timeout after 10 seconds 
     (new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() { 
      public Boolean apply(WebDriver d) { 
       return d.getTitle().toLowerCase().startsWith("cheese!"); 
      } 
     }); 

     // Should see: "cheese! - Google Search" 
     System.out.println("Page title is: " + driver.getTitle()); 

     //Close the browser 
     driver.quit(); 
    }} 

Tôi hy vọng rằng điều này có thể cung cấp cho bạn một khởi đầu.

Chúc mừng :)

+0

Trước tiên, bạn đang yêu cầu người dùng cài đặt Ứng dụng khách Selenium cho Python; nhưng ví dụ mã của bạn là mã Java. Điều này là khó hiểu. – knb

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